Develop
This commit is contained in:
parent
65b36707a1
commit
f1a5b30650
106
index.html
106
index.html
@ -60,7 +60,7 @@
|
|||||||
max-width: 560px;
|
max-width: 560px;
|
||||||
padding: 0 32px;
|
padding: 0 32px;
|
||||||
}
|
}
|
||||||
.splash-screen img {
|
/* .splash-screen img {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
animation-name: loading;
|
animation-name: loading;
|
||||||
animation-duration: 3s;
|
animation-duration: 3s;
|
||||||
@ -75,6 +75,103 @@
|
|||||||
transform: scale(1);
|
transform: scale(1);
|
||||||
opacity: 100%;
|
opacity: 100%;
|
||||||
}
|
}
|
||||||
|
} */
|
||||||
|
.loader {
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
bottom: 0;
|
||||||
|
right: 0;
|
||||||
|
margin: auto;
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
animation: loader-1-1 4.8s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-container {
|
||||||
|
position: absolute;
|
||||||
|
/* position: relative; */
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader.loader__black span::after {
|
||||||
|
border-color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader.loader__white span::after {
|
||||||
|
border-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader.loader__red span::after {
|
||||||
|
border-color: #ff2c57;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes loader-1-1 {
|
||||||
|
0% {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader span {
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
bottom: 0;
|
||||||
|
right: 0;
|
||||||
|
margin: auto;
|
||||||
|
height: 32px;
|
||||||
|
width: 32px;
|
||||||
|
clip: rect(0, 32px, 32px, 16px);
|
||||||
|
animation: loader-1-2 1.2s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes loader-1-2 {
|
||||||
|
0% {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: rotate(220deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader span::after {
|
||||||
|
position: absolute;
|
||||||
|
box-sizing: border-box;
|
||||||
|
content: "";
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
bottom: 0;
|
||||||
|
right: 0;
|
||||||
|
margin: auto;
|
||||||
|
height: 32px;
|
||||||
|
width: 32px;
|
||||||
|
clip: rect(0, 32px, 32px, 16px);
|
||||||
|
border: 3px solid transparent;
|
||||||
|
border-radius: 50%;
|
||||||
|
animation: loader-1-3 1.2s cubic-bezier(0.77, 0, 0.175, 1) infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes loader-1-3 {
|
||||||
|
0% {
|
||||||
|
transform: rotate(-140deg);
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
transform: rotate(-160deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: rotate(140deg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
@ -220,7 +317,12 @@
|
|||||||
<!-- End Google Tag Manager (noscript) -->
|
<!-- End Google Tag Manager (noscript) -->
|
||||||
<div id="root">
|
<div id="root">
|
||||||
<div class="splash-screen">
|
<div class="splash-screen">
|
||||||
<img src="/leo.webp" alt="Aura - Energy of your Horoscope" />
|
<!-- <img src="/leo.webp" alt="Aura - Energy of your Horoscope" /> -->
|
||||||
|
<div class="loader-container">
|
||||||
|
<div class="loader loader__black">
|
||||||
|
<span></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script type="module" src="/src/main.ts"></script>
|
<script type="module" src="/src/main.ts"></script>
|
||||||
|
|||||||
141
package-lock.json
generated
141
package-lock.json
generated
@ -37,6 +37,7 @@
|
|||||||
"react-slick": "^0.30.2",
|
"react-slick": "^0.30.2",
|
||||||
"sass": "^1.77.6",
|
"sass": "^1.77.6",
|
||||||
"slick-carousel": "^1.8.1",
|
"slick-carousel": "^1.8.1",
|
||||||
|
"socket.io-client": "^4.8.1",
|
||||||
"unique-names-generator": "^4.7.1",
|
"unique-names-generator": "^4.7.1",
|
||||||
"yandex-metrica-ab-react": "^1.6.1"
|
"yandex-metrica-ab-react": "^1.6.1"
|
||||||
},
|
},
|
||||||
@ -1509,6 +1510,11 @@
|
|||||||
"react": ">=16.8.0"
|
"react": ">=16.8.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@socket.io/component-emitter": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="
|
||||||
|
},
|
||||||
"node_modules/@stripe/react-stripe-js": {
|
"node_modules/@stripe/react-stripe-js": {
|
||||||
"version": "2.3.1",
|
"version": "2.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/@stripe/react-stripe-js/-/react-stripe-js-2.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/@stripe/react-stripe-js/-/react-stripe-js-2.3.1.tgz",
|
||||||
@ -2547,7 +2553,6 @@
|
|||||||
"version": "4.3.4",
|
"version": "4.3.4",
|
||||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
|
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
|
||||||
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
|
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
|
||||||
"devOptional": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ms": "2.1.2"
|
"ms": "2.1.2"
|
||||||
},
|
},
|
||||||
@ -2723,6 +2728,26 @@
|
|||||||
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
|
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
|
||||||
"optional": true
|
"optional": true
|
||||||
},
|
},
|
||||||
|
"node_modules/engine.io-client": {
|
||||||
|
"version": "6.6.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.2.tgz",
|
||||||
|
"integrity": "sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw==",
|
||||||
|
"dependencies": {
|
||||||
|
"@socket.io/component-emitter": "~3.1.0",
|
||||||
|
"debug": "~4.3.1",
|
||||||
|
"engine.io-parser": "~5.2.1",
|
||||||
|
"ws": "~8.17.1",
|
||||||
|
"xmlhttprequest-ssl": "~2.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/engine.io-parser": {
|
||||||
|
"version": "5.2.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
|
||||||
|
"integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/enquire.js": {
|
"node_modules/enquire.js": {
|
||||||
"version": "2.1.6",
|
"version": "2.1.6",
|
||||||
"resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz",
|
"resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz",
|
||||||
@ -4036,8 +4061,7 @@
|
|||||||
"node_modules/ms": {
|
"node_modules/ms": {
|
||||||
"version": "2.1.2",
|
"version": "2.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||||
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
|
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
||||||
"devOptional": true
|
|
||||||
},
|
},
|
||||||
"node_modules/nan": {
|
"node_modules/nan": {
|
||||||
"version": "2.20.0",
|
"version": "2.20.0",
|
||||||
@ -4950,6 +4974,32 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "0BSD"
|
"license": "0BSD"
|
||||||
},
|
},
|
||||||
|
"node_modules/socket.io-client": {
|
||||||
|
"version": "4.8.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz",
|
||||||
|
"integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"@socket.io/component-emitter": "~3.1.0",
|
||||||
|
"debug": "~4.3.2",
|
||||||
|
"engine.io-client": "~6.6.1",
|
||||||
|
"socket.io-parser": "~4.2.4"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/socket.io-parser": {
|
||||||
|
"version": "4.2.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
|
||||||
|
"integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
|
||||||
|
"dependencies": {
|
||||||
|
"@socket.io/component-emitter": "~3.1.0",
|
||||||
|
"debug": "~4.3.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/source-map": {
|
"node_modules/source-map": {
|
||||||
"version": "0.5.7",
|
"version": "0.5.7",
|
||||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
|
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
|
||||||
@ -5380,6 +5430,34 @@
|
|||||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
|
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
|
||||||
"devOptional": true
|
"devOptional": true
|
||||||
},
|
},
|
||||||
|
"node_modules/ws": {
|
||||||
|
"version": "8.17.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
|
||||||
|
"integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"bufferutil": "^4.0.1",
|
||||||
|
"utf-8-validate": ">=5.0.2"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"bufferutil": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"utf-8-validate": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/xmlhttprequest-ssl": {
|
||||||
|
"version": "2.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz",
|
||||||
|
"integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.4.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/yallist": {
|
"node_modules/yallist": {
|
||||||
"version": "3.1.1",
|
"version": "3.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
|
||||||
@ -6332,6 +6410,11 @@
|
|||||||
"integrity": "sha512-FtzjZTJTLFN9A0mcJk7dXgYHFlGVPXW/EJooSVbe2dHU5hAi5rFk0ODimB7pHeHoDIUin5zE1NDtU2eY6olwlA==",
|
"integrity": "sha512-FtzjZTJTLFN9A0mcJk7dXgYHFlGVPXW/EJooSVbe2dHU5hAi5rFk0ODimB7pHeHoDIUin5zE1NDtU2eY6olwlA==",
|
||||||
"requires": {}
|
"requires": {}
|
||||||
},
|
},
|
||||||
|
"@socket.io/component-emitter": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="
|
||||||
|
},
|
||||||
"@stripe/react-stripe-js": {
|
"@stripe/react-stripe-js": {
|
||||||
"version": "2.3.1",
|
"version": "2.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/@stripe/react-stripe-js/-/react-stripe-js-2.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/@stripe/react-stripe-js/-/react-stripe-js-2.3.1.tgz",
|
||||||
@ -7012,7 +7095,6 @@
|
|||||||
"version": "4.3.4",
|
"version": "4.3.4",
|
||||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
|
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
|
||||||
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
|
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
|
||||||
"devOptional": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"ms": "2.1.2"
|
"ms": "2.1.2"
|
||||||
}
|
}
|
||||||
@ -7144,6 +7226,23 @@
|
|||||||
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
|
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
|
||||||
"optional": true
|
"optional": true
|
||||||
},
|
},
|
||||||
|
"engine.io-client": {
|
||||||
|
"version": "6.6.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.2.tgz",
|
||||||
|
"integrity": "sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw==",
|
||||||
|
"requires": {
|
||||||
|
"@socket.io/component-emitter": "~3.1.0",
|
||||||
|
"debug": "~4.3.1",
|
||||||
|
"engine.io-parser": "~5.2.1",
|
||||||
|
"ws": "~8.17.1",
|
||||||
|
"xmlhttprequest-ssl": "~2.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"engine.io-parser": {
|
||||||
|
"version": "5.2.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
|
||||||
|
"integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q=="
|
||||||
|
},
|
||||||
"enquire.js": {
|
"enquire.js": {
|
||||||
"version": "2.1.6",
|
"version": "2.1.6",
|
||||||
"resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz",
|
"resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz",
|
||||||
@ -8126,8 +8225,7 @@
|
|||||||
"ms": {
|
"ms": {
|
||||||
"version": "2.1.2",
|
"version": "2.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||||
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
|
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
||||||
"devOptional": true
|
|
||||||
},
|
},
|
||||||
"nan": {
|
"nan": {
|
||||||
"version": "2.20.0",
|
"version": "2.20.0",
|
||||||
@ -8732,6 +8830,26 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"socket.io-client": {
|
||||||
|
"version": "4.8.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz",
|
||||||
|
"integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==",
|
||||||
|
"requires": {
|
||||||
|
"@socket.io/component-emitter": "~3.1.0",
|
||||||
|
"debug": "~4.3.2",
|
||||||
|
"engine.io-client": "~6.6.1",
|
||||||
|
"socket.io-parser": "~4.2.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"socket.io-parser": {
|
||||||
|
"version": "4.2.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
|
||||||
|
"integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
|
||||||
|
"requires": {
|
||||||
|
"@socket.io/component-emitter": "~3.1.0",
|
||||||
|
"debug": "~4.3.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"source-map": {
|
"source-map": {
|
||||||
"version": "0.5.7",
|
"version": "0.5.7",
|
||||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
|
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
|
||||||
@ -9028,6 +9146,17 @@
|
|||||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
|
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
|
||||||
"devOptional": true
|
"devOptional": true
|
||||||
},
|
},
|
||||||
|
"ws": {
|
||||||
|
"version": "8.17.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
|
||||||
|
"integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
|
||||||
|
"requires": {}
|
||||||
|
},
|
||||||
|
"xmlhttprequest-ssl": {
|
||||||
|
"version": "2.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz",
|
||||||
|
"integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ=="
|
||||||
|
},
|
||||||
"yallist": {
|
"yallist": {
|
||||||
"version": "3.1.1",
|
"version": "3.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
|
||||||
|
|||||||
@ -44,6 +44,7 @@
|
|||||||
"react-slick": "^0.30.2",
|
"react-slick": "^0.30.2",
|
||||||
"sass": "^1.77.6",
|
"sass": "^1.77.6",
|
||||||
"slick-carousel": "^1.8.1",
|
"slick-carousel": "^1.8.1",
|
||||||
|
"socket.io-client": "^4.8.1",
|
||||||
"unique-names-generator": "^4.7.1",
|
"unique-names-generator": "^4.7.1",
|
||||||
"yandex-metrica-ab-react": "^1.6.1"
|
"yandex-metrica-ab-react": "^1.6.1"
|
||||||
},
|
},
|
||||||
|
|||||||
BIN
public/chats/Customer2.webp
Normal file
BIN
public/chats/Customer2.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.0 KiB |
BIN
public/chats/Customer8.webp
Normal file
BIN
public/chats/Customer8.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1014 B |
BIN
public/chats/big_check.webp
Normal file
BIN
public/chats/big_check.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.2 KiB |
BIN
public/chats/email-consent.webp
Normal file
BIN
public/chats/email-consent.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.9 KiB |
@ -1,184 +1,250 @@
|
|||||||
{
|
{
|
||||||
"next": "Next",
|
"next": "Weiter",
|
||||||
|
"privacy_policy": "Indem Sie fortfahren, stimmen Sie unserem <eulaLink> und unserer <privacyLink> zu. Haben Sie eine Frage? Unser Supportteam erreichen Sie <clickHere>",
|
||||||
|
"eula_link": "EULA",
|
||||||
|
"privacy_notice": "Datenschutzerklärung",
|
||||||
|
"policy_here": "hier",
|
||||||
|
"thumb": "Daumen",
|
||||||
|
"index_finger": "Zeigefinger",
|
||||||
|
"middle_finger": "Mittelfinger",
|
||||||
|
"ring_finger": "Ringfinger",
|
||||||
|
"pinky": "Kleiner Finger",
|
||||||
|
"skip_trial": "Probemonat überspringen",
|
||||||
|
"add_consultant": "Berater hinzufügen",
|
||||||
|
"add_guides": "Leitfäden hinzufügen",
|
||||||
|
"access_product": "Produkt aufrufen",
|
||||||
|
"thank_you": "Danke!",
|
||||||
|
"order_successful": "Ihre Bestellung war erfolgreich!",
|
||||||
|
"biometric_data": "Es werden keine biometrischen Daten erfasst. Alle Erkennungsprozesse erfolgen auf Ihrem Gerät.",
|
||||||
|
"went_wrong": "Etwas ist schiefgelaufen.",
|
||||||
|
"/scanned-photo": {
|
||||||
|
"title": "Wir erstellen eine umfassende Handlesung nur für Sie!",
|
||||||
|
"text": "Wow, es sieht so aus, als gäbe es viel über Ihre ehrgeizige und selbstbewusste Zukunft zu erzählen."
|
||||||
|
},
|
||||||
|
"aura_paywall_palmistry_main": {
|
||||||
|
"text_0": "Wir haben Millionen von Menschen geholfen, das Schicksal ihres Liebeslebens zu enthüllen und was die Zukunft für sie und ihre Familien bereithält.",
|
||||||
|
"text_1": "Es kostet uns 13,21 €, unsere AURA-Mitarbeiter für die Probezeit zu entschädigen, aber bitte wählen Sie den Betrag, mit dem Sie sich wohlfühlen."
|
||||||
|
},
|
||||||
|
"/skip-trial": {
|
||||||
|
"title": "Nicht vor, zurückzublicken?",
|
||||||
|
"price_per_week": "<price> pro Woche",
|
||||||
|
"billing_period": "Abrechnungsperiode",
|
||||||
|
"billed_amount": "Abgerechneter Betrag",
|
||||||
|
"billed_in_4_weeks": "Abrechnung in 4 Wochen",
|
||||||
|
"start_trial": {
|
||||||
|
"every_week": "Jede Woche",
|
||||||
|
"start_trial": "Probezeit starten"
|
||||||
|
},
|
||||||
|
"skip_trial": {
|
||||||
|
"save": "Spare <save>%",
|
||||||
|
"every_4_weeks": "Alle 4 Wochen",
|
||||||
|
"skip_trial": "Angebot annehmen und Probezeit überspringen"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/add-consultant": {
|
||||||
|
"more_for_you": "Mehr für Sie",
|
||||||
|
"exclusive_offer": "Exklusives Angebot, das Ihnen empfohlen wird, um Ihre Ziele schneller zu erreichen",
|
||||||
|
"your_unique_consultation": "Ihre einzigartige individuelle Beratung",
|
||||||
|
"30-minute": "30-minütige private Beratung mit einem Experten",
|
||||||
|
"description": "Sie können um Vorhersagen über die Zukunft bitten, Kompatibilitätsanalysen im Leben; Liebeskompatibilität etc.",
|
||||||
|
"one_time_price_offer": "Einmaliges Preisangebot: ",
|
||||||
|
"original_price": "Originalpreis: <oldPrice> <discount>",
|
||||||
|
"you_will_be_charged": "*Sie werden für die ausgewählten Zusatzleistungen oder Angebote zum Zeitpunkt des Kaufs belastet. Dies ist eine einmalige Zahlung.",
|
||||||
|
"get_my_consultation": "Beratung erhalten",
|
||||||
|
"discount_save": "Sparen",
|
||||||
|
"caution": "Achtung!",
|
||||||
|
"caution_text": "Um doppelte Abbuchungen zu vermeiden, bitte diese Seite nicht schließen oder zurückgehen.",
|
||||||
|
"unlock_profound": "Entdecken Sie tiefreichende Erkenntnisse über Ihre Persönlichkeit, Beziehungen, Karriereentwicklung und entscheidende Momente im Leben durch Astrologie, die Ihnen ermöglicht, fundierte Entscheidungen zu treffen und größere Erfüllung zu erzielen.",
|
||||||
|
"choose_from": "Wählen Sie aus über 80 Experten-Astrologen."
|
||||||
|
},
|
||||||
"/find-your-happiness": {
|
"/find-your-happiness": {
|
||||||
"title": "Find your happiness with highly-personalized predictions.",
|
"title": "Finden Sie Ihr Glück mit hochgradig personalisierten Vorhersagen.",
|
||||||
"point1": "rated by real users",
|
"point1": "bewertet von echten Nutzern",
|
||||||
"point2": "93.4% Accuracy",
|
"point2": "93,4% Genauigkeit",
|
||||||
"point3": "20m users’ choice",
|
"point3": "20 Millionen Benutzer bevorzugen es",
|
||||||
"point4": "4.8 satisfaction sco",
|
"point4": "4,8 Zufriedenheitswert",
|
||||||
"text": "Understand your self and improve relationships with astrology"
|
"text": "Verstehen Sie sich selbst und verbessern Sie Beziehungen durch Astrologie"
|
||||||
},
|
},
|
||||||
"/gender": {
|
"/gender": {
|
||||||
"title": "What’s your gender?",
|
"title": "Was ist Ihr Geschlecht?",
|
||||||
"description": "In Palmistry, everyone is a blend of masculine and feminine, so it helps to know yours."
|
"description": "In der Handlesekunst ist jeder eine Mischung aus Männlichem und Weiblichem, daher hilft es, Ihres zu kennen.",
|
||||||
|
"already_have_account": "Bereits ein Konto? Anmelden"
|
||||||
},
|
},
|
||||||
"/birthdate": {
|
"/birthdate": {
|
||||||
"title": "What’s your date of birth?",
|
"title": "Was ist Ihr Geburtsdatum?",
|
||||||
"text": "Your birth date reveals your core personality traits, needs and desires."
|
"text": "Ihr Geburtsdatum enthüllt Ihre grundlegenden Persönlichkeitsmerkmale, Bedürfnisse und Wünsche."
|
||||||
},
|
},
|
||||||
"/palms-information": {
|
"/palms-information": {
|
||||||
"title": "Your palms hold a wealth of information about your fate and personality."
|
"title": "Ihre Handflächen enthalten eine Fülle von Informationen über Ihr Schicksal und Ihre Persönlichkeit."
|
||||||
},
|
},
|
||||||
"/what-aspects": {
|
"/what-aspects": {
|
||||||
"title": "What aspects of your life do you wish to gain insight into through palmistry?",
|
"title": "In welche Lebensbereiche möchten Sie durch Handlesen Einblicke gewinnen?",
|
||||||
"answer1": "Love & Relationships",
|
"answer1": "Liebe & Beziehungen",
|
||||||
"answer2": "Health & Vitality",
|
"answer2": "Gesundheit & Vitalität",
|
||||||
"answer3": "Career & Destiny"
|
"answer3": "Karriere & Schicksal"
|
||||||
},
|
},
|
||||||
"/relationship-status": {
|
"/relationship-status": {
|
||||||
"title": "So we can get to know you better, please tell us your relationship status",
|
"title": "Um Sie besser kennenzulernen, teilen Sie uns bitte Ihren Beziehungsstatus mit",
|
||||||
"answer1": "Single",
|
"answer1": "Single",
|
||||||
"answer2": "In a relationship"
|
"answer2": "In einer Beziehung"
|
||||||
},
|
},
|
||||||
"/element-resonates": {
|
"/element-resonates": {
|
||||||
"title": "Which element resonates with you most?",
|
"title": "Welches Element spricht Sie am meisten an?",
|
||||||
"answer1": "Water",
|
"answer1": "Wasser",
|
||||||
"answer2": "Fire",
|
"answer2": "Feuer",
|
||||||
"answer3": "Air",
|
"answer3": "Luft",
|
||||||
"answer4": "Earth"
|
"answer4": "Erde"
|
||||||
},
|
},
|
||||||
"/favorite-color": {
|
"/favorite-color": {
|
||||||
"title": "Which color do you like the most?",
|
"title": "Welche Farbe mögen Sie am liebsten?",
|
||||||
"answer1": "Blue",
|
"answer1": "Blau",
|
||||||
"answer2": "Green",
|
"answer2": "Grün",
|
||||||
"answer3": "Orange",
|
"answer3": "Orange",
|
||||||
"answer4": "Violet",
|
"answer4": "Violett",
|
||||||
"answer5": "Red",
|
"answer5": "Rot",
|
||||||
"answer6": "Yellow"
|
"answer6": "Gelb"
|
||||||
},
|
},
|
||||||
"/head-or-heart": {
|
"/head-or-heart": {
|
||||||
"title": "Do you make decisions with your head or your heart?",
|
"title": "Treffen Sie Entscheidungen mit Ihrem Kopf oder Ihrem Herzen?",
|
||||||
"answer1": "Heart",
|
"answer1": "Herz",
|
||||||
"answer2": "Head",
|
"answer2": "Kopf",
|
||||||
"answer3": "Both"
|
"answer3": "Beides"
|
||||||
},
|
},
|
||||||
"/relate-following": {
|
"/relate-following": {
|
||||||
"title": "Do you relate to the following:",
|
"title": "Können Sie sich mit Folgendem identifizieren:",
|
||||||
"question1": "I find solace and comfort in spending time alone.",
|
"question1": "Ich finde in der Einsamkeit Trost und Geborgenheit.",
|
||||||
"question2": "I value and enjoy my own company.",
|
"question2": "Ich schätze und genieße meine eigene Gesellschaft.",
|
||||||
"question3": "I prefer socializing in groups rather than spending time alone.",
|
"question3": "Ich ziehe es vor, in Gruppen zu sozialisieren, anstatt Zeit allein zu verbringen.",
|
||||||
"question4": "Loneliness is something I actively try to avoid.",
|
"question4": "Einsamkeit ist etwas, das ich aktiv zu vermeiden versuche.",
|
||||||
"question5": "I enjoy activities that I can do independently.",
|
"question5": "Ich genieße Aktivitäten, die ich unabhängig durchführen kann.",
|
||||||
"strongly_agree": "Strongly Agree",
|
"strongly_agree": "Stimme voll zu",
|
||||||
"strongly_disagree": "Strongly Disagree"
|
"strongly_disagree": "Stimme überhaupt nicht zu"
|
||||||
},
|
},
|
||||||
"/let-scan": {
|
"/let-scan": {
|
||||||
"title": "Let`s scan your palms",
|
"title": "Lassen Sie uns Ihre Handflächen scannen",
|
||||||
"text": "Follow the on-screen instructions, so we can analyze your palm lines and reveal your future, and the secrets of your destiny!"
|
"text": "Folgen Sie den Anweisungen auf dem Bildschirm, damit wir Ihre Handlinien analysieren und Ihre Zukunft sowie die Geheimnisse Ihres Schicksals enthüllen können!"
|
||||||
},
|
},
|
||||||
"biometric_data": "No biometric data collected. All recognition process performs on your device.",
|
|
||||||
"/scan-instruction": {
|
"/scan-instruction": {
|
||||||
"title": "Take your palm picture as instructed",
|
"title": "Machen Sie Ihr Handflächenfoto gemäß den Anweisungen",
|
||||||
"button": "Take a picture now"
|
"button": "Jetzt ein Foto machen"
|
||||||
},
|
},
|
||||||
"/email": {
|
"/email": {
|
||||||
"title": "Enter your email to get your advanced Palmistry reading with AURA",
|
"title": "Geben Sie Ihre E-Mail-Adresse ein, um Ihre fortgeschrittene Handlesung mit AURA zu erhalten",
|
||||||
"not_share": "We don’t share any personal information.",
|
"not_share": "Wir geben keine persönlichen Informationen weiter.",
|
||||||
"placeholder_email": "Ihre E-Mail",
|
"placeholder_email": "Ihre E-Mail",
|
||||||
"placeholder_name": "Ihr Name"
|
"placeholder_name": "Ihr Name"
|
||||||
},
|
},
|
||||||
"went_wrong": "Something went wrong.",
|
|
||||||
"app_number_one": {
|
"app_number_one": {
|
||||||
"text": "The <color> app trusted by over 25 million people.",
|
"text": "Die <color> App, der über 25 Millionen Menschen vertrauen.",
|
||||||
"color": "#1 Astrology"
|
"color": "#1 Astrologie"
|
||||||
},
|
},
|
||||||
"/trial-payment": {
|
"/trial-payment": {
|
||||||
"palm_is_ready": {
|
"palm_is_ready": {
|
||||||
"title": "Your Palm Reading <color>",
|
"title": "Ihre Handlesung <color>",
|
||||||
"title_color": "Is Ready",
|
"title_color": "ist bereit",
|
||||||
"description": "“I’ve just received your palm scan results. Let’s discuss!”",
|
"description": "„Ich habe gerade Ihre Ergebnisse des Handscans erhalten. Lassen Sie uns darüber sprechen!“",
|
||||||
"text1": "<color> 6 years in palmistry readings and spiritual guidance.",
|
"text1": "<color> 6 Jahre Erfahrung in Handlesungen und spiritueller Beratung.",
|
||||||
"text1_color": "Akho",
|
"text1_color": "Akho",
|
||||||
"text2": "Choose from 80+ palm readers and astrologers."
|
"text2": "Wählen Sie aus über 80 Handlesern und Astrologen."
|
||||||
},
|
},
|
||||||
"joined_today": {
|
"joined_today": {
|
||||||
"text1": "Unlimited chats with a palm reader",
|
"text1": "Unbegrenzte Chats mit einem Handleser",
|
||||||
"text2": "<count> people joined today"
|
"text2": "<count> Personen haben sich heute angeschlossen"
|
||||||
},
|
},
|
||||||
"get_personal_prediction": "Get personal prediction",
|
"get_personal_prediction": "Persönliche Vorhersage erhalten",
|
||||||
"how_work": {
|
"how_work": {
|
||||||
"title": "How does AURA work?",
|
"title": "Wie funktioniert AURA?",
|
||||||
"point1_title": "Send us your palm scan",
|
"point1_title": "Senden Sie uns Ihren Handscan",
|
||||||
"point1_text": "We analyze your palm lines to get hints about your future",
|
"point1_text": "Wir analysieren Ihre Handlinien, um Hinweise auf Ihre Zukunft zu erhalten",
|
||||||
"point2_title": "Your palm reading is generated",
|
"point2_title": "Ihre Handlesung wird erstellt",
|
||||||
"point2_text": "One of our professional palm readers puts together a report filled with hints about your future",
|
"point2_text": "Einer unserer professionellen Handleser erstellt einen Bericht voller Hinweise auf Ihre Zukunft",
|
||||||
"point3_title": "Start your trial to receive your prediction",
|
"point3_title": "Starten Sie Ihre Probezeit, um Ihre Vorhersage zu erhalten",
|
||||||
"point3_text": "Once you’re a AURA member, we’ll send over your prediction report so you can begin living a better life.",
|
"point3_text": "Sobald Sie AURA-Mitglied sind, senden wir Ihnen Ihren Vorhersagebericht, damit Sie ein besseres Leben beginnen können.",
|
||||||
"point4_title": "Talk with a palm reading specialist anytime",
|
"point4_title": "Sprechen Sie jederzeit mit einem Handlese-Spezialisten",
|
||||||
"point4_text": "Get ongoing support by discussing your readings, personal horoscopes, and compatibilities with our expert team."
|
"point4_text": "Holen Sie sich kontinuierliche Unterstützung, indem Sie Ihre Lesungen, persönlichen Horoskope und Kompatibilitäten mit unserem Expertenteam diskutieren."
|
||||||
},
|
},
|
||||||
"money_back_guarantee": {
|
"money_back_guarantee": {
|
||||||
"title": "100% Money-back Guarantee",
|
"title": "100% Geld-zurück-Garantie",
|
||||||
"text": "If you don’t notice any progress after using the app for at least a week, we are ready to make a complete refund within 14 days."
|
"text": "Wenn Sie nach mindestens einwöchiger Nutzung der App keinen Fortschritt feststellen, sind wir bereit, innerhalb von 14 Tagen eine vollständige Rückerstattung vorzunehmen."
|
||||||
},
|
},
|
||||||
"begin_trial_now": "Begin Trial Now",
|
"begin_trial_now": "Jetzt Probezeit beginnen",
|
||||||
"what_included": {
|
"what_included": {
|
||||||
"title": "What’s included?",
|
"title": "Was ist enthalten?",
|
||||||
"point1": "<bold> palm readings",
|
"point1": "<bold> Handlesungen",
|
||||||
"point1_bold": "Unlimited",
|
"point1_bold": "Unbegrenzt",
|
||||||
"point2": "<bold> with professional astrologers",
|
"point2": "<bold> mit professionellen Astrologen",
|
||||||
"point2_bold": "1:1 live chats",
|
"point2_bold": "1:1 Live-Chats",
|
||||||
"point3": "<bold> readings",
|
"point3": "<bold> Lesungen",
|
||||||
"point3_bold": "Daily compatibility",
|
"point3_bold": "Tägliche Kompatibilität",
|
||||||
"point4": "Cosmic relationship tips",
|
"point4": "Kosmische Beziehungstipps",
|
||||||
"point5": "Daily horoscopes"
|
"point5": "Tägliche Horoskope"
|
||||||
},
|
},
|
||||||
"palms_say_about": {
|
"palms_say_about": {
|
||||||
"title": "What do your palms say about you?",
|
"title": "Was sagen Ihre Handflächen über Sie aus?",
|
||||||
"point1": "<color> shows your attitude to love and the quality of love",
|
"point1": "<color> zeigt Ihre Einstellung zur Liebe und die Qualität der Liebe",
|
||||||
"point1_color": "Love line",
|
"point1_color": "Liebeslinie",
|
||||||
"point2": "A long thumb indicates good fortune",
|
"point2": "Ein langer Daumen weist auf Glück hin",
|
||||||
"point3": "<color> reflects your in telligence and mentality",
|
"point3": "<color> spiegelt Ihre Intelligenz und Mentalität wider",
|
||||||
"point3_color": "Head line",
|
"point3_color": "Kopflinie",
|
||||||
"point4": "A long index finger indicates a natural leader",
|
"point4": "Ein langer Zeigefinger weist auf eine natürliche Führungspersönlichkeit hin",
|
||||||
"point5": "<color> defines the quality of your life and what you will achieve",
|
"point5": "<color> definiert die Qualität Ihres Lebens und was Sie erreichen werden",
|
||||||
"point5_color": "Life line",
|
"point5_color": "Lebenslinie",
|
||||||
"point6": "A short middle finger reveals a free spirit",
|
"point6": "Ein kurzer Mittelfinger offenbart einen freien Geist",
|
||||||
"point7": "<color> represents your material achievement and career goals",
|
"point7": "<color> repräsentiert Ihren materiellen Erfolg und Ihre Karriereziele",
|
||||||
"point7_color": "Fate line",
|
"point7_color": "Schicksalslinie",
|
||||||
"point8": "A long ring finger reveals that a person tends to take risks",
|
"point8": "Ein langer Ringfinger zeigt, dass eine Person Risiken eingeht",
|
||||||
"point9": "A short little finger indicates the person's lack of self-confidence"
|
"point9": "Ein kurzer kleiner Finger weist auf mangelndes Selbstbewusstsein hin"
|
||||||
},
|
},
|
||||||
"discover_more": "Discover More",
|
"discover_more": "Mehr entdecken",
|
||||||
"why_love": "Why does everyone <color> ?",
|
"why_love": "Warum liebt jeder <color> ?",
|
||||||
"why_love_color": "love AURA",
|
"why_love_color": "AURA",
|
||||||
"reviews": {
|
"reviews": {
|
||||||
"username1": "Rebecca Bauman",
|
"username1": "Rebecca Bauman",
|
||||||
"tagline1": "\"It’s changed my life!\"",
|
"tagline1": "\"Es hat mein Leben verändert!\"",
|
||||||
"text1": "I'm thankful for this app and Akho! She's an excellent palm reader and astrologer—clear, thorough, and reassuring. I eagerly look forward to more sessions with her!",
|
"text1": "Ich bin dankbar für diese App und Akho! Sie ist eine ausgezeichnete Handleserin und Astrologin – klar, gründlich und beruhigend. Ich freue mich auf weitere Sitzungen mit ihr!",
|
||||||
"username2": "Mika Ryan",
|
"username2": "Mika Ryan",
|
||||||
"tagline2": "\"After years of seeking, I’ve finally found a true love.\"",
|
"tagline2": "\"Nach Jahren der Suche habe ich endlich die wahre Liebe gefunden.\"",
|
||||||
"text2": "I was hesitant about whether it was really worth trying, but now I have no regrets and I'm enjoying my new relationships!",
|
"text2": "Ich war unsicher, ob es sich wirklich lohnt, es auszuprobieren, aber jetzt bereue ich es nicht und genieße meine neuen Beziehungen!",
|
||||||
"username3": "Amanda Holmes",
|
"username3": "Amanda Holmes",
|
||||||
"tagline3": "\"I’ve found a job I really enjoy.\"",
|
"tagline3": "\"Ich habe einen Job gefunden, den ich wirklich mag.\"",
|
||||||
"text3": "Thanks to Vladana, I've finally discovered a clue about what my life's purpose really is and what kind of job resonates with me better!"
|
"text3": "Dank Vladana habe ich endlich einen Hinweis darauf gefunden, was der Zweck meines Lebens wirklich ist und welche Art von Job besser zu mir passt!"
|
||||||
},
|
},
|
||||||
"success_story": "Become a AURA Success Story!",
|
"success_story": "Werden Sie eine AURA Erfolgsgeschichte!",
|
||||||
"as_seen_in": "<color> As Seen in",
|
"as_seen_in": "<color> Bekannt aus",
|
||||||
"footer": {
|
"footer": {
|
||||||
"text1": "Questions? We’re here to help",
|
"text1": "Fragen? Wir sind hier, um zu helfen",
|
||||||
"text2": "Customer Support",
|
"text2": "Kundensupport",
|
||||||
"text3": "Help Center"
|
"text3": "Hilfe-Center"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/payment": {
|
"/payment": {
|
||||||
"will_be_charged_trial_info": "<trialPrice> for your <trialDuration>-day trial",
|
"will_be_charged_trial_info": "<trialPrice> für Ihre <trialDuration>-tägige Probezeit",
|
||||||
"will_be_charged_email_reminder": "email you a reminder",
|
"will_be_charged_email_reminder": "wir senden Ihnen eine Erinnerung per E-Mail",
|
||||||
"will_be_charged": "You will be charged only <trialInfo>. Then <fullPrice> <trialPrice> per week. Save <save> every week. We’ll <emailReminder> before your trial ends.",
|
"will_be_charged": "Sie werden nur <trialInfo> belastet. Danach <fullPrice> <trialPrice> pro Woche. Sparen Sie <save> jede Woche. Wir werden <emailReminder>, bevor Ihre Probezeit endet.",
|
||||||
"payment_information": {
|
"payment_information": {
|
||||||
"personalized_offer": "Personalized offer reserved",
|
"personalized_offer": "Personalisierte Angebot reserviert",
|
||||||
"title": "Start your <trialDuration>-day trial",
|
"title": "Starten Sie Ihre <trialDuration>-tägige Probezeit",
|
||||||
"total_today": "Total today",
|
"total_today": "Heutige Gesamtsumme",
|
||||||
"code_applied_bold": "AURA24",
|
"code_applied_bold": "AURA24",
|
||||||
"code_applied": "Code <bold> applied!"
|
"code_applied": "Code <bold> angewandt!"
|
||||||
},
|
},
|
||||||
"guarantees": {
|
"guarantees": {
|
||||||
"no_commitment": "No commitment. Cancel anytime.",
|
"no_commitment": "Keine Verpflichtung. Jederzeit kündbar.",
|
||||||
"30_day_money_back": "30-Day Money-Back Guarantee"
|
"30_day_money_back": "30-Tage-Geld-zurück-Garantie"
|
||||||
},
|
},
|
||||||
"get_personal_prediction": "Get personal prediction",
|
"get_personal_prediction": "Persönliche Vorhersage erhalten",
|
||||||
"total_due": "Total due today: <trialPrice>",
|
"total_due": "Heute fällig: <trialPrice>",
|
||||||
"app_number_one_color": "25 million people.",
|
"app_number_one_color": "25 Millionen Menschen.",
|
||||||
"app_number_one": "The #1 Astrology app trusted by over <color>"
|
"app_number_one": "Die Nr. 1 Astrologie-App von über <color> vertraut"
|
||||||
}
|
},
|
||||||
}
|
"/camera": {
|
||||||
|
"bad_photo": "Schlechtes Foto!",
|
||||||
|
"try_again": "Versuchen Sie es erneut",
|
||||||
|
"do_better": "Sie können es besser machen",
|
||||||
|
"next": "Weiter"
|
||||||
|
},
|
||||||
|
"threadId": "thread_mBhmprQylVagKbh5E1Ilmz6a",
|
||||||
|
"assistantId": "asst_QG0eOafrdht3e71PIqNhJ0Os",
|
||||||
|
"v": "v1",
|
||||||
|
"config": "de.female"
|
||||||
|
}
|
||||||
@ -1,184 +1,250 @@
|
|||||||
{
|
{
|
||||||
"next": "Next",
|
"next": "Weiter",
|
||||||
|
"privacy_policy": "Indem Sie fortfahren, stimmen Sie unserer <eulaLink> und <privacyLink> zu. Haben Sie eine Frage? Kontaktieren Sie unser Support-Team <clickHere>",
|
||||||
|
"eula_link": "EULA",
|
||||||
|
"privacy_notice": "Datenschutzerklärung",
|
||||||
|
"policy_here": "hier",
|
||||||
|
"thumb": "Daumen",
|
||||||
|
"index_finger": "Zeigefinger",
|
||||||
|
"middle_finger": "Mittelfinger",
|
||||||
|
"ring_finger": "Ringfinger",
|
||||||
|
"pinky": "Kleiner Finger",
|
||||||
|
"skip_trial": "Testphase überspringen",
|
||||||
|
"add_consultant": "Berater hinzufügen",
|
||||||
|
"add_guides": "Guides hinzufügen",
|
||||||
|
"access_product": "Produktzugang",
|
||||||
|
"thank_you": "Vielen Dank!",
|
||||||
|
"order_successful": "Ihre Bestellung war erfolgreich!",
|
||||||
|
"biometric_data": "Es werden keine biometrischen Daten gesammelt. Der gesamte Erkennungsprozess erfolgt auf Ihrem Gerät.",
|
||||||
|
"went_wrong": "Etwas ist schiefgelaufen.",
|
||||||
|
"/scanned-photo": {
|
||||||
|
"title": "Wir erstellen gerade eine umfassende Handlesung speziell für Sie!",
|
||||||
|
"text": "Wow, es sieht so aus, als könnten wir viel über Ihre ehrgeizige und selbstbewusste Zukunft erzählen."
|
||||||
|
},
|
||||||
|
"aura_paywall_palmistry_main": {
|
||||||
|
"text_0": "Wir haben Millionen von Menschen geholfen, das Schicksal ihres Liebeslebens und was die Zukunft für sie und ihre Familien bereithält, zu enthüllen.",
|
||||||
|
"text_1": "Es kostet uns 13,21 €, um unsere AURA-Mitarbeiter für die Testphase zu entschädigen, aber bitte wählen Sie einen Betrag, mit dem Sie sich wohlfühlen."
|
||||||
|
},
|
||||||
|
"/skip-trial": {
|
||||||
|
"title": "Nicht vor, zurückzublicken?",
|
||||||
|
"price_per_week": "<price> pro Woche",
|
||||||
|
"billing_period": "Abrechnungszeitraum",
|
||||||
|
"billed_amount": "Berechneter Betrag",
|
||||||
|
"billed_in_4_weeks": "Berechnet in 4 Wochen",
|
||||||
|
"start_trial": {
|
||||||
|
"every_week": "Jede Woche",
|
||||||
|
"start_trial": "Testphase beginnen"
|
||||||
|
},
|
||||||
|
"skip_trial": {
|
||||||
|
"save": "sparen Sie <save>%",
|
||||||
|
"every_4_weeks": "Alle 4 Wochen",
|
||||||
|
"skip_trial": "Angebot annehmen und Testphase überspringen"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/add-consultant": {
|
||||||
|
"more_for_you": "Mehr für Sie",
|
||||||
|
"exclusive_offer": "Exklusives Angebot, das Ihnen empfohlen wird, um Ihre Ziele schneller zu erreichen",
|
||||||
|
"your_unique_consultation": "Ihre einzigartige individuelle Beratung",
|
||||||
|
"30-minute": "30-minütige private Beratung mit einem Experten",
|
||||||
|
"description": "Sie können nach Zukunftsvorhersagen, Lebenskompatibilitätsanalysen, Liebeskompatibilität usw. fragen",
|
||||||
|
"one_time_price_offer": "Einmaliges Preisangebot: ",
|
||||||
|
"original_price": "Originalpreis: <oldPrice> <discount>",
|
||||||
|
"you_will_be_charged": "*Sie werden für die ausgewählten Zusatzdienste oder -angebote zum Zeitpunkt des Kaufs belastet. Dies ist eine einmalige Zahlung.",
|
||||||
|
"get_my_consultation": "Mein Beratungsgespräch erhalten",
|
||||||
|
"discount_save": "Sparen",
|
||||||
|
"caution": "Achtung!",
|
||||||
|
"caution_text": "Um Doppelbelastungen zu vermeiden, schließen Sie bitte die Seite nicht und gehen Sie nicht zurück.",
|
||||||
|
"unlock_profound": "Entdecken Sie tiefgründige Einblicke in Ihre Persönlichkeit, Beziehungen, Karriereentwicklung und lebenswichtige Momente durch Astrologie, die Ihnen helfen, fundierte Entscheidungen zu treffen und mehr Erfüllung zu erreichen.",
|
||||||
|
"choose_from": "Wählen Sie aus über 80 Expertenastrologen."
|
||||||
|
},
|
||||||
"/find-your-happiness": {
|
"/find-your-happiness": {
|
||||||
"title": "Find your happiness with highly-personalized predictions.",
|
"title": "Finden Sie Ihr Glück mit hochgradig personalisierten Vorhersagen.",
|
||||||
"point1": "rated by real users",
|
"point1": "Bewertet von echten Nutzern",
|
||||||
"point2": "93.4% Accuracy",
|
"point2": "93,4% Genauigkeit",
|
||||||
"point3": "20m users’ choice",
|
"point3": "Wahl von 20 Mio. Nutzern",
|
||||||
"point4": "4.8 satisfaction sco",
|
"point4": "4,8 Zufriedenheitswert",
|
||||||
"text": "Understand your self and improve relationships with astrology"
|
"text": "Verstehen Sie sich selbst und verbessern Sie Beziehungen mit Astrologie"
|
||||||
},
|
},
|
||||||
"/gender": {
|
"/gender": {
|
||||||
"title": "What’s your gender?",
|
"title": "Was ist Ihr Geschlecht?",
|
||||||
"description": "In Palmistry, everyone is a blend of masculine and feminine, so it helps to know yours."
|
"description": "In der Handlesekunst ist jeder eine Mischung aus männlich und weiblich, daher ist es hilfreich, Ihr eigenes zu kennen.",
|
||||||
|
"already_have_account": "Schon ein Konto? Anmelden"
|
||||||
},
|
},
|
||||||
"/birthdate": {
|
"/birthdate": {
|
||||||
"title": "What’s your date of birth?",
|
"title": "Wann ist Ihr Geburtsdatum?",
|
||||||
"text": "Your birth date reveals your core personality traits, needs and desires."
|
"text": "Ihr Geburtsdatum offenbart Ihre grundlegenden Persönlichkeitsmerkmale, Bedürfnisse und Wünsche."
|
||||||
},
|
},
|
||||||
"/palms-information": {
|
"/palms-information": {
|
||||||
"title": "Your palms hold a wealth of information about your fate and personality."
|
"title": "Ihre Handflächen bergen eine Fülle von Informationen über Ihr Schicksal und Ihre Persönlichkeit."
|
||||||
},
|
},
|
||||||
"/what-aspects": {
|
"/what-aspects": {
|
||||||
"title": "What aspects of your life do you wish to gain insight into through palmistry?",
|
"title": "In welche Lebensbereiche möchten Sie durch Handlesen Einblicke gewinnen?",
|
||||||
"answer1": "Love & Relationships",
|
"answer1": "Liebe & Beziehungen",
|
||||||
"answer2": "Health & Vitality",
|
"answer2": "Gesundheit & Vitalität",
|
||||||
"answer3": "Career & Destiny"
|
"answer3": "Karriere & Schicksal"
|
||||||
},
|
},
|
||||||
"/relationship-status": {
|
"/relationship-status": {
|
||||||
"title": "So we can get to know you better, please tell us your relationship status",
|
"title": "Damit wir Sie besser kennenlernen können, teilen Sie uns bitte Ihren Beziehungsstatus mit",
|
||||||
"answer1": "Single",
|
"answer1": "Single",
|
||||||
"answer2": "In a relationship"
|
"answer2": "In einer Beziehung"
|
||||||
},
|
},
|
||||||
"/element-resonates": {
|
"/element-resonates": {
|
||||||
"title": "Which element resonates with you most?",
|
"title": "Welches Element spricht Sie am meisten an?",
|
||||||
"answer1": "Water",
|
"answer1": "Wasser",
|
||||||
"answer2": "Fire",
|
"answer2": "Feuer",
|
||||||
"answer3": "Air",
|
"answer3": "Luft",
|
||||||
"answer4": "Earth"
|
"answer4": "Erde"
|
||||||
},
|
},
|
||||||
"/favorite-color": {
|
"/favorite-color": {
|
||||||
"title": "Which color do you like the most?",
|
"title": "Welche Farbe gefällt Ihnen am meisten?",
|
||||||
"answer1": "Blue",
|
"answer1": "Blau",
|
||||||
"answer2": "Green",
|
"answer2": "Grün",
|
||||||
"answer3": "Orange",
|
"answer3": "Orange",
|
||||||
"answer4": "Violet",
|
"answer4": "Violett",
|
||||||
"answer5": "Red",
|
"answer5": "Rot",
|
||||||
"answer6": "Yellow"
|
"answer6": "Gelb"
|
||||||
},
|
},
|
||||||
"/head-or-heart": {
|
"/head-or-heart": {
|
||||||
"title": "Do you make decisions with your head or your heart?",
|
"title": "Treffen Sie Entscheidungen mit dem Kopf oder dem Herzen?",
|
||||||
"answer1": "Heart",
|
"answer1": "Herz",
|
||||||
"answer2": "Head",
|
"answer2": "Kopf",
|
||||||
"answer3": "Both"
|
"answer3": "Beides"
|
||||||
},
|
},
|
||||||
"/relate-following": {
|
"/relate-following": {
|
||||||
"title": "Do you relate to the following:",
|
"title": "Können Sie sich mit Folgendem identifizieren:",
|
||||||
"question1": "I find solace and comfort in spending time alone.",
|
"question1": "Ich finde Trost und Geborgenheit darin, Zeit allein zu verbringen.",
|
||||||
"question2": "I value and enjoy my own company.",
|
"question2": "Ich schätze und genieße meine eigene Gesellschaft.",
|
||||||
"question3": "I prefer socializing in groups rather than spending time alone.",
|
"question3": "Ich ziehe es vor, in Gruppen zu sozialisieren, anstatt allein Zeit zu verbringen.",
|
||||||
"question4": "Loneliness is something I actively try to avoid.",
|
"question4": "Einsamkeit ist etwas, das ich aktiv zu vermeiden versuche.",
|
||||||
"question5": "I enjoy activities that I can do independently.",
|
"question5": "Ich genieße Aktivitäten, die ich selbstständig machen kann.",
|
||||||
"strongly_agree": "Strongly Agree",
|
"strongly_agree": "Stimme voll zu",
|
||||||
"strongly_disagree": "Strongly Disagree"
|
"strongly_disagree": "Stimme überhaupt nicht zu"
|
||||||
},
|
},
|
||||||
"/let-scan": {
|
"/let-scan": {
|
||||||
"title": "Let`s scan your palms",
|
"title": "Lassen Sie uns Ihre Handflächen scannen",
|
||||||
"text": "Follow the on-screen instructions, so we can analyze your palm lines and reveal your future, and the secrets of your destiny!"
|
"text": "Folgen Sie den Anweisungen auf dem Bildschirm, damit wir Ihre Handlinien analysieren und Ihre Zukunft sowie die Geheimnisse Ihres Schicksals enthüllen können!"
|
||||||
},
|
},
|
||||||
"biometric_data": "No biometric data collected. All recognition process performs on your device.",
|
|
||||||
"/scan-instruction": {
|
"/scan-instruction": {
|
||||||
"title": "Take your palm picture as instructed",
|
"title": "Machen Sie Ihr Handflächenbild wie angegeben",
|
||||||
"button": "Take a picture now"
|
"button": "Jetzt ein Bild machen"
|
||||||
},
|
},
|
||||||
"/email": {
|
"/email": {
|
||||||
"title": "Enter your email to get your advanced Palmistry reading with AURA",
|
"title": "Geben Sie Ihre E-Mail-Adresse ein, um Ihre erweiterte Handlesung mit AURA zu erhalten",
|
||||||
"not_share": "We don’t share any personal information.",
|
"not_share": "Wir teilen keine persönlichen Informationen.",
|
||||||
"placeholder_email": "Deine E-Mail-Adresse",
|
"placeholder_email": "Ihre E-Mail",
|
||||||
"placeholder_name": "Dein Name"
|
"placeholder_name": "Ihr Name"
|
||||||
},
|
},
|
||||||
"went_wrong": "Something went wrong.",
|
|
||||||
"app_number_one": {
|
"app_number_one": {
|
||||||
"text": "The <color> app trusted by over 25 million people.",
|
"text": "Die <color> App, der über 25 Millionen Menschen vertrauen.",
|
||||||
"color": "#1 Astrology"
|
"color": "#1 Astrologie"
|
||||||
},
|
},
|
||||||
"/trial-payment": {
|
"/trial-payment": {
|
||||||
"palm_is_ready": {
|
"palm_is_ready": {
|
||||||
"title": "Your Palm Reading <color>",
|
"title": "Ihre Handlesung <color>",
|
||||||
"title_color": "Is Ready",
|
"title_color": "Ist bereit",
|
||||||
"description": "“I’ve just received your palm scan results. Let’s discuss!”",
|
"description": "„Ich habe gerade Ihre Handscan-Ergebnisse erhalten. Lassen Sie uns darüber sprechen!“",
|
||||||
"text1": "<color> 6 years in palmistry readings and spiritual guidance.",
|
"text1": "<color> 6 Jahre Erfahrung in Handlesung und spiritueller Führung.",
|
||||||
"text1_color": "Akho",
|
"text1_color": "Akho",
|
||||||
"text2": "Choose from 80+ palm readers and astrologers."
|
"text2": "Wählen Sie aus über 80 Handlesern und Astrologen."
|
||||||
},
|
},
|
||||||
"joined_today": {
|
"joined_today": {
|
||||||
"text1": "Unlimited chats with a palm reader",
|
"text1": "Unbegrenzte Chats mit einem Handleser",
|
||||||
"text2": "<count> people joined today"
|
"text2": "<count> Personen sind heute beigetreten"
|
||||||
},
|
},
|
||||||
"get_personal_prediction": "Get personal prediction",
|
"get_personal_prediction": "Persönliche Vorhersage erhalten",
|
||||||
"how_work": {
|
"how_work": {
|
||||||
"title": "How does AURA work?",
|
"title": "Wie funktioniert AURA?",
|
||||||
"point1_title": "Send us your palm scan",
|
"point1_title": "Senden Sie uns Ihren Handscan",
|
||||||
"point1_text": "We analyze your palm lines to get hints about your future",
|
"point1_text": "Wir analysieren Ihre Handlinien, um Hinweise auf Ihre Zukunft zu erhalten.",
|
||||||
"point2_title": "Your palm reading is generated",
|
"point2_title": "Ihre Handlesung wird erstellt",
|
||||||
"point2_text": "One of our professional palm readers puts together a report filled with hints about your future",
|
"point2_text": "Einer unserer professionellen Handleser erstellt einen Bericht mit Hinweisen auf Ihre Zukunft.",
|
||||||
"point3_title": "Start your trial to receive your prediction",
|
"point3_title": "Starten Sie Ihre Testphase, um Ihre Vorhersage zu erhalten",
|
||||||
"point3_text": "Once you’re a AURA member, we’ll send over your prediction report so you can begin living a better life.",
|
"point3_text": "Sobald Sie AURA-Mitglied sind, senden wir Ihnen Ihren Vorhersagebericht zu, damit Sie ein besseres Leben beginnen können.",
|
||||||
"point4_title": "Talk with a palm reading specialist anytime",
|
"point4_title": "Sprechen Sie jederzeit mit einem Handlespesialisten",
|
||||||
"point4_text": "Get ongoing support by discussing your readings, personal horoscopes, and compatibilities with our expert team."
|
"point4_text": "Erhalten Sie laufende Unterstützung, indem Sie Ihre Lesungen, persönlichen Horoskope und Kompatibilitäten mit unserem Expertenteam besprechen."
|
||||||
},
|
},
|
||||||
"money_back_guarantee": {
|
"money_back_guarantee": {
|
||||||
"title": "100% Money-back Guarantee",
|
"title": "100% Geld-zurück-Garantie",
|
||||||
"text": "If you don’t notice any progress after using the app for at least a week, we are ready to make a complete refund within 14 days."
|
"text": "Wenn Sie nach mindestens einer Woche Nutzung der App keinen Fortschritt bemerken, sind wir bereit, innerhalb von 14 Tagen eine vollständige Rückerstattung zu leisten."
|
||||||
},
|
},
|
||||||
"begin_trial_now": "Begin Trial Now",
|
"begin_trial_now": "Jetzt Testphase beginnen",
|
||||||
"what_included": {
|
"what_included": {
|
||||||
"title": "What’s included?",
|
"title": "Was ist enthalten?",
|
||||||
"point1": "<bold> palm readings",
|
"point1": "<bold> Handlesungen",
|
||||||
"point1_bold": "Unlimited",
|
"point1_bold": "Unbegrenzte",
|
||||||
"point2": "<bold> with professional astrologers",
|
"point2": "<bold> mit professionellen Astrologen",
|
||||||
"point2_bold": "1:1 live chats",
|
"point2_bold": "1:1 Live-Chats",
|
||||||
"point3": "<bold> readings",
|
"point3": "<bold> Lesungen",
|
||||||
"point3_bold": "Daily compatibility",
|
"point3_bold": "Tägliche Kompatibilität",
|
||||||
"point4": "Cosmic relationship tips",
|
"point4": "Kosmische Beziehungstipps",
|
||||||
"point5": "Daily horoscopes"
|
"point5": "Tägliche Horoskope"
|
||||||
},
|
},
|
||||||
"palms_say_about": {
|
"palms_say_about": {
|
||||||
"title": "What do your palms say about you?",
|
"title": "Was sagen Ihre Handflächen über Sie?",
|
||||||
"point1": "<color> shows your attitude to love and the quality of love",
|
"point1": "<color> zeigt Ihre Einstellung zur Liebe und die Qualität der Liebe",
|
||||||
"point1_color": "Love line",
|
"point1_color": "Liebeslinie",
|
||||||
"point2": "A long thumb indicates good fortune",
|
"point2": "Ein langer Daumen zeigt Wohlstand an",
|
||||||
"point3": "<color> reflects your in telligence and mentality",
|
"point3": "<color> widerspiegelt Ihre Intelligenz und Ihren Verstand",
|
||||||
"point3_color": "Head line",
|
"point3_color": "Kopflinie",
|
||||||
"point4": "A long index finger indicates a natural leader",
|
"point4": "Ein langer Zeigefinger deutet auf eine natürliche Führungspersönlichkeit hin",
|
||||||
"point5": "<color> defines the quality of your life and what you will achieve",
|
"point5": "<color> bestimmt die Qualität Ihres Lebens und was Sie erreichen werden",
|
||||||
"point5_color": "Life line",
|
"point5_color": "Lebenslinie",
|
||||||
"point6": "A short middle finger reveals a free spirit",
|
"point6": "Ein kurzer Mittelfinger offenbart einen Freigeist",
|
||||||
"point7": "<color> represents your material achievement and career goals",
|
"point7": "<color> steht für Ihre materiellen Errungenschaften und Karriereziele",
|
||||||
"point7_color": "Fate line",
|
"point7_color": "Schicksalslinie",
|
||||||
"point8": "A long ring finger reveals that a person tends to take risks",
|
"point8": "Ein langer Ringfinger zeigt, dass eine Person risikofreudig ist",
|
||||||
"point9": "A short little finger indicates the person's lack of self-confidence"
|
"point9": "Ein kurzer kleiner Finger weist auf mangelndes Selbstvertrauen der Person hin"
|
||||||
},
|
},
|
||||||
"discover_more": "Discover More",
|
"discover_more": "Mehr entdecken",
|
||||||
"why_love": "Why does everyone <color> ?",
|
"why_love": "Warum lieben alle <color> ?",
|
||||||
"why_love_color": "love AURA",
|
"why_love_color": "AURA",
|
||||||
"reviews": {
|
"reviews": {
|
||||||
"username1": "Rebecca Bauman",
|
"username1": "Rebecca Bauman",
|
||||||
"tagline1": "\"It’s changed my life!\"",
|
"tagline1": "\"Es hat mein Leben verändert!\"",
|
||||||
"text1": "I'm thankful for this app and Akho! She's an excellent palm reader and astrologer—clear, thorough, and reassuring. I eagerly look forward to more sessions with her!",
|
"text1": "Ich bin dankbar für diese App und Akho! Sie ist eine ausgezeichnete Handleserin und Astrologin – klar, gründlich und beruhigend. Ich freue mich auf weitere Sitzungen mit ihr!",
|
||||||
"username2": "Mika Ryan",
|
"username2": "Mika Ryan",
|
||||||
"tagline2": "\"After years of seeking, I’ve finally found a true love.\"",
|
"tagline2": "\"Nach jahrelanger Suche habe ich endlich die wahre Liebe gefunden.\"",
|
||||||
"text2": "I was hesitant about whether it was really worth trying, but now I have no regrets and I'm enjoying my new relationships!",
|
"text2": "Ich war unsicher, ob es wirklich einen Versuch wert war, aber jetzt habe ich keine Reue und genieße meine neuen Beziehungen!",
|
||||||
"username3": "Amanda Holmes",
|
"username3": "Amanda Holmes",
|
||||||
"tagline3": "\"I’ve found a job I really enjoy.\"",
|
"tagline3": "\"Ich habe einen Job gefunden, den ich wirklich genieße.\"",
|
||||||
"text3": "Thanks to Vladana, I've finally discovered a clue about what my life's purpose really is and what kind of job resonates with me better!"
|
"text3": "Dank Vladana habe ich endlich einen Hinweis darauf, was der Zweck meines Lebens wirklich ist und welche Art von Job besser zu mir passt!"
|
||||||
},
|
},
|
||||||
"success_story": "Become a AURA Success Story!",
|
"success_story": "Werden Sie eine AURA Erfolgsgeschichte!",
|
||||||
"as_seen_in": "<color> As Seen in",
|
"as_seen_in": "<color> Wie gesehen in",
|
||||||
"footer": {
|
"footer": {
|
||||||
"text1": "Questions? We’re here to help",
|
"text1": "Fragen? Wir sind hier, um zu helfen",
|
||||||
"text2": "Customer Support",
|
"text2": "Kundensupport",
|
||||||
"text3": "Help Center"
|
"text3": "Hilfezentrum"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/payment": {
|
"/payment": {
|
||||||
"will_be_charged_trial_info": "<trialPrice> for your <trialDuration>-day trial",
|
"will_be_charged_trial_info": "<trialPrice> für Ihre <trialDuration>-Tage-Testphase",
|
||||||
"will_be_charged_email_reminder": "email you a reminder",
|
"will_be_charged_email_reminder": "senden Ihnen eine Erinnerungs-E-Mail",
|
||||||
"will_be_charged": "You will be charged only <trialInfo>. Then <fullPrice> <trialPrice> per week. Save <save> every week. We’ll <emailReminder> before your trial ends.",
|
"will_be_charged": "Es wird Ihnen nur <trialInfo> berechnet. Danach <fullPrice> <trialPrice> pro Woche. Sparen Sie <save> jede Woche. Wir werden Ihnen <emailReminder>, bevor Ihre Testphase endet.",
|
||||||
"payment_information": {
|
"payment_information": {
|
||||||
"personalized_offer": "Personalized offer reserved",
|
"personalized_offer": "Personalisierte Reserveangebot",
|
||||||
"title": "Start your <trialDuration>-day trial",
|
"title": "Starten Sie Ihre <trialDuration>-Tage-Testphase",
|
||||||
"total_today": "Total today",
|
"total_today": "Total heute",
|
||||||
"code_applied_bold": "AURA24",
|
"code_applied_bold": "AURA24",
|
||||||
"code_applied": "Code <bold> applied!"
|
"code_applied": "Code <bold> angewendet!"
|
||||||
},
|
},
|
||||||
"guarantees": {
|
"guarantees": {
|
||||||
"no_commitment": "No commitment. Cancel anytime.",
|
"no_commitment": "Keine Verpflichtung. Jederzeit kündbar.",
|
||||||
"30_day_money_back": "30-Day Money-Back Guarantee"
|
"30_day_money_back": "30-Tage-Geld-zurück-Garantie"
|
||||||
},
|
},
|
||||||
"get_personal_prediction": "Get personal prediction",
|
"get_personal_prediction": "Persönliche Vorhersage erhalten",
|
||||||
"total_due": "Total due today: <trialPrice>",
|
"total_due": "Heute fällig: <trialPrice>",
|
||||||
"app_number_one_color": "25 million people.",
|
"app_number_one_color": "25 Millionen Menschen.",
|
||||||
"app_number_one": "The #1 Astrology app trusted by over <color>"
|
"app_number_one": "Die Nr. 1 Astrologie-App, der über <color> vertrauen"
|
||||||
}
|
},
|
||||||
}
|
"/camera": {
|
||||||
|
"bad_photo": "Schlechtes Foto!",
|
||||||
|
"try_again": "Nochmal versuchen",
|
||||||
|
"do_better": "Das geht besser",
|
||||||
|
"next": "Weiter"
|
||||||
|
},
|
||||||
|
"threadId": "thread_y5fONgeio6EHUbbaLAe5MCuB",
|
||||||
|
"assistantId": "asst_idSnXIUMNRwwUHyXHBE1Rdtn",
|
||||||
|
"v": "v1",
|
||||||
|
"config": "de.male"
|
||||||
|
}
|
||||||
@ -1,184 +1,250 @@
|
|||||||
{
|
{
|
||||||
"next": "Next",
|
"next": "Suivant",
|
||||||
|
"privacy_policy": "En continuant, vous acceptez notre <eulaLink> et notre <privacyLink>. Une question? Contactez notre équipe d'assistance <clickHere>",
|
||||||
|
"eula_link": "CLUF",
|
||||||
|
"privacy_notice": "Avis de confidentialité",
|
||||||
|
"policy_here": "ici",
|
||||||
|
"thumb": "Pouce",
|
||||||
|
"index_finger": "Index",
|
||||||
|
"middle_finger": "Majeur",
|
||||||
|
"ring_finger": "Annulaire",
|
||||||
|
"pinky": "Auriculaire",
|
||||||
|
"skip_trial": "Passer l'essai",
|
||||||
|
"add_consultant": "Ajouter un consultant",
|
||||||
|
"add_guides": "Ajouter des guides",
|
||||||
|
"access_product": "Accéder au produit",
|
||||||
|
"thank_you": "Merci !",
|
||||||
|
"order_successful": "Votre commande a été réussie !",
|
||||||
|
"biometric_data": "Aucune donnée biométrique collectée. Tout le processus de reconnaissance s'effectue sur votre appareil.",
|
||||||
|
"went_wrong": "Un problème est survenu.",
|
||||||
|
"/scanned-photo": {
|
||||||
|
"title": "Nous préparons une lecture de chiromancie complète rien que pour vous !",
|
||||||
|
"text": "Waouh, on dirait qu'il y a beaucoup à dire sur votre avenir ambitieux et sûr de vous."
|
||||||
|
},
|
||||||
|
"aura_paywall_palmistry_main": {
|
||||||
|
"text_0": "Nous avons aidé des millions de personnes à révéler le destin de leur vie amoureuse ainsi que ce que l'avenir réserve pour elles et leurs familles.",
|
||||||
|
"text_1": "Cela nous coûte 13,21 $ pour rémunérer nos employés d'AURA pour l'essai, mais choisissez le montant avec lequel vous êtes à l'aise."
|
||||||
|
},
|
||||||
|
"/skip-trial": {
|
||||||
|
"title": "Pas envie de regarder en arrière ?",
|
||||||
|
"price_per_week": "<price> par semaine",
|
||||||
|
"billing_period": "Période de facturation",
|
||||||
|
"billed_amount": "Montant facturé",
|
||||||
|
"billed_in_4_weeks": "Facturé dans 4 semaines",
|
||||||
|
"start_trial": {
|
||||||
|
"every_week": "Chaque semaine",
|
||||||
|
"start_trial": "Commencer l'essai"
|
||||||
|
},
|
||||||
|
"skip_trial": {
|
||||||
|
"save": "économisez <save>%",
|
||||||
|
"every_4_weeks": "Toutes les 4 semaines",
|
||||||
|
"skip_trial": "Accepter l'offre et sauter l'essai"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/add-consultant": {
|
||||||
|
"more_for_you": "Encore plus pour vous",
|
||||||
|
"exclusive_offer": "Offre exclusive recommandée pour vous aider à atteindre vos objectifs plus rapidement",
|
||||||
|
"your_unique_consultation": "Votre consultation individuelle unique",
|
||||||
|
"30-minute": "30 minutes de consultation privée avec un expert",
|
||||||
|
"description": "Vous pouvez demander une prédiction de l'avenir, une analyse de compatibilité; compatibilité amoureuse, etc.",
|
||||||
|
"one_time_price_offer": "Offre tarifaire unique : ",
|
||||||
|
"original_price": "Prix initial : <oldPrice> <discount>",
|
||||||
|
"you_will_be_charged": "*Vous serez facturé pour les services ou offres supplémentaires sélectionnés au moment de l’achat.\n C'est un paiement non récurrent.",
|
||||||
|
"get_my_consultation": "Obtenir ma consultation",
|
||||||
|
"discount_save": "Économisez",
|
||||||
|
"caution": "Attention !",
|
||||||
|
"caution_text": "Pour éviter les doubles facturations, veuillez ne pas fermer la page ni revenir en arrière.",
|
||||||
|
"unlock_profound": "Débloquez des perceptions profondes sur votre personnalité, vos relations, votre trajectoire professionnelle, et les moments clés de votre vie grâce à l'astrologie, vous permettant de prendre des décisions éclairées pour un épanouissement accru.",
|
||||||
|
"choose_from": "Choisissez parmi plus de 80 astrologues experts."
|
||||||
|
},
|
||||||
"/find-your-happiness": {
|
"/find-your-happiness": {
|
||||||
"title": "Find your happiness with highly-personalized predictions.",
|
"title": "Trouvez votre bonheur avec des prédictions hautement personnalisées.",
|
||||||
"point1": "rated by real users",
|
"point1": "approuvé par de vrais utilisateurs",
|
||||||
"point2": "93.4% Accuracy",
|
"point2": "93,4% de précision",
|
||||||
"point3": "20m users’ choice",
|
"point3": "Choix de 20 millions d'utilisateurs",
|
||||||
"point4": "4.8 satisfaction sco",
|
"point4": "Note de satisfaction de 4,8",
|
||||||
"text": "Understand your self and improve relationships with astrology"
|
"text": "Comprenez-vous et améliorez vos relations grâce à l'astrologie"
|
||||||
},
|
},
|
||||||
"/gender": {
|
"/gender": {
|
||||||
"title": "What’s your gender?",
|
"title": "Quel est votre genre ?",
|
||||||
"description": "In Palmistry, everyone is a blend of masculine and feminine, so it helps to know yours."
|
"description": "En chiromancie, chacun est un mélange de masculin et de féminin, donc connaître le vôtre est utile.",
|
||||||
|
"already_have_account": "Vous avez déjà un compte ? Connectez-vous"
|
||||||
},
|
},
|
||||||
"/birthdate": {
|
"/birthdate": {
|
||||||
"title": "What’s your date of birth?",
|
"title": "Quelle est votre date de naissance ?",
|
||||||
"text": "Your birth date reveals your core personality traits, needs and desires."
|
"text": "Votre date de naissance révèle vos traits de personnalité fondamentaux, vos besoins et vos désirs."
|
||||||
},
|
},
|
||||||
"/palms-information": {
|
"/palms-information": {
|
||||||
"title": "Your palms hold a wealth of information about your fate and personality."
|
"title": "Vos paumes contiennent une mine d'informations sur votre destin et votre personnalité."
|
||||||
},
|
},
|
||||||
"/what-aspects": {
|
"/what-aspects": {
|
||||||
"title": "What aspects of your life do you wish to gain insight into through palmistry?",
|
"title": "Quels aspects de votre vie souhaitez-vous explorer grâce à la chiromancie ?",
|
||||||
"answer1": "Love & Relationships",
|
"answer1": "Amour et Relations",
|
||||||
"answer2": "Health & Vitality",
|
"answer2": "Santé et Vitalité",
|
||||||
"answer3": "Career & Destiny"
|
"answer3": "Carrière et Destin"
|
||||||
},
|
},
|
||||||
"/relationship-status": {
|
"/relationship-status": {
|
||||||
"title": "So we can get to know you better, please tell us your relationship status",
|
"title": "Pour mieux vous connaître, merci de nous indiquer votre statut sentimental",
|
||||||
"answer1": "Single",
|
"answer1": "Célibataire",
|
||||||
"answer2": "In a relationship"
|
"answer2": "En couple"
|
||||||
},
|
},
|
||||||
"/element-resonates": {
|
"/element-resonates": {
|
||||||
"title": "Which element resonates with you most?",
|
"title": "Quel élément vous correspond le mieux ?",
|
||||||
"answer1": "Water",
|
"answer1": "Eau",
|
||||||
"answer2": "Fire",
|
"answer2": "Feu",
|
||||||
"answer3": "Air",
|
"answer3": "Air",
|
||||||
"answer4": "Earth"
|
"answer4": "Terre"
|
||||||
},
|
},
|
||||||
"/favorite-color": {
|
"/favorite-color": {
|
||||||
"title": "Which color do you like the most?",
|
"title": "Quelle couleur préférez-vous ?",
|
||||||
"answer1": "Blue",
|
"answer1": "Bleu",
|
||||||
"answer2": "Green",
|
"answer2": "Vert",
|
||||||
"answer3": "Orange",
|
"answer3": "Orange",
|
||||||
"answer4": "Violet",
|
"answer4": "Violet",
|
||||||
"answer5": "Red",
|
"answer5": "Rouge",
|
||||||
"answer6": "Yellow"
|
"answer6": "Jaune"
|
||||||
},
|
},
|
||||||
"/head-or-heart": {
|
"/head-or-heart": {
|
||||||
"title": "Do you make decisions with your head or your heart?",
|
"title": "Prenez-vous vos décisions avec votre tête ou votre cœur ?",
|
||||||
"answer1": "Heart",
|
"answer1": "Cœur",
|
||||||
"answer2": "Head",
|
"answer2": "Tête",
|
||||||
"answer3": "Both"
|
"answer3": "Les deux"
|
||||||
},
|
},
|
||||||
"/relate-following": {
|
"/relate-following": {
|
||||||
"title": "Do you relate to the following:",
|
"title": "Vous reconnaissez-vous dans les affirmations suivantes :",
|
||||||
"question1": "I find solace and comfort in spending time alone.",
|
"question1": "Je trouve du réconfort et de la sérénité en passant du temps seul(e).",
|
||||||
"question2": "I value and enjoy my own company.",
|
"question2": "J'apprécie et j'aime ma propre compagnie.",
|
||||||
"question3": "I prefer socializing in groups rather than spending time alone.",
|
"question3": "Je préfère socialiser en groupe plutôt que de passer du temps seul(e).",
|
||||||
"question4": "Loneliness is something I actively try to avoid.",
|
"question4": "La solitude est quelque chose que j'essaie d'éviter activement.",
|
||||||
"question5": "I enjoy activities that I can do independently.",
|
"question5": "J'aime pratiquer des activités que je peux faire de manière indépendante.",
|
||||||
"strongly_agree": "Strongly Agree",
|
"strongly_agree": "Tout à fait d'accord",
|
||||||
"strongly_disagree": "Strongly Disagree"
|
"strongly_disagree": "Pas du tout d'accord"
|
||||||
},
|
},
|
||||||
"/let-scan": {
|
"/let-scan": {
|
||||||
"title": "Let`s scan your palms",
|
"title": "Scannons vos paumes",
|
||||||
"text": "Follow the on-screen instructions, so we can analyze your palm lines and reveal your future, and the secrets of your destiny!"
|
"text": "Suivez les instructions à l'écran, afin que nous puissions analyser les lignes de vos paumes et révéler votre avenir et les secrets de votre destin !"
|
||||||
},
|
},
|
||||||
"biometric_data": "No biometric data collected. All recognition process performs on your device.",
|
|
||||||
"/scan-instruction": {
|
"/scan-instruction": {
|
||||||
"title": "Take your palm picture as instructed",
|
"title": "Prenez la photo de votre paume selon les instructions",
|
||||||
"button": "Take a picture now"
|
"button": "Prendre une photo maintenant"
|
||||||
},
|
},
|
||||||
"/email": {
|
"/email": {
|
||||||
"title": "Enter your email to get your advanced Palmistry reading with AURA",
|
"title": "Entrez votre email pour obtenir votre lecture de chiromancie avancée avec AURA",
|
||||||
"not_share": "We don’t share any personal information.",
|
"not_share": "Nous ne partageons aucune information personnelle.",
|
||||||
"placeholder_email": "Votre e-mail",
|
"placeholder_email": "Votre email",
|
||||||
"placeholder_name": "Votre nom"
|
"placeholder_name": "Votre prénom"
|
||||||
},
|
},
|
||||||
"went_wrong": "Something went wrong.",
|
|
||||||
"app_number_one": {
|
"app_number_one": {
|
||||||
"text": "The <color> app trusted by over 25 million people.",
|
"text": "L'application <color> de confiance pour plus de 25 millions de personnes.",
|
||||||
"color": "#1 Astrology"
|
"color": "#1 en Astrologie"
|
||||||
},
|
},
|
||||||
"/trial-payment": {
|
"/trial-payment": {
|
||||||
"palm_is_ready": {
|
"palm_is_ready": {
|
||||||
"title": "Your Palm Reading <color>",
|
"title": "Votre lecture de paume <color>",
|
||||||
"title_color": "Is Ready",
|
"title_color": "Est prête",
|
||||||
"description": "“I’ve just received your palm scan results. Let’s discuss!”",
|
"description": "“Je viens de recevoir les résultats de votre scan de paume. Discutons-en !”",
|
||||||
"text1": "<color> 6 years in palmistry readings and spiritual guidance.",
|
"text1": "<color> 6 ans d'expérience en lectures de chiromancie et en guidance spirituelle.",
|
||||||
"text1_color": "Akho",
|
"text1_color": "Akho",
|
||||||
"text2": "Choose from 80+ palm readers and astrologers."
|
"text2": "Choisissez parmi plus de 80 spécialistes en lectures de paume et astrologues."
|
||||||
},
|
},
|
||||||
"joined_today": {
|
"joined_today": {
|
||||||
"text1": "Unlimited chats with a palm reader",
|
"text1": "Chats illimités avec un lecteur de paume",
|
||||||
"text2": "<count> people joined today"
|
"text2": "<count> personnes se sont inscrites aujourd'hui"
|
||||||
},
|
},
|
||||||
"get_personal_prediction": "Get personal prediction",
|
"get_personal_prediction": "Obtenez une prédiction personnelle",
|
||||||
"how_work": {
|
"how_work": {
|
||||||
"title": "How does AURA work?",
|
"title": "Comment fonctionne AURA ?",
|
||||||
"point1_title": "Send us your palm scan",
|
"point1_title": "Envoyez-nous votre scan de paume",
|
||||||
"point1_text": "We analyze your palm lines to get hints about your future",
|
"point1_text": "Nous analysons les lignes de vos paumes pour obtenir des indices sur votre avenir",
|
||||||
"point2_title": "Your palm reading is generated",
|
"point2_title": "Votre lecture de paume est générée",
|
||||||
"point2_text": "One of our professional palm readers puts together a report filled with hints about your future",
|
"point2_text": "L'un de nos lecteurs de paume professionnels vous rédige un rapport rempli d'indices sur votre avenir",
|
||||||
"point3_title": "Start your trial to receive your prediction",
|
"point3_title": "Commencez votre essai pour recevoir votre prédiction",
|
||||||
"point3_text": "Once you’re a AURA member, we’ll send over your prediction report so you can begin living a better life.",
|
"point3_text": "Une fois membre d'AURA, nous vous enverrons votre rapport de prédiction pour que vous puissiez commencer à vivre mieux.",
|
||||||
"point4_title": "Talk with a palm reading specialist anytime",
|
"point4_title": "Discutez avec un spécialiste en lecture de paume à tout moment",
|
||||||
"point4_text": "Get ongoing support by discussing your readings, personal horoscopes, and compatibilities with our expert team."
|
"point4_text": "Bénéficiez d'un support continu en discutant de vos lectures, de vos horoscopes personnels et de vos compatibilités avec notre équipe d'experts."
|
||||||
},
|
},
|
||||||
"money_back_guarantee": {
|
"money_back_guarantee": {
|
||||||
"title": "100% Money-back Guarantee",
|
"title": "Garantie de remboursement à 100%",
|
||||||
"text": "If you don’t notice any progress after using the app for at least a week, we are ready to make a complete refund within 14 days."
|
"text": "Si vous ne constatez aucun progrès après avoir utilisé l'application pendant au moins une semaine, nous sommes prêts à effectuer un remboursement complet dans les 14 jours."
|
||||||
},
|
},
|
||||||
"begin_trial_now": "Begin Trial Now",
|
"begin_trial_now": "Commencez l'essai maintenant",
|
||||||
"what_included": {
|
"what_included": {
|
||||||
"title": "What’s included?",
|
"title": "Qu'est-ce qui est inclus ?",
|
||||||
"point1": "<bold> palm readings",
|
"point1": "<bold> lectures de paume",
|
||||||
"point1_bold": "Unlimited",
|
"point1_bold": "Illimitées",
|
||||||
"point2": "<bold> with professional astrologers",
|
"point2": "<bold> avec des astrologues professionnels",
|
||||||
"point2_bold": "1:1 live chats",
|
"point2_bold": "Chats en direct 1:1",
|
||||||
"point3": "<bold> readings",
|
"point3": "<bold> lectures",
|
||||||
"point3_bold": "Daily compatibility",
|
"point3_bold": "Compatibilité quotidienne",
|
||||||
"point4": "Cosmic relationship tips",
|
"point4": "Conseils pour les relations cosmiques",
|
||||||
"point5": "Daily horoscopes"
|
"point5": "Horoscopes quotidiens"
|
||||||
},
|
},
|
||||||
"palms_say_about": {
|
"palms_say_about": {
|
||||||
"title": "What do your palms say about you?",
|
"title": "Que disent vos paumes de vous ?",
|
||||||
"point1": "<color> shows your attitude to love and the quality of love",
|
"point1": "<color> montre votre attitude envers l'amour et la qualité de l'amour",
|
||||||
"point1_color": "Love line",
|
"point1_color": "Ligne de cœur",
|
||||||
"point2": "A long thumb indicates good fortune",
|
"point2": "Un pouce long indique une bonne fortune",
|
||||||
"point3": "<color> reflects your in telligence and mentality",
|
"point3": "<color> reflète votre intelligence et votre mentalité",
|
||||||
"point3_color": "Head line",
|
"point3_color": "Ligne de tête",
|
||||||
"point4": "A long index finger indicates a natural leader",
|
"point4": "Un index long montre un leader naturel",
|
||||||
"point5": "<color> defines the quality of your life and what you will achieve",
|
"point5": "<color> définit la qualité de votre vie et ce que vous accomplirez",
|
||||||
"point5_color": "Life line",
|
"point5_color": "Ligne de vie",
|
||||||
"point6": "A short middle finger reveals a free spirit",
|
"point6": "Un majeur court révèle un esprit libre",
|
||||||
"point7": "<color> represents your material achievement and career goals",
|
"point7": "<color> représente vos accomplissements matériels et objectifs de carrière",
|
||||||
"point7_color": "Fate line",
|
"point7_color": "Ligne de destinée",
|
||||||
"point8": "A long ring finger reveals that a person tends to take risks",
|
"point8": "Un annulaire long révèle une tendance à prendre des risques",
|
||||||
"point9": "A short little finger indicates the person's lack of self-confidence"
|
"point9": "Un petit doigt court indique un manque de confiance en soi"
|
||||||
},
|
},
|
||||||
"discover_more": "Discover More",
|
"discover_more": "Découvrez plus",
|
||||||
"why_love": "Why does everyone <color> ?",
|
"why_love": "Pourquoi tout le monde <color> ?",
|
||||||
"why_love_color": "love AURA",
|
"why_love_color": "aime AURA",
|
||||||
"reviews": {
|
"reviews": {
|
||||||
"username1": "Rebecca Bauman",
|
"username1": "Rebecca Bauman",
|
||||||
"tagline1": "\"It’s changed my life!\"",
|
"tagline1": "\"Cela a changé ma vie !\"",
|
||||||
"text1": "I'm thankful for this app and Akho! She's an excellent palm reader and astrologer—clear, thorough, and reassuring. I eagerly look forward to more sessions with her!",
|
"text1": "Je suis reconnaissante pour cette application et pour Akho ! Elle est une excellente lectrice de paume et astrologue—précise, complète et rassurante. J'attends avec impatience d'autres sessions avec elle !",
|
||||||
"username2": "Mika Ryan",
|
"username2": "Mika Ryan",
|
||||||
"tagline2": "\"After years of seeking, I’ve finally found a true love.\"",
|
"tagline2": "\"Après des années de recherche, j'ai enfin trouvé un véritable amour.\"",
|
||||||
"text2": "I was hesitant about whether it was really worth trying, but now I have no regrets and I'm enjoying my new relationships!",
|
"text2": "J'étais hésitante à savoir si cela valait vraiment la peine d'essayer, mais maintenant je n'ai aucun regret et je profite de mes nouvelles relations !",
|
||||||
"username3": "Amanda Holmes",
|
"username3": "Amanda Holmes",
|
||||||
"tagline3": "\"I’ve found a job I really enjoy.\"",
|
"tagline3": "\"J'ai trouvé un travail qui me plaît vraiment.\"",
|
||||||
"text3": "Thanks to Vladana, I've finally discovered a clue about what my life's purpose really is and what kind of job resonates with me better!"
|
"text3": "Grâce à Vladana, j'ai enfin découvert un indice sur le véritable but de ma vie et le type de travail qui me convient le mieux !"
|
||||||
},
|
},
|
||||||
"success_story": "Become a AURA Success Story!",
|
"success_story": "Devenez une success story d'AURA !",
|
||||||
"as_seen_in": "<color> As Seen in",
|
"as_seen_in": "<color> Vu dans",
|
||||||
"footer": {
|
"footer": {
|
||||||
"text1": "Questions? We’re here to help",
|
"text1": "Des questions ? Nous sommes là pour vous aider",
|
||||||
"text2": "Customer Support",
|
"text2": "Support Client",
|
||||||
"text3": "Help Center"
|
"text3": "Centre d'aide"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/payment": {
|
"/payment": {
|
||||||
"will_be_charged_trial_info": "<trialPrice> for your <trialDuration>-day trial",
|
"will_be_charged_trial_info": "<trialPrice> pour votre essai de <trialDuration> jours",
|
||||||
"will_be_charged_email_reminder": "email you a reminder",
|
"will_be_charged_email_reminder": "un rappel par email",
|
||||||
"will_be_charged": "You will be charged only <trialInfo>. Then <fullPrice> <trialPrice> per week. Save <save> every week. We’ll <emailReminder> before your trial ends.",
|
"will_be_charged": "Vous serez facturé uniquement <trialInfo>. Ensuite <fullPrice> <trialPrice> par semaine. Économisez <save> chaque semaine. Nous vous enverrons <emailReminder> avant la fin de votre essai.",
|
||||||
"payment_information": {
|
"payment_information": {
|
||||||
"personalized_offer": "Personalized offer reserved",
|
"personalized_offer": "Offre personnalisée réservée",
|
||||||
"title": "Start your <trialDuration>-day trial",
|
"title": "Commencez votre essai de <trialDuration> jours",
|
||||||
"total_today": "Total today",
|
"total_today": "Total aujourd'hui",
|
||||||
"code_applied_bold": "AURA24",
|
"code_applied_bold": "AURA24",
|
||||||
"code_applied": "Code <bold> applied!"
|
"code_applied": "Code <bold> appliqué !"
|
||||||
},
|
},
|
||||||
"guarantees": {
|
"guarantees": {
|
||||||
"no_commitment": "No commitment. Cancel anytime.",
|
"no_commitment": "Pas d'engagement. Annulez à tout moment.",
|
||||||
"30_day_money_back": "30-Day Money-Back Guarantee"
|
"30_day_money_back": "Garantie de remboursement de 30 jours"
|
||||||
},
|
},
|
||||||
"get_personal_prediction": "Get personal prediction",
|
"get_personal_prediction": "Obtenez une prédiction personnelle",
|
||||||
"total_due": "Total due today: <trialPrice>",
|
"total_due": "Total dû aujourd'hui : <trialPrice>",
|
||||||
"app_number_one_color": "25 million people.",
|
"app_number_one_color": "25 millions de personnes.",
|
||||||
"app_number_one": "The #1 Astrology app trusted by over <color>"
|
"app_number_one": "L'application d'astrologie n°1 de confiance pour plus de <color>"
|
||||||
}
|
},
|
||||||
}
|
"/camera": {
|
||||||
|
"bad_photo": "Mauvaise photo !",
|
||||||
|
"try_again": "Essayez de nouveau",
|
||||||
|
"do_better": "Vous pouvez faire mieux",
|
||||||
|
"next": "Suivant"
|
||||||
|
},
|
||||||
|
"threadId": "thread_flgHZobe2UKs9lxQoMgLU7JX",
|
||||||
|
"assistantId": "asst_cV8jnxm3GgALkHo4R4nhj3iV",
|
||||||
|
"v": "v1",
|
||||||
|
"config": "fr.female"
|
||||||
|
}
|
||||||
@ -1,184 +1,250 @@
|
|||||||
{
|
{
|
||||||
"next": "Next",
|
"next": "Suivant",
|
||||||
|
"privacy_policy": "En continuant, vous acceptez notre <eulaLink> et notre <privacyLink>. Une question ? Contactez notre équipe de support <clickHere>",
|
||||||
|
"eula_link": "CLUF",
|
||||||
|
"privacy_notice": "Avis de confidentialité",
|
||||||
|
"policy_here": "ici",
|
||||||
|
"thumb": "Pouce",
|
||||||
|
"index_finger": "Index",
|
||||||
|
"middle_finger": "Majeur",
|
||||||
|
"ring_finger": "Annulaire",
|
||||||
|
"pinky": "Auriculaire",
|
||||||
|
"skip_trial": "Passer l'essai",
|
||||||
|
"add_consultant": "Ajouter un consultant",
|
||||||
|
"add_guides": "Ajouter des guides",
|
||||||
|
"access_product": "Accéder au produit",
|
||||||
|
"thank_you": "Merci!",
|
||||||
|
"order_successful": "Votre commande a été validée avec succès !",
|
||||||
|
"biometric_data": "Aucune donnée biométrique collectée. Tout le processus de reconnaissance se déroule sur votre appareil.",
|
||||||
|
"went_wrong": "Un problème est survenu.",
|
||||||
|
"/scanned-photo": {
|
||||||
|
"title": "Nous préparons une lecture de chiromancie complète juste pour vous !",
|
||||||
|
"text": "Wow, il semble qu'il y ait beaucoup à dire sur votre avenir ambitieux et votre confiance en vous."
|
||||||
|
},
|
||||||
|
"aura_paywall_palmistry_main": {
|
||||||
|
"text_0": "Nous avons aidé des millions de personnes à découvrir le destin de leur vie amoureuse et ce que l'avenir réserve pour eux et leur famille.",
|
||||||
|
"text_1": "Cela nous coûte 13,21 $ pour compenser nos employés AURA pour l'essai, mais s'il vous plaît, choisissez le montant avec lequel vous êtes à l'aise."
|
||||||
|
},
|
||||||
|
"/skip-trial": {
|
||||||
|
"title": "Pas l'intention de revenir en arrière ?",
|
||||||
|
"price_per_week": "<price> par semaine",
|
||||||
|
"billing_period": "Période de facturation",
|
||||||
|
"billed_amount": "Montant facturé",
|
||||||
|
"billed_in_4_weeks": "Facturé en 4 semaines",
|
||||||
|
"start_trial": {
|
||||||
|
"every_week": "Chaque semaine",
|
||||||
|
"start_trial": "Commencer l'essai"
|
||||||
|
},
|
||||||
|
"skip_trial": {
|
||||||
|
"save": "économisez <save> %",
|
||||||
|
"every_4_weeks": "Tous les 4 semaines",
|
||||||
|
"skip_trial": "Accepter l'offre et passer l'essai"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/add-consultant": {
|
||||||
|
"more_for_you": "Plus pour vous",
|
||||||
|
"exclusive_offer": "Offre exclusive recommandée pour vous permettre d'atteindre vos objectifs plus rapidement",
|
||||||
|
"your_unique_consultation": "Votre consultation personnelle unique",
|
||||||
|
"30-minute": "Consultation privée de 30 minutes avec un expert",
|
||||||
|
"description": "Vous pouvez demander une prédiction de l'avenir, une analyse de compatibilité de vie; compatibilité amoureuse, etc.",
|
||||||
|
"one_time_price_offer": "Offre de prix unique : ",
|
||||||
|
"original_price": "Prix d'origine : <oldPrice> <discount>",
|
||||||
|
"you_will_be_charged": "*Vous serez facturé pour les services additionnels ou les offres sélectionnées au moment de l'achat.\n Ce n'est pas un paiement récurrent.",
|
||||||
|
"get_my_consultation": "Obtenir ma consultation",
|
||||||
|
"discount_save": "Économisez",
|
||||||
|
"caution": "Attention !",
|
||||||
|
"caution_text": "Pour éviter les doubles facturations, veuillez ne pas fermer la page et ne pas revenir en arrière.",
|
||||||
|
"unlock_profound": "Débloquez des aperçus profonds de votre personnalité, de vos relations, de votre trajectoire professionnelle et des moments clés de votre vie grâce à l'astrologie, vous permettant de prendre des décisions éclairées et de réaliser une plus grande épanouissement.",
|
||||||
|
"choose_from": "Choisissez parmi plus de 80 astrologues experts."
|
||||||
|
},
|
||||||
"/find-your-happiness": {
|
"/find-your-happiness": {
|
||||||
"title": "Find your happiness with highly-personalized predictions.",
|
"title": "Trouvez votre bonheur avec des prévisions hautement personnalisées.",
|
||||||
"point1": "rated by real users",
|
"point1": "évalué par de vrais utilisateurs",
|
||||||
"point2": "93.4% Accuracy",
|
"point2": "Précision de 93,4 %",
|
||||||
"point3": "20m users’ choice",
|
"point3": "Choisi par 20 millions d'utilisateurs",
|
||||||
"point4": "4.8 satisfaction sco",
|
"point4": "4,8 de score de satisfaction",
|
||||||
"text": "Understand your self and improve relationships with astrology"
|
"text": "Comprenez-vous et améliorez vos relations grâce à l'astrologie"
|
||||||
},
|
},
|
||||||
"/gender": {
|
"/gender": {
|
||||||
"title": "What’s your gender?",
|
"title": "Quel est votre genre ?",
|
||||||
"description": "In Palmistry, everyone is a blend of masculine and feminine, so it helps to know yours."
|
"description": "En chiromancie, tout le monde est un mélange de masculin et de féminin, donc il est utile de connaître le vôtre.",
|
||||||
|
"already_have_account": "Vous avez déjà un compte ? Connectez-vous"
|
||||||
},
|
},
|
||||||
"/birthdate": {
|
"/birthdate": {
|
||||||
"title": "What’s your date of birth?",
|
"title": "Quelle est votre date de naissance ?",
|
||||||
"text": "Your birth date reveals your core personality traits, needs and desires."
|
"text": "Votre date de naissance révèle vos traits de personnalité fondamentaux, vos besoins et vos désirs."
|
||||||
},
|
},
|
||||||
"/palms-information": {
|
"/palms-information": {
|
||||||
"title": "Your palms hold a wealth of information about your fate and personality."
|
"title": "Vos paumes contiennent une mine d'informations sur votre destin et votre personnalité."
|
||||||
},
|
},
|
||||||
"/what-aspects": {
|
"/what-aspects": {
|
||||||
"title": "What aspects of your life do you wish to gain insight into through palmistry?",
|
"title": "Quels aspects de votre vie souhaitez-vous explorer grâce à la chiromancie ?",
|
||||||
"answer1": "Love & Relationships",
|
"answer1": "Amour & Relations",
|
||||||
"answer2": "Health & Vitality",
|
"answer2": "Santé & Vitalité",
|
||||||
"answer3": "Career & Destiny"
|
"answer3": "Carrière & Destin"
|
||||||
},
|
},
|
||||||
"/relationship-status": {
|
"/relationship-status": {
|
||||||
"title": "So we can get to know you better, please tell us your relationship status",
|
"title": "Pour mieux vous connaître, veuillez nous indiquer votre statut relationnel",
|
||||||
"answer1": "Single",
|
"answer1": "Célibataire",
|
||||||
"answer2": "In a relationship"
|
"answer2": "En couple"
|
||||||
},
|
},
|
||||||
"/element-resonates": {
|
"/element-resonates": {
|
||||||
"title": "Which element resonates with you most?",
|
"title": "Quel élément résonne le plus en vous ?",
|
||||||
"answer1": "Water",
|
"answer1": "Eau",
|
||||||
"answer2": "Fire",
|
"answer2": "Feu",
|
||||||
"answer3": "Air",
|
"answer3": "Air",
|
||||||
"answer4": "Earth"
|
"answer4": "Terre"
|
||||||
},
|
},
|
||||||
"/favorite-color": {
|
"/favorite-color": {
|
||||||
"title": "Which color do you like the most?",
|
"title": "Quelle couleur préférez-vous ?",
|
||||||
"answer1": "Blue",
|
"answer1": "Bleu",
|
||||||
"answer2": "Green",
|
"answer2": "Vert",
|
||||||
"answer3": "Orange",
|
"answer3": "Orange",
|
||||||
"answer4": "Violet",
|
"answer4": "Violet",
|
||||||
"answer5": "Red",
|
"answer5": "Rouge",
|
||||||
"answer6": "Yellow"
|
"answer6": "Jaune"
|
||||||
},
|
},
|
||||||
"/head-or-heart": {
|
"/head-or-heart": {
|
||||||
"title": "Do you make decisions with your head or your heart?",
|
"title": "Prenez-vous vos décisions avec votre tête ou votre cœur ?",
|
||||||
"answer1": "Heart",
|
"answer1": "Cœur",
|
||||||
"answer2": "Head",
|
"answer2": "Tête",
|
||||||
"answer3": "Both"
|
"answer3": "Les deux"
|
||||||
},
|
},
|
||||||
"/relate-following": {
|
"/relate-following": {
|
||||||
"title": "Do you relate to the following:",
|
"title": "Vous identifiez-vous aux affirmations suivantes :",
|
||||||
"question1": "I find solace and comfort in spending time alone.",
|
"question1": "Je trouve du réconfort et de la consolation à passer du temps seul.",
|
||||||
"question2": "I value and enjoy my own company.",
|
"question2": "J'apprécie et j'aime ma propre compagnie.",
|
||||||
"question3": "I prefer socializing in groups rather than spending time alone.",
|
"question3": "Je préfère socialiser en groupe plutôt que de passer du temps seul.",
|
||||||
"question4": "Loneliness is something I actively try to avoid.",
|
"question4": "La solitude est quelque chose que j'essaie d'éviter activement.",
|
||||||
"question5": "I enjoy activities that I can do independently.",
|
"question5": "J'apprécie les activités que je peux faire de manière indépendante.",
|
||||||
"strongly_agree": "Strongly Agree",
|
"strongly_agree": "Tout à fait d'accord",
|
||||||
"strongly_disagree": "Strongly Disagree"
|
"strongly_disagree": "Pas du tout d'accord"
|
||||||
},
|
},
|
||||||
"/let-scan": {
|
"/let-scan": {
|
||||||
"title": "Let`s scan your palms",
|
"title": "Scannons vos paumes",
|
||||||
"text": "Follow the on-screen instructions, so we can analyze your palm lines and reveal your future, and the secrets of your destiny!"
|
"text": "Suivez les instructions à l'écran pour que nous puissions analyser les lignes de vos paumes et vous révéler votre avenir ainsi que les secrets de votre destin !"
|
||||||
},
|
},
|
||||||
"biometric_data": "No biometric data collected. All recognition process performs on your device.",
|
|
||||||
"/scan-instruction": {
|
"/scan-instruction": {
|
||||||
"title": "Take your palm picture as instructed",
|
"title": "Prenez la photo de votre paume comme indiqué",
|
||||||
"button": "Take a picture now"
|
"button": "Prenez une photo maintenant"
|
||||||
},
|
},
|
||||||
"/email": {
|
"/email": {
|
||||||
"title": "Enter your email to get your advanced Palmistry reading with AURA",
|
"title": "Entrez votre email pour obtenir votre lecture avancée de chiromancie avec AURA",
|
||||||
"not_share": "We don’t share any personal information.",
|
"not_share": "Nous ne partageons aucune information personnelle.",
|
||||||
"placeholder_email": "Votre e-mail",
|
"placeholder_email": "Votre email",
|
||||||
"placeholder_name": "Votre nom"
|
"placeholder_name": "Votre nom"
|
||||||
},
|
},
|
||||||
"went_wrong": "Something went wrong.",
|
|
||||||
"app_number_one": {
|
"app_number_one": {
|
||||||
"text": "The <color> app trusted by over 25 million people.",
|
"text": "L'application <color> de confiance pour plus de 25 millions de personnes.",
|
||||||
"color": "#1 Astrology"
|
"color": "#1 en astrologie"
|
||||||
},
|
},
|
||||||
"/trial-payment": {
|
"/trial-payment": {
|
||||||
"palm_is_ready": {
|
"palm_is_ready": {
|
||||||
"title": "Your Palm Reading <color>",
|
"title": "Votre lecture de paume <color>",
|
||||||
"title_color": "Is Ready",
|
"title_color": "est prête",
|
||||||
"description": "“I’ve just received your palm scan results. Let’s discuss!”",
|
"description": "“Je viens de recevoir les résultats de votre scan de paume. Discutons-en !”",
|
||||||
"text1": "<color> 6 years in palmistry readings and spiritual guidance.",
|
"text1": "<color> 6 ans d'expérience en lecture de paume et guidance spirituelle.",
|
||||||
"text1_color": "Akho",
|
"text1_color": "Akho",
|
||||||
"text2": "Choose from 80+ palm readers and astrologers."
|
"text2": "Choisissez parmi plus de 80 lecteurs de paume et astrologues."
|
||||||
},
|
},
|
||||||
"joined_today": {
|
"joined_today": {
|
||||||
"text1": "Unlimited chats with a palm reader",
|
"text1": "Chats illimités avec un lecteur de paume",
|
||||||
"text2": "<count> people joined today"
|
"text2": "<count> personnes ont rejoint aujourd'hui"
|
||||||
},
|
},
|
||||||
"get_personal_prediction": "Get personal prediction",
|
"get_personal_prediction": "Obtenez votre prédiction personnelle",
|
||||||
"how_work": {
|
"how_work": {
|
||||||
"title": "How does AURA work?",
|
"title": "Comment fonctionne AURA ?",
|
||||||
"point1_title": "Send us your palm scan",
|
"point1_title": "Envoyez-nous votre scan de paume",
|
||||||
"point1_text": "We analyze your palm lines to get hints about your future",
|
"point1_text": "Nous analysons les lignes de votre paume pour obtenir des indices sur votre futur",
|
||||||
"point2_title": "Your palm reading is generated",
|
"point2_title": "Votre lecture de paume est générée",
|
||||||
"point2_text": "One of our professional palm readers puts together a report filled with hints about your future",
|
"point2_text": "L'un de nos lecteurs de paume professionnels réalise un rapport rempli d'indices sur votre avenir",
|
||||||
"point3_title": "Start your trial to receive your prediction",
|
"point3_title": "Commencez votre essai pour recevoir votre prédiction",
|
||||||
"point3_text": "Once you’re a AURA member, we’ll send over your prediction report so you can begin living a better life.",
|
"point3_text": "Une fois membre d'AURA, nous vous enverrons votre rapport de prédiction pour que vous puissiez commencer à vivre une vie meilleure.",
|
||||||
"point4_title": "Talk with a palm reading specialist anytime",
|
"point4_title": "Discutez avec un spécialiste de la lecture de paume à tout moment",
|
||||||
"point4_text": "Get ongoing support by discussing your readings, personal horoscopes, and compatibilities with our expert team."
|
"point4_text": "Bénéficiez d'un soutien continu en discutant de vos lectures, de vos horoscopes personnels et de vos compatibilités avec notre équipe d'experts."
|
||||||
},
|
},
|
||||||
"money_back_guarantee": {
|
"money_back_guarantee": {
|
||||||
"title": "100% Money-back Guarantee",
|
"title": "Garantie de remboursement à 100 %",
|
||||||
"text": "If you don’t notice any progress after using the app for at least a week, we are ready to make a complete refund within 14 days."
|
"text": "Si vous ne remarquez aucun progrès après avoir utilisé l'application pendant au moins une semaine, nous sommes prêts à effectuer un remboursement complet dans les 14 jours."
|
||||||
},
|
},
|
||||||
"begin_trial_now": "Begin Trial Now",
|
"begin_trial_now": "Commencez l'essai maintenant",
|
||||||
"what_included": {
|
"what_included": {
|
||||||
"title": "What’s included?",
|
"title": "Qu'est-ce qui est inclus ?",
|
||||||
"point1": "<bold> palm readings",
|
"point1": "<bold> lectures de paume",
|
||||||
"point1_bold": "Unlimited",
|
"point1_bold": "Illimitées",
|
||||||
"point2": "<bold> with professional astrologers",
|
"point2": "<bold> avec des astrologues professionnels",
|
||||||
"point2_bold": "1:1 live chats",
|
"point2_bold": "Chats en direct 1:1",
|
||||||
"point3": "<bold> readings",
|
"point3": "<bold> lectures ",
|
||||||
"point3_bold": "Daily compatibility",
|
"point3_bold": "Compatibilité quotidienne",
|
||||||
"point4": "Cosmic relationship tips",
|
"point4": "Conseils de relation cosmique",
|
||||||
"point5": "Daily horoscopes"
|
"point5": "Horoscopes quotidiens"
|
||||||
},
|
},
|
||||||
"palms_say_about": {
|
"palms_say_about": {
|
||||||
"title": "What do your palms say about you?",
|
"title": "Que disent vos paumes sur vous ?",
|
||||||
"point1": "<color> shows your attitude to love and the quality of love",
|
"point1": "<color> montre votre attitude envers l'amour et la qualité de l'amour",
|
||||||
"point1_color": "Love line",
|
"point1_color": "Ligne de cœur",
|
||||||
"point2": "A long thumb indicates good fortune",
|
"point2": "Un pouce long indique une bonne fortune",
|
||||||
"point3": "<color> reflects your in telligence and mentality",
|
"point3": "<color> reflète votre intelligence et votre mentalité",
|
||||||
"point3_color": "Head line",
|
"point3_color": "Ligne de tête",
|
||||||
"point4": "A long index finger indicates a natural leader",
|
"point4": "Un index long indique un leader naturel",
|
||||||
"point5": "<color> defines the quality of your life and what you will achieve",
|
"point5": "<color> définit la qualité de votre vie et ce que vous allez accomplir",
|
||||||
"point5_color": "Life line",
|
"point5_color": "Ligne de vie",
|
||||||
"point6": "A short middle finger reveals a free spirit",
|
"point6": "Un majeur court révèle un esprit libre",
|
||||||
"point7": "<color> represents your material achievement and career goals",
|
"point7": "<color> représente vos réalisations matérielles et vos objectifs de carrière",
|
||||||
"point7_color": "Fate line",
|
"point7_color": "Ligne de destinée",
|
||||||
"point8": "A long ring finger reveals that a person tends to take risks",
|
"point8": "Un annulaire long révèle qu'une personne a tendance à prendre des risques",
|
||||||
"point9": "A short little finger indicates the person's lack of self-confidence"
|
"point9": "Un petit doigt court indique un manque de confiance en soi"
|
||||||
},
|
},
|
||||||
"discover_more": "Discover More",
|
"discover_more": "Découvrez plus",
|
||||||
"why_love": "Why does everyone <color> ?",
|
"why_love": "Pourquoi tout le monde <color> ?",
|
||||||
"why_love_color": "love AURA",
|
"why_love_color": "aime AURA",
|
||||||
"reviews": {
|
"reviews": {
|
||||||
"username1": "Rebecca Bauman",
|
"username1": "Rebecca Bauman",
|
||||||
"tagline1": "\"It’s changed my life!\"",
|
"tagline1": "\"Cela a changé ma vie !\"",
|
||||||
"text1": "I'm thankful for this app and Akho! She's an excellent palm reader and astrologer—clear, thorough, and reassuring. I eagerly look forward to more sessions with her!",
|
"text1": "Je suis reconnaissante pour cette application et Akho ! Elle est une excellente lectrice de paume et astrologue—clairvoyante, minutieuse, et rassurante. J'ai hâte d'avoir plus de sessions avec elle !",
|
||||||
"username2": "Mika Ryan",
|
"username2": "Mika Ryan",
|
||||||
"tagline2": "\"After years of seeking, I’ve finally found a true love.\"",
|
"tagline2": "\"Après des années de recherche, j'ai enfin trouvé un véritable amour.\"",
|
||||||
"text2": "I was hesitant about whether it was really worth trying, but now I have no regrets and I'm enjoying my new relationships!",
|
"text2": "J'hésitais à essayer, mais maintenant je ne regrette rien et je savoure mes nouvelles relations !",
|
||||||
"username3": "Amanda Holmes",
|
"username3": "Amanda Holmes",
|
||||||
"tagline3": "\"I’ve found a job I really enjoy.\"",
|
"tagline3": "\"J'ai trouvé un emploi que j'aime vraiment.\"",
|
||||||
"text3": "Thanks to Vladana, I've finally discovered a clue about what my life's purpose really is and what kind of job resonates with me better!"
|
"text3": "Grâce à Vladana, j'ai enfin découvert un indice sur le vrai but de ma vie et le type de travail qui me convient le mieux !"
|
||||||
},
|
},
|
||||||
"success_story": "Become a AURA Success Story!",
|
"success_story": "Devenez une Success Story d'AURA !",
|
||||||
"as_seen_in": "<color> As Seen in",
|
"as_seen_in": "<color> Vu dans",
|
||||||
"footer": {
|
"footer": {
|
||||||
"text1": "Questions? We’re here to help",
|
"text1": "Des questions ? Nous sommes là pour vous aider",
|
||||||
"text2": "Customer Support",
|
"text2": "Service client",
|
||||||
"text3": "Help Center"
|
"text3": "Centre d'aide"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/payment": {
|
"/payment": {
|
||||||
"will_be_charged_trial_info": "<trialPrice> for your <trialDuration>-day trial",
|
"will_be_charged_trial_info": "<trialPrice> pour votre essai de <trialDuration> jours",
|
||||||
"will_be_charged_email_reminder": "email you a reminder",
|
"will_be_charged_email_reminder": "vous envoyer un rappel par email",
|
||||||
"will_be_charged": "You will be charged only <trialInfo>. Then <fullPrice> <trialPrice> per week. Save <save> every week. We’ll <emailReminder> before your trial ends.",
|
"will_be_charged": "Vous serez facturé seulement <trialInfo>. Puis <fullPrice> <trialPrice> par semaine. Économisez <save> chaque semaine. Nous <emailReminder> avant la fin de votre période d'essai.",
|
||||||
"payment_information": {
|
"payment_information": {
|
||||||
"personalized_offer": "Personalized offer reserved",
|
"personalized_offer": "Offre personnalisée réservée",
|
||||||
"title": "Start your <trialDuration>-day trial",
|
"title": "Commencez votre essai de <trialDuration> jours",
|
||||||
"total_today": "Total today",
|
"total_today": "Total aujourd'hui",
|
||||||
"code_applied_bold": "AURA24",
|
"code_applied_bold": "AURA24",
|
||||||
"code_applied": "Code <bold> applied!"
|
"code_applied": "Code <bold> appliqué !"
|
||||||
},
|
},
|
||||||
"guarantees": {
|
"guarantees": {
|
||||||
"no_commitment": "No commitment. Cancel anytime.",
|
"no_commitment": "Pas d'engagement. Annulez à tout moment.",
|
||||||
"30_day_money_back": "30-Day Money-Back Guarantee"
|
"30_day_money_back": "Garantie de remboursement de 30 jours"
|
||||||
},
|
},
|
||||||
"get_personal_prediction": "Get personal prediction",
|
"get_personal_prediction": "Obtenez votre prédiction personnelle",
|
||||||
"total_due": "Total due today: <trialPrice>",
|
"total_due": "Montant dû aujourd'hui : <trialPrice>",
|
||||||
"app_number_one_color": "25 million people.",
|
"app_number_one_color": "25 millions de personnes.",
|
||||||
"app_number_one": "The #1 Astrology app trusted by over <color>"
|
"app_number_one": "L'application #1 en astrologie de confiance pour plus de <color>"
|
||||||
}
|
},
|
||||||
}
|
"/camera": {
|
||||||
|
"bad_photo": "Mauvaise photo !",
|
||||||
|
"try_again": "Réessayez",
|
||||||
|
"do_better": "Vous pouvez faire mieux",
|
||||||
|
"next": "Suivant"
|
||||||
|
},
|
||||||
|
"threadId": "thread_KNANusbK37DIDwNprdf4rP7g",
|
||||||
|
"assistantId": "asst_S7CdLkyxnbrzPFfL2YM916px",
|
||||||
|
"v": "v1",
|
||||||
|
"config": "fr.male"
|
||||||
|
}
|
||||||
@ -1,184 +1,250 @@
|
|||||||
{
|
{
|
||||||
"next": "Next",
|
"next": "Próximo",
|
||||||
|
"privacy_policy": "Ao continuar, você concorda com nosso <eulaLink> e <privacyLink>. Tem alguma dúvida? Fale com nossa equipe de suporte <clickHere>",
|
||||||
|
"eula_link": "EULA",
|
||||||
|
"privacy_notice": "Aviso de Privacidade",
|
||||||
|
"policy_here": "aqui",
|
||||||
|
"thumb": "Polegar",
|
||||||
|
"index_finger": "Dedo indicador",
|
||||||
|
"middle_finger": "Dedo médio",
|
||||||
|
"ring_finger": "Dedo anelar",
|
||||||
|
"pinky": "Dedo mindinho",
|
||||||
|
"skip_trial": "Pular Teste",
|
||||||
|
"add_consultant": "Adicionar Consultor",
|
||||||
|
"add_guides": "Adicionar Guias",
|
||||||
|
"access_product": "Acessar Produto",
|
||||||
|
"thank_you": "Obrigada!",
|
||||||
|
"order_successful": "Seu pedido foi realizado com sucesso!",
|
||||||
|
"biometric_data": "Nenhum dado biométrico é coletado. Todo o processo de reconhecimento é realizado no seu dispositivo.",
|
||||||
|
"went_wrong": "Algo deu errado.",
|
||||||
|
"/scanned-photo": {
|
||||||
|
"title": "Estamos preparando uma leitura completa de Quiromancia só para você!",
|
||||||
|
"text": "Uau, parece que há muito que podemos contar sobre seu futuro ambicioso e autoconfiante."
|
||||||
|
},
|
||||||
|
"aura_paywall_palmistry_main": {
|
||||||
|
"text_0": "Ajudamos milhões de pessoas a revelar o destino de suas vidas amorosas e o que o futuro reserva para elas e suas famílias.",
|
||||||
|
"text_1": "Custa-nos R$13,21 para compensar nossos funcionários da AURA pelo teste, mas por favor, escolha o valor com o qual você se sinta confortável."
|
||||||
|
},
|
||||||
|
"/skip-trial": {
|
||||||
|
"title": "Não está pensando em voltar atrás?",
|
||||||
|
"price_per_week": "<price> por semana",
|
||||||
|
"billing_period": "Período de cobrança",
|
||||||
|
"billed_amount": "Valor cobrado",
|
||||||
|
"billed_in_4_weeks": "Cobrado em 4 semanas",
|
||||||
|
"start_trial": {
|
||||||
|
"every_week": "Toda semana",
|
||||||
|
"start_trial": "Iniciar teste"
|
||||||
|
},
|
||||||
|
"skip_trial": {
|
||||||
|
"save": "economize <save>%",
|
||||||
|
"every_4_weeks": "A cada 4 semanas",
|
||||||
|
"skip_trial": "Aceitar oferta e pular o teste"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/add-consultant": {
|
||||||
|
"more_for_you": "Mais para você",
|
||||||
|
"exclusive_offer": "Oferta exclusiva recomendada para você alcançar seus objetivos mais rapidamente",
|
||||||
|
"your_unique_consultation": "Sua consulta individual exclusiva",
|
||||||
|
"30-minute": "Consulta privada de 30 minutos com um especialista",
|
||||||
|
"description": "Você pode solicitar previsões do futuro, análise de compatibilidade de vida, compatibilidade amorosa, etc.",
|
||||||
|
"one_time_price_offer": "Oferta de preço único: ",
|
||||||
|
"original_price": "Preço original: <oldPrice> <discount>",
|
||||||
|
"you_will_be_charged": "*Você será cobrada pelos serviços ou ofertas adicionais selecionadas no momento da compra.\n Este é um pagamento único.",
|
||||||
|
"get_my_consultation": "Obtenha minha consulta",
|
||||||
|
"discount_save": "Economize",
|
||||||
|
"caution": "Atenção!",
|
||||||
|
"caution_text": "Para evitar cobranças duplas, por favor não feche a página nem volte.",
|
||||||
|
"unlock_profound": "Desbloqueie insights profundos sobre sua personalidade, relacionamentos, trajetória de carreira e momentos decisivos da vida através da astrologia, capacitand a fazer escolhas informadas e alcançar maior realização.",
|
||||||
|
"choose_from": "Escolha entre mais de 80 astrólogos especialistas."
|
||||||
|
},
|
||||||
"/find-your-happiness": {
|
"/find-your-happiness": {
|
||||||
"title": "Find your happiness with highly-personalized predictions.",
|
"title": "Encontre sua felicidade com previsões altamente personalizadas.",
|
||||||
"point1": "rated by real users",
|
"point1": "avaliado por usuários reais",
|
||||||
"point2": "93.4% Accuracy",
|
"point2": "93,4% de precisão",
|
||||||
"point3": "20m users’ choice",
|
"point3": "Escolha de 20 milhões de usuárias",
|
||||||
"point4": "4.8 satisfaction sco",
|
"point4": "4,8 de pontuação de satisfação",
|
||||||
"text": "Understand your self and improve relationships with astrology"
|
"text": "Compreenda-se melhor e melhore seus relacionamentos com a astrologia"
|
||||||
},
|
},
|
||||||
"/gender": {
|
"/gender": {
|
||||||
"title": "What’s your gender?",
|
"title": "Qual é o seu gênero?",
|
||||||
"description": "In Palmistry, everyone is a blend of masculine and feminine, so it helps to know yours."
|
"description": "Na quiromancia, todos são uma mistura de masculino e feminino, por isso é útil saber o seu.",
|
||||||
|
"already_have_account": "Já tem uma conta? Entrar"
|
||||||
},
|
},
|
||||||
"/birthdate": {
|
"/birthdate": {
|
||||||
"title": "What’s your date of birth?",
|
"title": "Qual é a sua data de nascimento?",
|
||||||
"text": "Your birth date reveals your core personality traits, needs and desires."
|
"text": "Sua data de nascimento revela seus traços de personalidade fundamentais, necessidades e desejos."
|
||||||
},
|
},
|
||||||
"/palms-information": {
|
"/palms-information": {
|
||||||
"title": "Your palms hold a wealth of information about your fate and personality."
|
"title": "Suas palmas carregam uma riqueza de informações sobre seu destino e sua personalidade."
|
||||||
},
|
},
|
||||||
"/what-aspects": {
|
"/what-aspects": {
|
||||||
"title": "What aspects of your life do you wish to gain insight into through palmistry?",
|
"title": "Quais aspectos da sua vida você deseja explorar através da quiromancia?",
|
||||||
"answer1": "Love & Relationships",
|
"answer1": "Amor & Relacionamentos",
|
||||||
"answer2": "Health & Vitality",
|
"answer2": "Saúde & Vitalidade",
|
||||||
"answer3": "Career & Destiny"
|
"answer3": "Carreira & Destino"
|
||||||
},
|
},
|
||||||
"/relationship-status": {
|
"/relationship-status": {
|
||||||
"title": "So we can get to know you better, please tell us your relationship status",
|
"title": "Para que possamos conhecê-la melhor, por favor nos diga seu status de relacionamento",
|
||||||
"answer1": "Single",
|
"answer1": "Solteira",
|
||||||
"answer2": "In a relationship"
|
"answer2": "Em um relacionamento"
|
||||||
},
|
},
|
||||||
"/element-resonates": {
|
"/element-resonates": {
|
||||||
"title": "Which element resonates with you most?",
|
"title": "Com qual elemento você mais se identifica?",
|
||||||
"answer1": "Water",
|
"answer1": "Água",
|
||||||
"answer2": "Fire",
|
"answer2": "Fogo",
|
||||||
"answer3": "Air",
|
"answer3": "Ar",
|
||||||
"answer4": "Earth"
|
"answer4": "Terra"
|
||||||
},
|
},
|
||||||
"/favorite-color": {
|
"/favorite-color": {
|
||||||
"title": "Which color do you like the most?",
|
"title": "Qual é a sua cor preferida?",
|
||||||
"answer1": "Blue",
|
"answer1": "Azul",
|
||||||
"answer2": "Green",
|
"answer2": "Verde",
|
||||||
"answer3": "Orange",
|
"answer3": "Laranja",
|
||||||
"answer4": "Violet",
|
"answer4": "Violeta",
|
||||||
"answer5": "Red",
|
"answer5": "Vermelho",
|
||||||
"answer6": "Yellow"
|
"answer6": "Amarelo"
|
||||||
},
|
},
|
||||||
"/head-or-heart": {
|
"/head-or-heart": {
|
||||||
"title": "Do you make decisions with your head or your heart?",
|
"title": "Você toma decisões com a cabeça ou com o coração?",
|
||||||
"answer1": "Heart",
|
"answer1": "Coração",
|
||||||
"answer2": "Head",
|
"answer2": "Cabeça",
|
||||||
"answer3": "Both"
|
"answer3": "Ambos"
|
||||||
},
|
},
|
||||||
"/relate-following": {
|
"/relate-following": {
|
||||||
"title": "Do you relate to the following:",
|
"title": "Você se identifica com o seguinte:",
|
||||||
"question1": "I find solace and comfort in spending time alone.",
|
"question1": "Encontro conforto e alívio em passar tempo sozinha.",
|
||||||
"question2": "I value and enjoy my own company.",
|
"question2": "Valorizo e aprecio minha própria companhia.",
|
||||||
"question3": "I prefer socializing in groups rather than spending time alone.",
|
"question3": "Prefiro socializar em grupos do que passar tempo sozinha.",
|
||||||
"question4": "Loneliness is something I actively try to avoid.",
|
"question4": "A solidão é algo que tento evitar ativamente.",
|
||||||
"question5": "I enjoy activities that I can do independently.",
|
"question5": "Gosto de atividades que posso fazer de forma independente.",
|
||||||
"strongly_agree": "Strongly Agree",
|
"strongly_agree": "Concordo Plenamente",
|
||||||
"strongly_disagree": "Strongly Disagree"
|
"strongly_disagree": "Discordo Completamente"
|
||||||
},
|
},
|
||||||
"/let-scan": {
|
"/let-scan": {
|
||||||
"title": "Let`s scan your palms",
|
"title": "Vamos escanear suas palmas",
|
||||||
"text": "Follow the on-screen instructions, so we can analyze your palm lines and reveal your future, and the secrets of your destiny!"
|
"text": "Siga as instruções na tela, para que possamos analisar suas linhas da palma e revelar seu futuro, e os segredos do seu destino!"
|
||||||
},
|
},
|
||||||
"biometric_data": "No biometric data collected. All recognition process performs on your device.",
|
|
||||||
"/scan-instruction": {
|
"/scan-instruction": {
|
||||||
"title": "Take your palm picture as instructed",
|
"title": "Tire a foto da sua palma conforme instruído",
|
||||||
"button": "Take a picture now"
|
"button": "Tirar foto agora"
|
||||||
},
|
},
|
||||||
"/email": {
|
"/email": {
|
||||||
"title": "Enter your email to get your advanced Palmistry reading with AURA",
|
"title": "Digite seu e-mail para receber sua leitura avançada de Quiromancia com a AURA",
|
||||||
"not_share": "We don’t share any personal information.",
|
"not_share": "Não compartilhamos nenhuma informação pessoal.",
|
||||||
"placeholder_email": "Seu email",
|
"placeholder_email": "Seu e-mail",
|
||||||
"placeholder_name": "Seu nome"
|
"placeholder_name": "Seu nome"
|
||||||
},
|
},
|
||||||
"went_wrong": "Something went wrong.",
|
|
||||||
"app_number_one": {
|
"app_number_one": {
|
||||||
"text": "The <color> app trusted by over 25 million people.",
|
"text": "O app <color> confiado por mais de 25 milhões de pessoas.",
|
||||||
"color": "#1 Astrology"
|
"color": "#1 em Astrologia"
|
||||||
},
|
},
|
||||||
"/trial-payment": {
|
"/trial-payment": {
|
||||||
"palm_is_ready": {
|
"palm_is_ready": {
|
||||||
"title": "Your Palm Reading <color>",
|
"title": "Sua Leitura de Palma <color>",
|
||||||
"title_color": "Is Ready",
|
"title_color": "Está Pronta",
|
||||||
"description": "“I’ve just received your palm scan results. Let’s discuss!”",
|
"description": "“Acabei de receber os resultados do seu escaneamento da palma. Vamos conversar!”",
|
||||||
"text1": "<color> 6 years in palmistry readings and spiritual guidance.",
|
"text1": "<color> 6 anos em leituras de quiromancia e orientação espiritual.",
|
||||||
"text1_color": "Akho",
|
"text1_color": "Akho",
|
||||||
"text2": "Choose from 80+ palm readers and astrologers."
|
"text2": "Escolha entre mais de 80 leituristas de palmas e astrólogos."
|
||||||
},
|
},
|
||||||
"joined_today": {
|
"joined_today": {
|
||||||
"text1": "Unlimited chats with a palm reader",
|
"text1": "Converse ilimitadamente com um leiturista de palmas",
|
||||||
"text2": "<count> people joined today"
|
"text2": "<count> pessoas se juntaram hoje"
|
||||||
},
|
},
|
||||||
"get_personal_prediction": "Get personal prediction",
|
"get_personal_prediction": "Receba sua previsão pessoal",
|
||||||
"how_work": {
|
"how_work": {
|
||||||
"title": "How does AURA work?",
|
"title": "Como funciona a AURA?",
|
||||||
"point1_title": "Send us your palm scan",
|
"point1_title": "Envie-nos seu escaneamento da palma",
|
||||||
"point1_text": "We analyze your palm lines to get hints about your future",
|
"point1_text": "Analisamos suas linhas da palma para obter pistas sobre seu futuro",
|
||||||
"point2_title": "Your palm reading is generated",
|
"point2_title": "Sua leitura de palma é gerada",
|
||||||
"point2_text": "One of our professional palm readers puts together a report filled with hints about your future",
|
"point2_text": "Um de nossos leituristas de palmas profissionais elabora um relatório com pistas sobre seu futuro",
|
||||||
"point3_title": "Start your trial to receive your prediction",
|
"point3_title": "Inicie seu teste para receber sua previsão",
|
||||||
"point3_text": "Once you’re a AURA member, we’ll send over your prediction report so you can begin living a better life.",
|
"point3_text": "Depois de se tornar membro da AURA, enviaremos seu relatório de previsões para que você possa começar a viver uma vida melhor.",
|
||||||
"point4_title": "Talk with a palm reading specialist anytime",
|
"point4_title": "Converse com uma especialista em leitura de palmas a qualquer momento",
|
||||||
"point4_text": "Get ongoing support by discussing your readings, personal horoscopes, and compatibilities with our expert team."
|
"point4_text": "Obtenha suporte contínuo discutindo suas leituras, horóscopos pessoais, e compatibilidades com nossa equipe de especialistas."
|
||||||
},
|
},
|
||||||
"money_back_guarantee": {
|
"money_back_guarantee": {
|
||||||
"title": "100% Money-back Guarantee",
|
"title": "Garantia de Devolução do Dinheiro 100%",
|
||||||
"text": "If you don’t notice any progress after using the app for at least a week, we are ready to make a complete refund within 14 days."
|
"text": "Se você não perceber nenhum progresso após usar o aplicativo por pelo menos uma semana, estamos prontos para fazer um reembolso completo em até 14 dias."
|
||||||
},
|
},
|
||||||
"begin_trial_now": "Begin Trial Now",
|
"begin_trial_now": "Iniciar Teste Agora",
|
||||||
"what_included": {
|
"what_included": {
|
||||||
"title": "What’s included?",
|
"title": "O que está incluído?",
|
||||||
"point1": "<bold> palm readings",
|
"point1": "<bold> leituras de palma",
|
||||||
"point1_bold": "Unlimited",
|
"point1_bold": "Ilimitadas",
|
||||||
"point2": "<bold> with professional astrologers",
|
"point2": "<bold> com astrólogos profissionais",
|
||||||
"point2_bold": "1:1 live chats",
|
"point2_bold": "Chats ao vivo 1:1",
|
||||||
"point3": "<bold> readings",
|
"point3": "<bold> leituras",
|
||||||
"point3_bold": "Daily compatibility",
|
"point3_bold": "Compatibilidade diária",
|
||||||
"point4": "Cosmic relationship tips",
|
"point4": "Dicas de relacionamento cósmico",
|
||||||
"point5": "Daily horoscopes"
|
"point5": "Horóscopos diários"
|
||||||
},
|
},
|
||||||
"palms_say_about": {
|
"palms_say_about": {
|
||||||
"title": "What do your palms say about you?",
|
"title": "O que suas palmas dizem sobre você?",
|
||||||
"point1": "<color> shows your attitude to love and the quality of love",
|
"point1": "<color> mostra sua atitude em relação ao amor e a qualidade do amor",
|
||||||
"point1_color": "Love line",
|
"point1_color": "Linha do amor",
|
||||||
"point2": "A long thumb indicates good fortune",
|
"point2": "Um polegar longo indica boa sorte",
|
||||||
"point3": "<color> reflects your in telligence and mentality",
|
"point3": "<color> reflete sua inteligência e mentalidade",
|
||||||
"point3_color": "Head line",
|
"point3_color": "Linha da cabeça",
|
||||||
"point4": "A long index finger indicates a natural leader",
|
"point4": "Um dedo indicador longo indica uma líder nata",
|
||||||
"point5": "<color> defines the quality of your life and what you will achieve",
|
"point5": "<color> define a qualidade da sua vida e o que você vai alcançar",
|
||||||
"point5_color": "Life line",
|
"point5_color": "Linha da vida",
|
||||||
"point6": "A short middle finger reveals a free spirit",
|
"point6": "Um dedo médio curto revela um espírito livre",
|
||||||
"point7": "<color> represents your material achievement and career goals",
|
"point7": "<color> representa sua realização material e metas de carreira",
|
||||||
"point7_color": "Fate line",
|
"point7_color": "Linha do destino",
|
||||||
"point8": "A long ring finger reveals that a person tends to take risks",
|
"point8": "Um dedo anelar longo revela que a pessoa tende a assumir riscos",
|
||||||
"point9": "A short little finger indicates the person's lack of self-confidence"
|
"point9": "Um dedo mindinho curto indica falta de autoconfiança da pessoa"
|
||||||
},
|
},
|
||||||
"discover_more": "Discover More",
|
"discover_more": "Descubra Mais",
|
||||||
"why_love": "Why does everyone <color> ?",
|
"why_love": "Por que todas <color> ?",
|
||||||
"why_love_color": "love AURA",
|
"why_love_color": "amam AURA",
|
||||||
"reviews": {
|
"reviews": {
|
||||||
"username1": "Rebecca Bauman",
|
"username1": "Rebecca Bauman",
|
||||||
"tagline1": "\"It’s changed my life!\"",
|
"tagline1": "\"Isso mudou minha vida!\"",
|
||||||
"text1": "I'm thankful for this app and Akho! She's an excellent palm reader and astrologer—clear, thorough, and reassuring. I eagerly look forward to more sessions with her!",
|
"text1": "Estou grata por este app e pela Akho! Ela é uma excelente leiturista de palmas e astróloga — clara, completa e tranquilizadora. Estou ansiosa para mais sessões com ela!",
|
||||||
"username2": "Mika Ryan",
|
"username2": "Mika Ryan",
|
||||||
"tagline2": "\"After years of seeking, I’ve finally found a true love.\"",
|
"tagline2": "\"Após anos de busca, finalmente encontrei um verdadeiro amor.\"",
|
||||||
"text2": "I was hesitant about whether it was really worth trying, but now I have no regrets and I'm enjoying my new relationships!",
|
"text2": "Eu estava hesitante sobre se realmente valia a pena tentar, mas agora não tenho arrependimentos e estou aproveitando meus novos relacionamentos!",
|
||||||
"username3": "Amanda Holmes",
|
"username3": "Amanda Holmes",
|
||||||
"tagline3": "\"I’ve found a job I really enjoy.\"",
|
"tagline3": "\"Encontrei um trabalho de que realmente gosto.\"",
|
||||||
"text3": "Thanks to Vladana, I've finally discovered a clue about what my life's purpose really is and what kind of job resonates with me better!"
|
"text3": "Graças a Vladana, finalmente descobri uma pista sobre qual é o propósito real da minha vida e que tipo de trabalho ressoa melhor comigo!"
|
||||||
},
|
},
|
||||||
"success_story": "Become a AURA Success Story!",
|
"success_story": "Torne-se uma História de Sucesso da AURA!",
|
||||||
"as_seen_in": "<color> As Seen in",
|
"as_seen_in": "<color> Como Visto em",
|
||||||
"footer": {
|
"footer": {
|
||||||
"text1": "Questions? We’re here to help",
|
"text1": "Dúvidas? Estamos aqui para ajudar",
|
||||||
"text2": "Customer Support",
|
"text2": "Suporte ao Cliente",
|
||||||
"text3": "Help Center"
|
"text3": "Centro de Ajuda"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/payment": {
|
"/payment": {
|
||||||
"will_be_charged_trial_info": "<trialPrice> for your <trialDuration>-day trial",
|
"will_be_charged_trial_info": "<trialPrice> para o seu teste de <trialDuration> dias",
|
||||||
"will_be_charged_email_reminder": "email you a reminder",
|
"will_be_charged_email_reminder": "enviaremos um lembrete por e-mail",
|
||||||
"will_be_charged": "You will be charged only <trialInfo>. Then <fullPrice> <trialPrice> per week. Save <save> every week. We’ll <emailReminder> before your trial ends.",
|
"will_be_charged": "Você será cobrada apenas <trialInfo>. Depois <fullPrice> <trialPrice> por semana. Economize <save> toda semana. Nós <emailReminder> antes do término do seu teste.",
|
||||||
"payment_information": {
|
"payment_information": {
|
||||||
"personalized_offer": "Personalized offer reserved",
|
"personalized_offer": "Oferta personalizada reservada",
|
||||||
"title": "Start your <trialDuration>-day trial",
|
"title": "Inicie seu teste de <trialDuration> dias",
|
||||||
"total_today": "Total today",
|
"total_today": "Total hoje",
|
||||||
"code_applied_bold": "AURA24",
|
"code_applied_bold": "AURA24",
|
||||||
"code_applied": "Code <bold> applied!"
|
"code_applied": "Código <bold> aplicado!"
|
||||||
},
|
},
|
||||||
"guarantees": {
|
"guarantees": {
|
||||||
"no_commitment": "No commitment. Cancel anytime.",
|
"no_commitment": "Sem compromisso. Cancele a qualquer momento.",
|
||||||
"30_day_money_back": "30-Day Money-Back Guarantee"
|
"30_day_money_back": "Garantia de Devolução do Dinheiro em 30 Dias"
|
||||||
},
|
},
|
||||||
"get_personal_prediction": "Get personal prediction",
|
"get_personal_prediction": "Receber previsão pessoal",
|
||||||
"total_due": "Total due today: <trialPrice>",
|
"total_due": "Total devido hoje: <trialPrice>",
|
||||||
"app_number_one_color": "25 million people.",
|
"app_number_one_color": "25 milhões de pessoas.",
|
||||||
"app_number_one": "The #1 Astrology app trusted by over <color>"
|
"app_number_one": "O aplicativo de Astrologia #1 confiado por mais de <color>"
|
||||||
}
|
},
|
||||||
}
|
"/camera": {
|
||||||
|
"bad_photo": "Foto ruim!",
|
||||||
|
"try_again": "Tente novamente",
|
||||||
|
"do_better": "Você pode fazer melhor",
|
||||||
|
"next": "Próximo"
|
||||||
|
},
|
||||||
|
"threadId": "thread_5DHPHJCto7O6Ds562ZzlNvfb",
|
||||||
|
"assistantId": "asst_fwZP6CoRS4qS4znOTVQWTj8o",
|
||||||
|
"v": "v1",
|
||||||
|
"config": "pt-br.female"
|
||||||
|
}
|
||||||
@ -1,184 +1,250 @@
|
|||||||
{
|
{
|
||||||
"next": "Next",
|
"next": "Próximo",
|
||||||
|
"privacy_policy": "Ao continuar, você concorda com nosso <eulaLink> e <privacyLink>. Tem alguma dúvida? Fale com nossa equipe de suporte <clickHere>",
|
||||||
|
"eula_link": "EULA",
|
||||||
|
"privacy_notice": "Aviso de Privacidade",
|
||||||
|
"policy_here": "aqui",
|
||||||
|
"thumb": "Polegar",
|
||||||
|
"index_finger": "Indicador",
|
||||||
|
"middle_finger": "Dedo médio",
|
||||||
|
"ring_finger": "Anular",
|
||||||
|
"pinky": "Mínimo",
|
||||||
|
"skip_trial": "Pular Avaliação",
|
||||||
|
"add_consultant": "Adicionar Consultor",
|
||||||
|
"add_guides": "Adicionar Guias",
|
||||||
|
"access_product": "Acessar Produto",
|
||||||
|
"thank_you": "Obrigado!",
|
||||||
|
"order_successful": "Seu pedido foi realizado com sucesso!",
|
||||||
|
"biometric_data": "Nenhum dado biométrico é coletado. Todo o processo de reconhecimento é realizado no seu dispositivo.",
|
||||||
|
"went_wrong": "Algo deu errado.",
|
||||||
|
"/scanned-photo": {
|
||||||
|
"title": "Estamos preparando uma leitura de Quiromancia completa especialmente para você!",
|
||||||
|
"text": "Uau, parece que há muito o que podemos revelar sobre seu futuro ambicioso e autoconfiante."
|
||||||
|
},
|
||||||
|
"aura_paywall_palmistry_main": {
|
||||||
|
"text_0": "Ajudamos milhões de pessoas a descobrirem o destino de suas vidas amorosas e o que o futuro reserva para elas e suas famílias.",
|
||||||
|
"text_1": "Nos custa R$ 13,21 para compensar nossos colaboradores da AURA pela avaliação, mas escolha o valor com o qual você se sente confortável."
|
||||||
|
},
|
||||||
|
"/skip-trial": {
|
||||||
|
"title": "Sem planos de olhar para trás?",
|
||||||
|
"price_per_week": "<price> por semana",
|
||||||
|
"billing_period": "Período de cobrança",
|
||||||
|
"billed_amount": "Valor cobrado",
|
||||||
|
"billed_in_4_weeks": "Cobrança em 4 semanas",
|
||||||
|
"start_trial": {
|
||||||
|
"every_week": "Toda semana",
|
||||||
|
"start_trial": "Iniciar avaliação"
|
||||||
|
},
|
||||||
|
"skip_trial": {
|
||||||
|
"save": "economize <save>%",
|
||||||
|
"every_4_weeks": "A cada 4 semanas",
|
||||||
|
"skip_trial": "Aceitar oferta e pular avaliação"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/add-consultant": {
|
||||||
|
"more_for_you": "Mais para você",
|
||||||
|
"exclusive_offer": "Oferta exclusiva recomendada para você alcançar seus objetivos mais rapidamente",
|
||||||
|
"your_unique_consultation": "Sua consulta individual única",
|
||||||
|
"30-minute": "Consulta privada de 30 minutos com um especialista",
|
||||||
|
"description": "Você pode pedir previsão do futuro, análise de compatibilidade ao vivo; compatibilidade amorosa, etc.",
|
||||||
|
"one_time_price_offer": "Oferta de preço único: ",
|
||||||
|
"original_price": "Preço original: <oldPrice> <discount>",
|
||||||
|
"you_will_be_charged": "*Você será cobrado pelos serviços ou ofertas selecionadas no momento da compra.\n Este é um pagamento não recorrente.",
|
||||||
|
"get_my_consultation": "Obter minha consulta",
|
||||||
|
"discount_save": "Economize",
|
||||||
|
"caution": "Atenção!",
|
||||||
|
"caution_text": "Para evitar cobranças duplas, por favor, não feche a página e não volte.",
|
||||||
|
"unlock_profound": "Desbloqueie insights profundos sobre sua personalidade, relacionamentos, trajetória de carreira e momentos decisivos da vida através da astrologia, capacitando você a tomar decisões informadas e alcançar maior satisfação.",
|
||||||
|
"choose_from": "Escolha entre mais de 80 astrólogos especialistas."
|
||||||
|
},
|
||||||
"/find-your-happiness": {
|
"/find-your-happiness": {
|
||||||
"title": "Find your happiness with highly-personalized predictions.",
|
"title": "Encontre sua felicidade com previsões altamente personalizadas.",
|
||||||
"point1": "rated by real users",
|
"point1": "avaliado por usuários reais",
|
||||||
"point2": "93.4% Accuracy",
|
"point2": "93,4% de Precisão",
|
||||||
"point3": "20m users’ choice",
|
"point3": "Escolha de 20 milhões de usuários",
|
||||||
"point4": "4.8 satisfaction sco",
|
"point4": "4,8 de índice de satisfação",
|
||||||
"text": "Understand your self and improve relationships with astrology"
|
"text": "Entenda a si mesmo e melhore os relacionamentos com a astrologia"
|
||||||
},
|
},
|
||||||
"/gender": {
|
"/gender": {
|
||||||
"title": "What’s your gender?",
|
"title": "Qual é o seu gênero?",
|
||||||
"description": "In Palmistry, everyone is a blend of masculine and feminine, so it helps to know yours."
|
"description": "Na Quiromancia, todos são uma mistura de masculino e feminino, então nos ajuda saber o seu.",
|
||||||
|
"already_have_account": "Já tem uma conta? Faça login"
|
||||||
},
|
},
|
||||||
"/birthdate": {
|
"/birthdate": {
|
||||||
"title": "What’s your date of birth?",
|
"title": "Qual é a sua data de nascimento?",
|
||||||
"text": "Your birth date reveals your core personality traits, needs and desires."
|
"text": "Sua data de nascimento revela seus traços de personalidade fundamentais, necessidades e desejos."
|
||||||
},
|
},
|
||||||
"/palms-information": {
|
"/palms-information": {
|
||||||
"title": "Your palms hold a wealth of information about your fate and personality."
|
"title": "Suas palmas carregam uma riqueza de informações sobre seu destino e personalidade."
|
||||||
},
|
},
|
||||||
"/what-aspects": {
|
"/what-aspects": {
|
||||||
"title": "What aspects of your life do you wish to gain insight into through palmistry?",
|
"title": "Sobre quais aspectos da sua vida você deseja obter insights através da quiromancia?",
|
||||||
"answer1": "Love & Relationships",
|
"answer1": "Amor e Relacionamentos",
|
||||||
"answer2": "Health & Vitality",
|
"answer2": "Saúde e Vitalidade",
|
||||||
"answer3": "Career & Destiny"
|
"answer3": "Carreira e Destino"
|
||||||
},
|
},
|
||||||
"/relationship-status": {
|
"/relationship-status": {
|
||||||
"title": "So we can get to know you better, please tell us your relationship status",
|
"title": "Para que possamos conhecê-lo melhor, por favor, nos diga seu status de relacionamento",
|
||||||
"answer1": "Single",
|
"answer1": "Solteiro",
|
||||||
"answer2": "In a relationship"
|
"answer2": "Em um relacionamento"
|
||||||
},
|
},
|
||||||
"/element-resonates": {
|
"/element-resonates": {
|
||||||
"title": "Which element resonates with you most?",
|
"title": "Com qual elemento você mais se identifica?",
|
||||||
"answer1": "Water",
|
"answer1": "Água",
|
||||||
"answer2": "Fire",
|
"answer2": "Fogo",
|
||||||
"answer3": "Air",
|
"answer3": "Ar",
|
||||||
"answer4": "Earth"
|
"answer4": "Terra"
|
||||||
},
|
},
|
||||||
"/favorite-color": {
|
"/favorite-color": {
|
||||||
"title": "Which color do you like the most?",
|
"title": "Qual cor você mais gosta?",
|
||||||
"answer1": "Blue",
|
"answer1": "Azul",
|
||||||
"answer2": "Green",
|
"answer2": "Verde",
|
||||||
"answer3": "Orange",
|
"answer3": "Laranja",
|
||||||
"answer4": "Violet",
|
"answer4": "Violeta",
|
||||||
"answer5": "Red",
|
"answer5": "Vermelho",
|
||||||
"answer6": "Yellow"
|
"answer6": "Amarelo"
|
||||||
},
|
},
|
||||||
"/head-or-heart": {
|
"/head-or-heart": {
|
||||||
"title": "Do you make decisions with your head or your heart?",
|
"title": "Você toma decisões com a cabeça ou com o coração?",
|
||||||
"answer1": "Heart",
|
"answer1": "Coração",
|
||||||
"answer2": "Head",
|
"answer2": "Cabeça",
|
||||||
"answer3": "Both"
|
"answer3": "Ambos"
|
||||||
},
|
},
|
||||||
"/relate-following": {
|
"/relate-following": {
|
||||||
"title": "Do you relate to the following:",
|
"title": "Você se identifica com o seguinte:",
|
||||||
"question1": "I find solace and comfort in spending time alone.",
|
"question1": "Encontro consolo e conforto em passar tempo sozinho.",
|
||||||
"question2": "I value and enjoy my own company.",
|
"question2": "Valorizo e aprecio minha própria companhia.",
|
||||||
"question3": "I prefer socializing in groups rather than spending time alone.",
|
"question3": "Prefiro socializar em grupos do que passar tempo sozinho.",
|
||||||
"question4": "Loneliness is something I actively try to avoid.",
|
"question4": "Solidão é algo que eu evito ativamente.",
|
||||||
"question5": "I enjoy activities that I can do independently.",
|
"question5": "Gosto de atividades que posso fazer de forma independente.",
|
||||||
"strongly_agree": "Strongly Agree",
|
"strongly_agree": "Concordo Plenamente",
|
||||||
"strongly_disagree": "Strongly Disagree"
|
"strongly_disagree": "Discordo Completamente"
|
||||||
},
|
},
|
||||||
"/let-scan": {
|
"/let-scan": {
|
||||||
"title": "Let`s scan your palms",
|
"title": "Vamos escanear suas palmas",
|
||||||
"text": "Follow the on-screen instructions, so we can analyze your palm lines and reveal your future, and the secrets of your destiny!"
|
"text": "Siga as instruções na tela, para que possamos analisar as linhas da sua palma e revelar seu futuro e os segredos do seu destino!"
|
||||||
},
|
},
|
||||||
"biometric_data": "No biometric data collected. All recognition process performs on your device.",
|
|
||||||
"/scan-instruction": {
|
"/scan-instruction": {
|
||||||
"title": "Take your palm picture as instructed",
|
"title": "Tire a foto da sua palma conforme as instruções",
|
||||||
"button": "Take a picture now"
|
"button": "Tirar a foto agora"
|
||||||
},
|
},
|
||||||
"/email": {
|
"/email": {
|
||||||
"title": "Enter your email to get your advanced Palmistry reading with AURA",
|
"title": "Digite seu e-mail para receber sua leitura avançada de Quiromancia com a AURA",
|
||||||
"not_share": "We don’t share any personal information.",
|
"not_share": "Não compartilhamos nenhuma informação pessoal.",
|
||||||
"placeholder_email": "Seu email",
|
"placeholder_email": "Seu e-mail",
|
||||||
"placeholder_name": "Seu nome"
|
"placeholder_name": "Seu nome"
|
||||||
},
|
},
|
||||||
"went_wrong": "Something went wrong.",
|
|
||||||
"app_number_one": {
|
"app_number_one": {
|
||||||
"text": "The <color> app trusted by over 25 million people.",
|
"text": "O aplicativo <color> confiado por mais de 25 milhões de pessoas.",
|
||||||
"color": "#1 Astrology"
|
"color": "#1 em Astrologia"
|
||||||
},
|
},
|
||||||
"/trial-payment": {
|
"/trial-payment": {
|
||||||
"palm_is_ready": {
|
"palm_is_ready": {
|
||||||
"title": "Your Palm Reading <color>",
|
"title": "Sua Leitura de Palma <color>",
|
||||||
"title_color": "Is Ready",
|
"title_color": "Está Pronta",
|
||||||
"description": "“I’ve just received your palm scan results. Let’s discuss!”",
|
"description": "“Acabei de receber os resultados do seu escaneamento de palma. Vamos discutir!”",
|
||||||
"text1": "<color> 6 years in palmistry readings and spiritual guidance.",
|
"text1": "<color> 6 anos em leituras de quiromancia e orientação espiritual.",
|
||||||
"text1_color": "Akho",
|
"text1_color": "Akho",
|
||||||
"text2": "Choose from 80+ palm readers and astrologers."
|
"text2": "Escolha entre mais de 80 leitores de palma e astrólogos."
|
||||||
},
|
},
|
||||||
"joined_today": {
|
"joined_today": {
|
||||||
"text1": "Unlimited chats with a palm reader",
|
"text1": "Chats ilimitados com um leitor de palma",
|
||||||
"text2": "<count> people joined today"
|
"text2": "<count> pessoas se juntaram hoje"
|
||||||
},
|
},
|
||||||
"get_personal_prediction": "Get personal prediction",
|
"get_personal_prediction": "Obter previsão pessoal",
|
||||||
"how_work": {
|
"how_work": {
|
||||||
"title": "How does AURA work?",
|
"title": "Como funciona a AURA?",
|
||||||
"point1_title": "Send us your palm scan",
|
"point1_title": "Envie-nos seu escaneamento de palma",
|
||||||
"point1_text": "We analyze your palm lines to get hints about your future",
|
"point1_text": "Analisamos as linhas da sua palma para obter dicas sobre seu futuro",
|
||||||
"point2_title": "Your palm reading is generated",
|
"point2_title": "Sua leitura de palma é gerada",
|
||||||
"point2_text": "One of our professional palm readers puts together a report filled with hints about your future",
|
"point2_text": "Um de nossos leitores profissionais de palma prepara um relatório cheio de dicas sobre seu futuro",
|
||||||
"point3_title": "Start your trial to receive your prediction",
|
"point3_title": "Inicie sua avaliação para receber sua previsão",
|
||||||
"point3_text": "Once you’re a AURA member, we’ll send over your prediction report so you can begin living a better life.",
|
"point3_text": "Assim que você se tornar um membro da AURA, enviaremos seu relatório de previsão para que você possa começar a viver uma vida melhor.",
|
||||||
"point4_title": "Talk with a palm reading specialist anytime",
|
"point4_title": "Converse com um especialista em leitura de palma a qualquer momento",
|
||||||
"point4_text": "Get ongoing support by discussing your readings, personal horoscopes, and compatibilities with our expert team."
|
"point4_text": "Obtenha suporte contínuo discutindo suas leituras, horóscopos pessoais e compatibilidades com nossa equipe de especialistas."
|
||||||
},
|
},
|
||||||
"money_back_guarantee": {
|
"money_back_guarantee": {
|
||||||
"title": "100% Money-back Guarantee",
|
"title": "Garantia de Devolução de Dinheiro 100%",
|
||||||
"text": "If you don’t notice any progress after using the app for at least a week, we are ready to make a complete refund within 14 days."
|
"text": "Se você não notar progresso após usar o app por pelo menos uma semana, estamos prontos para fazer um reembolso completo dentro de 14 dias."
|
||||||
},
|
},
|
||||||
"begin_trial_now": "Begin Trial Now",
|
"begin_trial_now": "Iniciar Avaliação Agora",
|
||||||
"what_included": {
|
"what_included": {
|
||||||
"title": "What’s included?",
|
"title": "O que está incluído?",
|
||||||
"point1": "<bold> palm readings",
|
"point1": "<bold> leituras de palma",
|
||||||
"point1_bold": "Unlimited",
|
"point1_bold": "Ilimitadas",
|
||||||
"point2": "<bold> with professional astrologers",
|
"point2": "<bold> com astrólogos profissionais",
|
||||||
"point2_bold": "1:1 live chats",
|
"point2_bold": "Chats ao vivo 1:1",
|
||||||
"point3": "<bold> readings",
|
"point3": "<bold> leituras",
|
||||||
"point3_bold": "Daily compatibility",
|
"point3_bold": "Compatibilidade diária",
|
||||||
"point4": "Cosmic relationship tips",
|
"point4": "Dicas de relacionamento cósmico",
|
||||||
"point5": "Daily horoscopes"
|
"point5": "Horóscopos diários"
|
||||||
},
|
},
|
||||||
"palms_say_about": {
|
"palms_say_about": {
|
||||||
"title": "What do your palms say about you?",
|
"title": "O que suas palmas dizem sobre você?",
|
||||||
"point1": "<color> shows your attitude to love and the quality of love",
|
"point1": "<color> mostra sua atitude em relação ao amor e à qualidade do amor",
|
||||||
"point1_color": "Love line",
|
"point1_color": "Linha do amor",
|
||||||
"point2": "A long thumb indicates good fortune",
|
"point2": "Um polegar longo indica boa sorte",
|
||||||
"point3": "<color> reflects your in telligence and mentality",
|
"point3": "<color> reflete sua inteligência e mentalidade",
|
||||||
"point3_color": "Head line",
|
"point3_color": "Linha da cabeça",
|
||||||
"point4": "A long index finger indicates a natural leader",
|
"point4": "Um dedo indicador longo indica um líder nato",
|
||||||
"point5": "<color> defines the quality of your life and what you will achieve",
|
"point5": "<color> define a qualidade de sua vida e o que você vai alcançar",
|
||||||
"point5_color": "Life line",
|
"point5_color": "Linha da vida",
|
||||||
"point6": "A short middle finger reveals a free spirit",
|
"point6": "Um dedo médio curto revela um espírito livre",
|
||||||
"point7": "<color> represents your material achievement and career goals",
|
"point7": "<color> representa seu sucesso material e objetivos de carreira",
|
||||||
"point7_color": "Fate line",
|
"point7_color": "Linha do destino",
|
||||||
"point8": "A long ring finger reveals that a person tends to take risks",
|
"point8": "Um dedo anelar longo revela que essa pessoa tende a correr riscos",
|
||||||
"point9": "A short little finger indicates the person's lack of self-confidence"
|
"point9": "Um dedo mínimo curto indica falta de autoconfiança da pessoa"
|
||||||
},
|
},
|
||||||
"discover_more": "Discover More",
|
"discover_more": "Descubra Mais",
|
||||||
"why_love": "Why does everyone <color> ?",
|
"why_love": "Por que todos <color> ?",
|
||||||
"why_love_color": "love AURA",
|
"why_love_color": "amam a AURA",
|
||||||
"reviews": {
|
"reviews": {
|
||||||
"username1": "Rebecca Bauman",
|
"username1": "Rebecca Bauman",
|
||||||
"tagline1": "\"It’s changed my life!\"",
|
"tagline1": "\"Mudou minha vida!\"",
|
||||||
"text1": "I'm thankful for this app and Akho! She's an excellent palm reader and astrologer—clear, thorough, and reassuring. I eagerly look forward to more sessions with her!",
|
"text1": "Estou grato por este app e pela Akho! Ela é uma excelente leitora de palma e astróloga — clara, completa e tranquilizadora. Mal posso esperar para mais sessões com ela!",
|
||||||
"username2": "Mika Ryan",
|
"username2": "Mika Ryan",
|
||||||
"tagline2": "\"After years of seeking, I’ve finally found a true love.\"",
|
"tagline2": "\"Depois de anos procurando, finalmente encontrei um verdadeiro amor.\"",
|
||||||
"text2": "I was hesitant about whether it was really worth trying, but now I have no regrets and I'm enjoying my new relationships!",
|
"text2": "Eu estava hesitante sobre se realmente valia a pena tentar, mas agora não tenho arrependimentos e estou aproveitando meus novos relacionamentos!",
|
||||||
"username3": "Amanda Holmes",
|
"username3": "Amanda Holmes",
|
||||||
"tagline3": "\"I’ve found a job I really enjoy.\"",
|
"tagline3": "\"Encontrei um trabalho que realmente aprecio.\"",
|
||||||
"text3": "Thanks to Vladana, I've finally discovered a clue about what my life's purpose really is and what kind of job resonates with me better!"
|
"text3": "Graças à Vladana, finalmente descobri uma pista sobre qual é realmente o propósito da minha vida e que tipo de trabalho ressoa melhor comigo!"
|
||||||
},
|
},
|
||||||
"success_story": "Become a AURA Success Story!",
|
"success_story": "Torne-se uma História de Sucesso da AURA!",
|
||||||
"as_seen_in": "<color> As Seen in",
|
"as_seen_in": "<color> Como Visto em",
|
||||||
"footer": {
|
"footer": {
|
||||||
"text1": "Questions? We’re here to help",
|
"text1": "Dúvidas? Estamos aqui para ajudar",
|
||||||
"text2": "Customer Support",
|
"text2": "Suporte ao Cliente",
|
||||||
"text3": "Help Center"
|
"text3": "Central de Ajuda"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/payment": {
|
"/payment": {
|
||||||
"will_be_charged_trial_info": "<trialPrice> for your <trialDuration>-day trial",
|
"will_be_charged_trial_info": "<trialPrice> pelo seu teste de <trialDuration> dias",
|
||||||
"will_be_charged_email_reminder": "email you a reminder",
|
"will_be_charged_email_reminder": "enviaremos um lembrete por e-mail",
|
||||||
"will_be_charged": "You will be charged only <trialInfo>. Then <fullPrice> <trialPrice> per week. Save <save> every week. We’ll <emailReminder> before your trial ends.",
|
"will_be_charged": "Você será cobrado apenas <trialInfo>. Depois, <fullPrice> <trialPrice> por semana. Economize <save> toda semana. Enviaremos um <emailReminder> antes do fim do seu teste.",
|
||||||
"payment_information": {
|
"payment_information": {
|
||||||
"personalized_offer": "Personalized offer reserved",
|
"personalized_offer": "Oferta personalizada reservada",
|
||||||
"title": "Start your <trialDuration>-day trial",
|
"title": "Inicie seu teste de <trialDuration> dias",
|
||||||
"total_today": "Total today",
|
"total_today": "Total hoje",
|
||||||
"code_applied_bold": "AURA24",
|
"code_applied_bold": "AURA24",
|
||||||
"code_applied": "Code <bold> applied!"
|
"code_applied": "Código <bold> aplicado!"
|
||||||
},
|
},
|
||||||
"guarantees": {
|
"guarantees": {
|
||||||
"no_commitment": "No commitment. Cancel anytime.",
|
"no_commitment": "Sem compromisso. Cancele a qualquer momento.",
|
||||||
"30_day_money_back": "30-Day Money-Back Guarantee"
|
"30_day_money_back": "Garantia de devolução de dinheiro em 30 dias"
|
||||||
},
|
},
|
||||||
"get_personal_prediction": "Get personal prediction",
|
"get_personal_prediction": "Obter previsão pessoal",
|
||||||
"total_due": "Total due today: <trialPrice>",
|
"total_due": "Total devido hoje: <trialPrice>",
|
||||||
"app_number_one_color": "25 million people.",
|
"app_number_one_color": "25 milhões de pessoas.",
|
||||||
"app_number_one": "The #1 Astrology app trusted by over <color>"
|
"app_number_one": "O aplicativo de Astrologia #1 confiado por mais de <color>"
|
||||||
}
|
},
|
||||||
}
|
"/camera": {
|
||||||
|
"bad_photo": "Foto ruim!",
|
||||||
|
"try_again": "Tente novamente",
|
||||||
|
"do_better": "Você pode fazer melhor",
|
||||||
|
"next": "Próximo"
|
||||||
|
},
|
||||||
|
"threadId": "thread_N3t1RI2FDHP2WlX0udphRX69",
|
||||||
|
"assistantId": "asst_HYocIZCZW44YB8CfNY9xG0Lm",
|
||||||
|
"v": "v1",
|
||||||
|
"config": "pt-br.male"
|
||||||
|
}
|
||||||
@ -1,184 +1,250 @@
|
|||||||
{
|
{
|
||||||
"next": "Next",
|
"next": "Próximo",
|
||||||
|
"privacy_policy": "Ao continuar, aceita nosso <eulaLink> e nossa <privacyLink>. Tem alguma dúvida? Contacte o nosso suporte <clickHere>",
|
||||||
|
"eula_link": "EULA",
|
||||||
|
"privacy_notice": "Aviso de Privacidade",
|
||||||
|
"policy_here": "aqui",
|
||||||
|
"thumb": "Dedo polegar",
|
||||||
|
"index_finger": "Dedo indicador",
|
||||||
|
"middle_finger": "Dedo médio",
|
||||||
|
"ring_finger": "Dedo anelar",
|
||||||
|
"pinky": "Dedo mindinho",
|
||||||
|
"skip_trial": "Pular Teste",
|
||||||
|
"add_consultant": "Adicionar Consultor",
|
||||||
|
"add_guides": "Adicionar Guias",
|
||||||
|
"access_product": "Acessar Produto",
|
||||||
|
"thank_you": "Obrigada!",
|
||||||
|
"order_successful": "A sua encomenda foi bem-sucedida!",
|
||||||
|
"biometric_data": "Nenhum dado biométrico é recolhido. Todo o processo de reconhecimento é realizado no seu dispositivo.",
|
||||||
|
"went_wrong": "Algo deu errado.",
|
||||||
|
"/scanned-photo": {
|
||||||
|
"title": "Estamos a preparar uma Leitura de Quiromancia completa só para si!",
|
||||||
|
"text": "Uau, parece que há muito que podemos revelar sobre o seu futuro ambicioso e autoconfiante."
|
||||||
|
},
|
||||||
|
"aura_paywall_palmistry_main": {
|
||||||
|
"text_0": "Ajudámos milhões de pessoas a desvendar o destino da sua vida amorosa e o que o futuro reserva para elas e suas famílias.",
|
||||||
|
"text_1": "Custa-nos 13,21€ para compensar os nossos colaboradores da AURA pelo teste, mas, por favor, escolha o valor com que se sente confortável."
|
||||||
|
},
|
||||||
|
"/skip-trial": {
|
||||||
|
"title": "Não tenciona olhar para trás?",
|
||||||
|
"price_per_week": "<price> por semana",
|
||||||
|
"billing_period": "Período de faturação",
|
||||||
|
"billed_amount": "Montante faturado",
|
||||||
|
"billed_in_4_weeks": "Faturado em 4 semanas",
|
||||||
|
"start_trial": {
|
||||||
|
"every_week": "Todas as semanas",
|
||||||
|
"start_trial": "Iniciar teste"
|
||||||
|
},
|
||||||
|
"skip_trial": {
|
||||||
|
"save": "poupe <save>%",
|
||||||
|
"every_4_weeks": "A cada 4 semanas",
|
||||||
|
"skip_trial": "Aceitar oferta e pular teste"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/add-consultant": {
|
||||||
|
"more_for_you": "Mais para si",
|
||||||
|
"exclusive_offer": "Oferta exclusiva recomendada para atingir os seus objetivos mais rapidamente",
|
||||||
|
"your_unique_consultation": "A sua consulta individual única",
|
||||||
|
"30-minute": "Consulta privada de 30 minutos com um especialista",
|
||||||
|
"description": "Pode pedir previsão do futuro, análise de compatibilidade de vida; compatibilidade amorosa, etc.",
|
||||||
|
"one_time_price_offer": "Oferta de preço único: ",
|
||||||
|
"original_price": "Preço original: <oldPrice> <discount>",
|
||||||
|
"you_will_be_charged": "*Será cobrado pelos serviços adicionais ou ofertas selecionadas no momento da compra.\n Este é um pagamento não recorrente.",
|
||||||
|
"get_my_consultation": "Obter a minha consulta",
|
||||||
|
"discount_save": "Poupar",
|
||||||
|
"caution": "Cuidado!",
|
||||||
|
"caution_text": "Para evitar cobranças duplicadas, por favor não feche a página nem volte atrás.",
|
||||||
|
"unlock_profound": "Descubra insights profundos sobre a sua personalidade, relações, trajetória de carreira e os momentos determinantes da vida através da astrologia, capacitando-a a tomar decisões informadas e alcançar maior realização.",
|
||||||
|
"choose_from": "Escolha entre mais de 80 astrólogos especialistas."
|
||||||
|
},
|
||||||
"/find-your-happiness": {
|
"/find-your-happiness": {
|
||||||
"title": "Find your happiness with highly-personalized predictions.",
|
"title": "Encontre a sua felicidade com previsões altamente personalizadas.",
|
||||||
"point1": "rated by real users",
|
"point1": "avaliado por utilizadores reais",
|
||||||
"point2": "93.4% Accuracy",
|
"point2": "93,4% de Precisão",
|
||||||
"point3": "20m users’ choice",
|
"point3": "Escolha de 20 milhões de utilizadores",
|
||||||
"point4": "4.8 satisfaction sco",
|
"point4": "Pontuação de satisfação de 4,8",
|
||||||
"text": "Understand your self and improve relationships with astrology"
|
"text": "Compreenda-se a si mesma e melhore relações com a astrologia"
|
||||||
},
|
},
|
||||||
"/gender": {
|
"/gender": {
|
||||||
"title": "What’s your gender?",
|
"title": "Qual é o seu género?",
|
||||||
"description": "In Palmistry, everyone is a blend of masculine and feminine, so it helps to know yours."
|
"description": "Na quiromancia, todos somos uma mistura de masculino e feminino, por isso é útil saber o seu.",
|
||||||
|
"already_have_account": "Já tem uma conta? Inicie sessão"
|
||||||
},
|
},
|
||||||
"/birthdate": {
|
"/birthdate": {
|
||||||
"title": "What’s your date of birth?",
|
"title": "Qual é a sua data de nascimento?",
|
||||||
"text": "Your birth date reveals your core personality traits, needs and desires."
|
"text": "A sua data de nascimento revela os seus traços principais de personalidade, necessidades e desejos."
|
||||||
},
|
},
|
||||||
"/palms-information": {
|
"/palms-information": {
|
||||||
"title": "Your palms hold a wealth of information about your fate and personality."
|
"title": "As suas palmas contêm uma grande quantidade de informações sobre o seu destino e personalidade."
|
||||||
},
|
},
|
||||||
"/what-aspects": {
|
"/what-aspects": {
|
||||||
"title": "What aspects of your life do you wish to gain insight into through palmistry?",
|
"title": "Que aspectos da sua vida gostaria de explorar através da quiromancia?",
|
||||||
"answer1": "Love & Relationships",
|
"answer1": "Amor & Relacionamentos",
|
||||||
"answer2": "Health & Vitality",
|
"answer2": "Saúde & Vitalidade",
|
||||||
"answer3": "Career & Destiny"
|
"answer3": "Carreira & Destino"
|
||||||
},
|
},
|
||||||
"/relationship-status": {
|
"/relationship-status": {
|
||||||
"title": "So we can get to know you better, please tell us your relationship status",
|
"title": "Para a conhecermos melhor, por favor indique o seu estado civil",
|
||||||
"answer1": "Single",
|
"answer1": "Solteira",
|
||||||
"answer2": "In a relationship"
|
"answer2": "Num relacionamento"
|
||||||
},
|
},
|
||||||
"/element-resonates": {
|
"/element-resonates": {
|
||||||
"title": "Which element resonates with you most?",
|
"title": "Com qual elemento se identifica mais?",
|
||||||
"answer1": "Water",
|
"answer1": "Água",
|
||||||
"answer2": "Fire",
|
"answer2": "Fogo",
|
||||||
"answer3": "Air",
|
"answer3": "Ar",
|
||||||
"answer4": "Earth"
|
"answer4": "Terra"
|
||||||
},
|
},
|
||||||
"/favorite-color": {
|
"/favorite-color": {
|
||||||
"title": "Which color do you like the most?",
|
"title": "Qual a cor que mais lhe agrada?",
|
||||||
"answer1": "Blue",
|
"answer1": "Azul",
|
||||||
"answer2": "Green",
|
"answer2": "Verde",
|
||||||
"answer3": "Orange",
|
"answer3": "Laranja",
|
||||||
"answer4": "Violet",
|
"answer4": "Violeta",
|
||||||
"answer5": "Red",
|
"answer5": "Vermelho",
|
||||||
"answer6": "Yellow"
|
"answer6": "Amarelo"
|
||||||
},
|
},
|
||||||
"/head-or-heart": {
|
"/head-or-heart": {
|
||||||
"title": "Do you make decisions with your head or your heart?",
|
"title": "Toma decisões com a cabeça ou com o coração?",
|
||||||
"answer1": "Heart",
|
"answer1": "Coração",
|
||||||
"answer2": "Head",
|
"answer2": "Cabeça",
|
||||||
"answer3": "Both"
|
"answer3": "Ambos"
|
||||||
},
|
},
|
||||||
"/relate-following": {
|
"/relate-following": {
|
||||||
"title": "Do you relate to the following:",
|
"title": "Identifica-se com o seguinte:",
|
||||||
"question1": "I find solace and comfort in spending time alone.",
|
"question1": "Encontro consolo e conforto em passar tempo sozinha.",
|
||||||
"question2": "I value and enjoy my own company.",
|
"question2": "Valorizo e gosto da minha própria companhia.",
|
||||||
"question3": "I prefer socializing in groups rather than spending time alone.",
|
"question3": "Prefiro socializar em grupo do que passar tempo sozinha.",
|
||||||
"question4": "Loneliness is something I actively try to avoid.",
|
"question4": "A solidão é algo que evito ativamente.",
|
||||||
"question5": "I enjoy activities that I can do independently.",
|
"question5": "Gosto de atividades que posso fazer de forma independente.",
|
||||||
"strongly_agree": "Strongly Agree",
|
"strongly_agree": "Concordo Plenamente",
|
||||||
"strongly_disagree": "Strongly Disagree"
|
"strongly_disagree": "Discordo Plenamente"
|
||||||
},
|
},
|
||||||
"/let-scan": {
|
"/let-scan": {
|
||||||
"title": "Let`s scan your palms",
|
"title": "Vamos digitalizar as suas palmas",
|
||||||
"text": "Follow the on-screen instructions, so we can analyze your palm lines and reveal your future, and the secrets of your destiny!"
|
"text": "Siga as instruções no ecrã para que possamos analisar as suas linhas da palma e revelar o seu futuro e os segredos do seu destino!"
|
||||||
},
|
},
|
||||||
"biometric_data": "No biometric data collected. All recognition process performs on your device.",
|
|
||||||
"/scan-instruction": {
|
"/scan-instruction": {
|
||||||
"title": "Take your palm picture as instructed",
|
"title": "Tire a foto da sua palma conforme instruído",
|
||||||
"button": "Take a picture now"
|
"button": "Tirar foto agora"
|
||||||
},
|
},
|
||||||
"/email": {
|
"/email": {
|
||||||
"title": "Enter your email to get your advanced Palmistry reading with AURA",
|
"title": "Introduza o seu email para obter a sua leitura avançada de Quiromancia com a AURA",
|
||||||
"not_share": "We don’t share any personal information.",
|
"not_share": "Não partilhamos qualquer informação pessoal.",
|
||||||
"placeholder_email": "O teu email",
|
"placeholder_email": "O seu email",
|
||||||
"placeholder_name": "O teu nome"
|
"placeholder_name": "O seu nome"
|
||||||
},
|
},
|
||||||
"went_wrong": "Something went wrong.",
|
|
||||||
"app_number_one": {
|
"app_number_one": {
|
||||||
"text": "The <color> app trusted by over 25 million people.",
|
"text": "A app de <color> confiada por mais de 25 milhões de pessoas.",
|
||||||
"color": "#1 Astrology"
|
"color": "#1 Astrologia"
|
||||||
},
|
},
|
||||||
"/trial-payment": {
|
"/trial-payment": {
|
||||||
"palm_is_ready": {
|
"palm_is_ready": {
|
||||||
"title": "Your Palm Reading <color>",
|
"title": "A sua Leitura de Palma <color>",
|
||||||
"title_color": "Is Ready",
|
"title_color": "Está Pronta",
|
||||||
"description": "“I’ve just received your palm scan results. Let’s discuss!”",
|
"description": "“Acabei de receber os resultados da sua digitalização. Vamos discutir!”",
|
||||||
"text1": "<color> 6 years in palmistry readings and spiritual guidance.",
|
"text1": "<color> 6 anos em leituras de quiromancia e orientação espiritual.",
|
||||||
"text1_color": "Akho",
|
"text1_color": "Akho",
|
||||||
"text2": "Choose from 80+ palm readers and astrologers."
|
"text2": "Escolha entre mais de 80 leitores de palmas e astrólogos."
|
||||||
},
|
},
|
||||||
"joined_today": {
|
"joined_today": {
|
||||||
"text1": "Unlimited chats with a palm reader",
|
"text1": "Conversas ilimitadas com um leitor de palmas",
|
||||||
"text2": "<count> people joined today"
|
"text2": "<count> pessoas juntaram-se hoje"
|
||||||
},
|
},
|
||||||
"get_personal_prediction": "Get personal prediction",
|
"get_personal_prediction": "Obter previsão pessoal",
|
||||||
"how_work": {
|
"how_work": {
|
||||||
"title": "How does AURA work?",
|
"title": "Como funciona a AURA?",
|
||||||
"point1_title": "Send us your palm scan",
|
"point1_title": "Envie-nos a sua digitalização da palma",
|
||||||
"point1_text": "We analyze your palm lines to get hints about your future",
|
"point1_text": "Analisamos as suas linhas da palma para obter dicas sobre o seu futuro",
|
||||||
"point2_title": "Your palm reading is generated",
|
"point2_title": "A sua leitura de palma é gerada",
|
||||||
"point2_text": "One of our professional palm readers puts together a report filled with hints about your future",
|
"point2_text": "Um dos nossos leitores de palmas profissionais elabora um relatório cheio de dicas sobre o seu futuro",
|
||||||
"point3_title": "Start your trial to receive your prediction",
|
"point3_title": "Inicie o seu teste para receber a sua previsão",
|
||||||
"point3_text": "Once you’re a AURA member, we’ll send over your prediction report so you can begin living a better life.",
|
"point3_text": "Assim que se tornar membro da AURA, enviaremos o seu relatório de previsão para que possa começar a viver uma vida melhor.",
|
||||||
"point4_title": "Talk with a palm reading specialist anytime",
|
"point4_title": "Converse com um especialista em leitura de palmas a qualquer momento",
|
||||||
"point4_text": "Get ongoing support by discussing your readings, personal horoscopes, and compatibilities with our expert team."
|
"point4_text": "Obtenha suporte contínuo ao discutir as suas leituras, horóscopos pessoais e compatibilidades com a nossa equipa de especialistas."
|
||||||
},
|
},
|
||||||
"money_back_guarantee": {
|
"money_back_guarantee": {
|
||||||
"title": "100% Money-back Guarantee",
|
"title": "Garantia de Reembolso de 100%",
|
||||||
"text": "If you don’t notice any progress after using the app for at least a week, we are ready to make a complete refund within 14 days."
|
"text": "Se não notar progressos após usar a app por pelo menos uma semana, estamos prontos para fazer um reembolso completo dentro de 14 dias."
|
||||||
},
|
},
|
||||||
"begin_trial_now": "Begin Trial Now",
|
"begin_trial_now": "Iniciar Teste Agora",
|
||||||
"what_included": {
|
"what_included": {
|
||||||
"title": "What’s included?",
|
"title": "O que está incluído?",
|
||||||
"point1": "<bold> palm readings",
|
"point1": "<bold> leituras de palmas",
|
||||||
"point1_bold": "Unlimited",
|
"point1_bold": "Ilimitadas",
|
||||||
"point2": "<bold> with professional astrologers",
|
"point2": "<bold> com astrólogos profissionais",
|
||||||
"point2_bold": "1:1 live chats",
|
"point2_bold": "Conversas ao vivo 1:1",
|
||||||
"point3": "<bold> readings",
|
"point3": "<bold> leituras",
|
||||||
"point3_bold": "Daily compatibility",
|
"point3_bold": "Compatibilidade diária",
|
||||||
"point4": "Cosmic relationship tips",
|
"point4": "Dicas cósmicas para relacionamentos",
|
||||||
"point5": "Daily horoscopes"
|
"point5": "Horóscopos diários"
|
||||||
},
|
},
|
||||||
"palms_say_about": {
|
"palms_say_about": {
|
||||||
"title": "What do your palms say about you?",
|
"title": "O que dizem as suas palmas sobre si?",
|
||||||
"point1": "<color> shows your attitude to love and the quality of love",
|
"point1": "<color> mostra a sua atitude em relação ao amor e a qualidade do amor",
|
||||||
"point1_color": "Love line",
|
"point1_color": "Linha do amor",
|
||||||
"point2": "A long thumb indicates good fortune",
|
"point2": "Um polegar longo indica boa sorte",
|
||||||
"point3": "<color> reflects your in telligence and mentality",
|
"point3": "<color> reflete a sua inteligência e mentalidade",
|
||||||
"point3_color": "Head line",
|
"point3_color": "Linha da cabeça",
|
||||||
"point4": "A long index finger indicates a natural leader",
|
"point4": "Um dedo indicador longo indica um líder nato",
|
||||||
"point5": "<color> defines the quality of your life and what you will achieve",
|
"point5": "<color> define a qualidade da sua vida e o que irá alcançar",
|
||||||
"point5_color": "Life line",
|
"point5_color": "Linha da vida",
|
||||||
"point6": "A short middle finger reveals a free spirit",
|
"point6": "Um dedo médio curto revela um espírito livre",
|
||||||
"point7": "<color> represents your material achievement and career goals",
|
"point7": "<color> representa a sua realização material e objetivos de carreira",
|
||||||
"point7_color": "Fate line",
|
"point7_color": "Linha do destino",
|
||||||
"point8": "A long ring finger reveals that a person tends to take risks",
|
"point8": "Um dedo anelar longo revela que uma pessoa tende a correr riscos",
|
||||||
"point9": "A short little finger indicates the person's lack of self-confidence"
|
"point9": "Um dedo mindinho curto indica falta de autoconfiança da pessoa"
|
||||||
},
|
},
|
||||||
"discover_more": "Discover More",
|
"discover_more": "Descubra Mais",
|
||||||
"why_love": "Why does everyone <color> ?",
|
"why_love": "Por que todos <color> ?",
|
||||||
"why_love_color": "love AURA",
|
"why_love_color": "adoram a AURA",
|
||||||
"reviews": {
|
"reviews": {
|
||||||
"username1": "Rebecca Bauman",
|
"username1": "Rebecca Bauman",
|
||||||
"tagline1": "\"It’s changed my life!\"",
|
"tagline1": "\"Mudou a minha vida!\"",
|
||||||
"text1": "I'm thankful for this app and Akho! She's an excellent palm reader and astrologer—clear, thorough, and reassuring. I eagerly look forward to more sessions with her!",
|
"text1": "Estou grata por esta app e pela Akho! Ela é uma excelente leitora de palmas e astróloga—clara, minuciosa e tranquilizadora. Aguardo ansiosamente mais sessões com ela!",
|
||||||
"username2": "Mika Ryan",
|
"username2": "Mika Ryan",
|
||||||
"tagline2": "\"After years of seeking, I’ve finally found a true love.\"",
|
"tagline2": "\"Após anos à procura, finalmente encontrei um verdadeiro amor.\"",
|
||||||
"text2": "I was hesitant about whether it was really worth trying, but now I have no regrets and I'm enjoying my new relationships!",
|
"text2": "Estava hesitante sobre se realmente valia a pena tentar, mas agora não tenho arrependimentos e estou a aproveitar os meus novos relacionamentos!",
|
||||||
"username3": "Amanda Holmes",
|
"username3": "Amanda Holmes",
|
||||||
"tagline3": "\"I’ve found a job I really enjoy.\"",
|
"tagline3": "\"Encontrei um emprego que realmente gosto.\"",
|
||||||
"text3": "Thanks to Vladana, I've finally discovered a clue about what my life's purpose really is and what kind of job resonates with me better!"
|
"text3": "Graças à Vladana, finalmente descobri uma pista sobre qual é realmente o propósito da minha vida e que tipo de trabalho me satisfaz melhor!"
|
||||||
},
|
},
|
||||||
"success_story": "Become a AURA Success Story!",
|
"success_story": "Torne-se uma História de Sucesso da AURA!",
|
||||||
"as_seen_in": "<color> As Seen in",
|
"as_seen_in": "<color> Como visto em",
|
||||||
"footer": {
|
"footer": {
|
||||||
"text1": "Questions? We’re here to help",
|
"text1": "Questões? Estamos aqui para ajudar",
|
||||||
"text2": "Customer Support",
|
"text2": "Apoio ao Cliente",
|
||||||
"text3": "Help Center"
|
"text3": "Centro de Ajuda"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/payment": {
|
"/payment": {
|
||||||
"will_be_charged_trial_info": "<trialPrice> for your <trialDuration>-day trial",
|
"will_be_charged_trial_info": "<trialPrice> para o seu teste de <trialDuration> dias",
|
||||||
"will_be_charged_email_reminder": "email you a reminder",
|
"will_be_charged_email_reminder": "enviamos-lhe um lembrete por email",
|
||||||
"will_be_charged": "You will be charged only <trialInfo>. Then <fullPrice> <trialPrice> per week. Save <save> every week. We’ll <emailReminder> before your trial ends.",
|
"will_be_charged": "Só será cobrada <trialInfo>. Depois, <fullPrice> <trialPrice> por semana. Poupe <save> todas as semanas. Vamos <emailReminder> antes do término do seu teste.",
|
||||||
"payment_information": {
|
"payment_information": {
|
||||||
"personalized_offer": "Personalized offer reserved",
|
"personalized_offer": "Oferta personalizada reservada",
|
||||||
"title": "Start your <trialDuration>-day trial",
|
"title": "Inicie o seu teste de <trialDuration> dias",
|
||||||
"total_today": "Total today",
|
"total_today": "Total hoje",
|
||||||
"code_applied_bold": "AURA24",
|
"code_applied_bold": "AURA24",
|
||||||
"code_applied": "Code <bold> applied!"
|
"code_applied": "Código <bold> aplicado!"
|
||||||
},
|
},
|
||||||
"guarantees": {
|
"guarantees": {
|
||||||
"no_commitment": "No commitment. Cancel anytime.",
|
"no_commitment": "Sem compromisso. Cancele a qualquer momento.",
|
||||||
"30_day_money_back": "30-Day Money-Back Guarantee"
|
"30_day_money_back": "Garantia de Reembolso de 30 Dias"
|
||||||
},
|
},
|
||||||
"get_personal_prediction": "Get personal prediction",
|
"get_personal_prediction": "Obter previsão pessoal",
|
||||||
"total_due": "Total due today: <trialPrice>",
|
"total_due": "Total devido hoje: <trialPrice>",
|
||||||
"app_number_one_color": "25 million people.",
|
"app_number_one_color": "25 milhões de pessoas.",
|
||||||
"app_number_one": "The #1 Astrology app trusted by over <color>"
|
"app_number_one": "A app de Astrologia #1 confiada por mais de <color>"
|
||||||
}
|
},
|
||||||
}
|
"/camera": {
|
||||||
|
"bad_photo": "Má foto!",
|
||||||
|
"try_again": "Tente novamente",
|
||||||
|
"do_better": "Pode fazer melhor",
|
||||||
|
"next": "Próximo"
|
||||||
|
},
|
||||||
|
"threadId": "thread_8klvBwFRdCAcRK9QRNKjoQLH",
|
||||||
|
"assistantId": "asst_kNWqbxtyFMY71FtwlMHKgsQ6",
|
||||||
|
"v": "v1",
|
||||||
|
"config": "pt-pt.female"
|
||||||
|
}
|
||||||
@ -1,184 +1,250 @@
|
|||||||
{
|
{
|
||||||
"next": "Next",
|
"next": "Seguinte",
|
||||||
|
"privacy_policy": "Ao continuar, concorda com o nosso <eulaLink> e <privacyLink>. Tem alguma questão? Contacte a nossa equipa de apoio <clickHere>",
|
||||||
|
"eula_link": "EULA",
|
||||||
|
"privacy_notice": "Aviso de Privacidade",
|
||||||
|
"policy_here": "aqui",
|
||||||
|
"thumb": "Polegar",
|
||||||
|
"index_finger": "Dedo indicador",
|
||||||
|
"middle_finger": "Dedo médio",
|
||||||
|
"ring_finger": "Dedo anelar",
|
||||||
|
"pinky": "Dedo mínimo",
|
||||||
|
"skip_trial": "Saltar Teste",
|
||||||
|
"add_consultant": "Adicionar Consultor",
|
||||||
|
"add_guides": "Adicionar Guias",
|
||||||
|
"access_product": "Aceder ao Produto",
|
||||||
|
"thank_you": "Obrigado!",
|
||||||
|
"order_successful": "A sua encomenda foi realizada com sucesso!",
|
||||||
|
"biometric_data": "Não são recolhidos dados biométricos. Todo o processo de reconhecimento é realizado no seu dispositivo.",
|
||||||
|
"went_wrong": "Algo correu mal.",
|
||||||
|
"/scanned-photo": {
|
||||||
|
"title": "Estamos a preparar uma Leitura de Quiromancia abrangente só para si!",
|
||||||
|
"text": "Uau, parece que há muito que podemos dizer sobre o seu futuro ambicioso e confiante."
|
||||||
|
},
|
||||||
|
"aura_paywall_palmistry_main": {
|
||||||
|
"text_0": "Já ajudámos milhões de pessoas a revelar o destino da sua vida amorosa e o que o futuro reserva para elas e suas famílias.",
|
||||||
|
"text_1": "Custa-nos 13,21 € compensar os nossos funcionários da AURA pelo teste, mas escolha por favor o valor com o qual se sente confortável."
|
||||||
|
},
|
||||||
|
"/skip-trial": {
|
||||||
|
"title": "Sem planos de voltar atrás?",
|
||||||
|
"price_per_week": "<price> por semana",
|
||||||
|
"billing_period": "Período de faturação",
|
||||||
|
"billed_amount": "Valor faturado",
|
||||||
|
"billed_in_4_weeks": "Faturado em 4 semanas",
|
||||||
|
"start_trial": {
|
||||||
|
"every_week": "Todas as semanas",
|
||||||
|
"start_trial": "Iniciar teste"
|
||||||
|
},
|
||||||
|
"skip_trial": {
|
||||||
|
"save": "poupe <save>%",
|
||||||
|
"every_4_weeks": "A cada 4 semanas",
|
||||||
|
"skip_trial": "Aceitar oferta e saltar teste"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/add-consultant": {
|
||||||
|
"more_for_you": "Mais para si",
|
||||||
|
"exclusive_offer": "Oferta exclusiva recomendada para atingir os seus objetivos mais rapidamente",
|
||||||
|
"your_unique_consultation": "A sua consulta individual única",
|
||||||
|
"30-minute": "Consulta privada de 30 minutos com um especialista",
|
||||||
|
"description": "Pode pedir previsões para o futuro, análise de compatibilidade em direto; compatibilidade amorosa, etc.",
|
||||||
|
"one_time_price_offer": "Oferta de preço único: ",
|
||||||
|
"original_price": "Preço original: <oldPrice> <discount>",
|
||||||
|
"you_will_be_charged": "*Será cobrado pelos serviços ou ofertas adicionais selecionados no momento da compra.\n Este é um pagamento não recorrente.",
|
||||||
|
"get_my_consultation": "Obter a minha consulta",
|
||||||
|
"discount_save": "Poupar",
|
||||||
|
"caution": "Atenção!",
|
||||||
|
"caution_text": "Para evitar cobranças duplicadas, por favor, não feche a página e não volte atrás.",
|
||||||
|
"unlock_profound": "Descubra insights profundos sobre a sua personalidade, relações, trajetória de carreira e momentos cruciais da vida através da astrologia, capacitando-o a tomar decisões informadas e alcançar um maior bem-estar.",
|
||||||
|
"choose_from": "Escolha entre mais de 80 astrólogos especialistas."
|
||||||
|
},
|
||||||
"/find-your-happiness": {
|
"/find-your-happiness": {
|
||||||
"title": "Find your happiness with highly-personalized predictions.",
|
"title": "Encontre a sua felicidade com previsões altamente personalizadas.",
|
||||||
"point1": "rated by real users",
|
"point1": "avaliado por utilizadores reais",
|
||||||
"point2": "93.4% Accuracy",
|
"point2": "93,4% de precisão",
|
||||||
"point3": "20m users’ choice",
|
"point3": "Escolha de 20 milhões de utilizadores",
|
||||||
"point4": "4.8 satisfaction sco",
|
"point4": "4,8 de satisfação",
|
||||||
"text": "Understand your self and improve relationships with astrology"
|
"text": "Compreenda-se a si mesmo e melhore as suas relações com a astrologia"
|
||||||
},
|
},
|
||||||
"/gender": {
|
"/gender": {
|
||||||
"title": "What’s your gender?",
|
"title": "Qual é o seu género?",
|
||||||
"description": "In Palmistry, everyone is a blend of masculine and feminine, so it helps to know yours."
|
"description": "Na Quiromancia, todos são uma mistura de masculino e feminino, pelo que ajuda saber qual é o seu.",
|
||||||
|
"already_have_account": "Já tem uma conta? Iniciar sessão"
|
||||||
},
|
},
|
||||||
"/birthdate": {
|
"/birthdate": {
|
||||||
"title": "What’s your date of birth?",
|
"title": "Qual é a sua data de nascimento?",
|
||||||
"text": "Your birth date reveals your core personality traits, needs and desires."
|
"text": "A sua data de nascimento revela os seus traços principais de personalidade, necessidades e desejos."
|
||||||
},
|
},
|
||||||
"/palms-information": {
|
"/palms-information": {
|
||||||
"title": "Your palms hold a wealth of information about your fate and personality."
|
"title": "As suas palmas contêm uma abundância de informações sobre o seu destino e personalidade."
|
||||||
},
|
},
|
||||||
"/what-aspects": {
|
"/what-aspects": {
|
||||||
"title": "What aspects of your life do you wish to gain insight into through palmistry?",
|
"title": "Que aspetos da sua vida gostaria de compreender melhor através da quiromancia?",
|
||||||
"answer1": "Love & Relationships",
|
"answer1": "Amor e Relações",
|
||||||
"answer2": "Health & Vitality",
|
"answer2": "Saúde e Vitalidade",
|
||||||
"answer3": "Career & Destiny"
|
"answer3": "Carreira e Destino"
|
||||||
},
|
},
|
||||||
"/relationship-status": {
|
"/relationship-status": {
|
||||||
"title": "So we can get to know you better, please tell us your relationship status",
|
"title": "Para o conhecermos melhor, diga-nos o seu estado civil",
|
||||||
"answer1": "Single",
|
"answer1": "Solteiro",
|
||||||
"answer2": "In a relationship"
|
"answer2": "Numa relação"
|
||||||
},
|
},
|
||||||
"/element-resonates": {
|
"/element-resonates": {
|
||||||
"title": "Which element resonates with you most?",
|
"title": "Com qual elemento se identifica mais?",
|
||||||
"answer1": "Water",
|
"answer1": "Água",
|
||||||
"answer2": "Fire",
|
"answer2": "Fogo",
|
||||||
"answer3": "Air",
|
"answer3": "Ar",
|
||||||
"answer4": "Earth"
|
"answer4": "Terra"
|
||||||
},
|
},
|
||||||
"/favorite-color": {
|
"/favorite-color": {
|
||||||
"title": "Which color do you like the most?",
|
"title": "Qual é a sua cor favorita?",
|
||||||
"answer1": "Blue",
|
"answer1": "Azul",
|
||||||
"answer2": "Green",
|
"answer2": "Verde",
|
||||||
"answer3": "Orange",
|
"answer3": "Laranja",
|
||||||
"answer4": "Violet",
|
"answer4": "Violeta",
|
||||||
"answer5": "Red",
|
"answer5": "Vermelho",
|
||||||
"answer6": "Yellow"
|
"answer6": "Amarelo"
|
||||||
},
|
},
|
||||||
"/head-or-heart": {
|
"/head-or-heart": {
|
||||||
"title": "Do you make decisions with your head or your heart?",
|
"title": "Toma decisões com a cabeça ou o coração?",
|
||||||
"answer1": "Heart",
|
"answer1": "Coração",
|
||||||
"answer2": "Head",
|
"answer2": "Cabeça",
|
||||||
"answer3": "Both"
|
"answer3": "Ambos"
|
||||||
},
|
},
|
||||||
"/relate-following": {
|
"/relate-following": {
|
||||||
"title": "Do you relate to the following:",
|
"title": "Identifica-se com o seguinte:",
|
||||||
"question1": "I find solace and comfort in spending time alone.",
|
"question1": "Encontro consolo e conforto em passar tempo sozinho.",
|
||||||
"question2": "I value and enjoy my own company.",
|
"question2": "Valorizo e gosto da minha própria companhia.",
|
||||||
"question3": "I prefer socializing in groups rather than spending time alone.",
|
"question3": "Prefiro socializar em grupo do que passar tempo sozinho.",
|
||||||
"question4": "Loneliness is something I actively try to avoid.",
|
"question4": "A solidão é algo que evito ativamente.",
|
||||||
"question5": "I enjoy activities that I can do independently.",
|
"question5": "Gosto de atividades que posso fazer de forma independente.",
|
||||||
"strongly_agree": "Strongly Agree",
|
"strongly_agree": "Concordo plenamente",
|
||||||
"strongly_disagree": "Strongly Disagree"
|
"strongly_disagree": "Discordo plenamente"
|
||||||
},
|
},
|
||||||
"/let-scan": {
|
"/let-scan": {
|
||||||
"title": "Let`s scan your palms",
|
"title": "Vamos digitalizar as suas palmas",
|
||||||
"text": "Follow the on-screen instructions, so we can analyze your palm lines and reveal your future, and the secrets of your destiny!"
|
"text": "Siga as instruções no ecrã, para que possamos analisar as suas linhas palmares e revelar o seu futuro e os segredos do seu destino!"
|
||||||
},
|
},
|
||||||
"biometric_data": "No biometric data collected. All recognition process performs on your device.",
|
|
||||||
"/scan-instruction": {
|
"/scan-instruction": {
|
||||||
"title": "Take your palm picture as instructed",
|
"title": "Tire a fotografia da sua palma conforme instruído",
|
||||||
"button": "Take a picture now"
|
"button": "Tirar foto agora"
|
||||||
},
|
},
|
||||||
"/email": {
|
"/email": {
|
||||||
"title": "Enter your email to get your advanced Palmistry reading with AURA",
|
"title": "Insira o seu email para obter a sua leitura avançada de Quiromancia com a AURA",
|
||||||
"not_share": "We don’t share any personal information.",
|
"not_share": "Não partilhamos qualquer informação pessoal.",
|
||||||
"placeholder_email": "O teu email",
|
"placeholder_email": "O seu email",
|
||||||
"placeholder_name": "O teu nome"
|
"placeholder_name": "O seu nome"
|
||||||
},
|
},
|
||||||
"went_wrong": "Something went wrong.",
|
|
||||||
"app_number_one": {
|
"app_number_one": {
|
||||||
"text": "The <color> app trusted by over 25 million people.",
|
"text": "A aplicação <color> confiada por mais de 25 milhões de pessoas.",
|
||||||
"color": "#1 Astrology"
|
"color": "#1 Astrologia"
|
||||||
},
|
},
|
||||||
"/trial-payment": {
|
"/trial-payment": {
|
||||||
"palm_is_ready": {
|
"palm_is_ready": {
|
||||||
"title": "Your Palm Reading <color>",
|
"title": "A Sua Leitura de Quiromancia <color>",
|
||||||
"title_color": "Is Ready",
|
"title_color": "Está Pronta",
|
||||||
"description": "“I’ve just received your palm scan results. Let’s discuss!”",
|
"description": "“Acabei de receber os resultados da sua digitalização da palma da mão. Vamos conversar!”",
|
||||||
"text1": "<color> 6 years in palmistry readings and spiritual guidance.",
|
"text1": "<color> 6 anos em leituras de quiromancia e orientação espiritual.",
|
||||||
"text1_color": "Akho",
|
"text1_color": "Akho",
|
||||||
"text2": "Choose from 80+ palm readers and astrologers."
|
"text2": "Escolha entre mais de 80 leitores palmares e astrólogos."
|
||||||
},
|
},
|
||||||
"joined_today": {
|
"joined_today": {
|
||||||
"text1": "Unlimited chats with a palm reader",
|
"text1": "Conversas ilimitadas com um leitor de quiromancia",
|
||||||
"text2": "<count> people joined today"
|
"text2": "<count> pessoas juntaram-se hoje"
|
||||||
},
|
},
|
||||||
"get_personal_prediction": "Get personal prediction",
|
"get_personal_prediction": "Obtenha uma previsão pessoal",
|
||||||
"how_work": {
|
"how_work": {
|
||||||
"title": "How does AURA work?",
|
"title": "Como funciona a AURA?",
|
||||||
"point1_title": "Send us your palm scan",
|
"point1_title": "Envie-nos a sua digitalização da palma",
|
||||||
"point1_text": "We analyze your palm lines to get hints about your future",
|
"point1_text": "Analisamos as suas linhas palmares para obter pistas sobre o seu futuro",
|
||||||
"point2_title": "Your palm reading is generated",
|
"point2_title": "A sua leitura da palma é gerada",
|
||||||
"point2_text": "One of our professional palm readers puts together a report filled with hints about your future",
|
"point2_text": "Um dos nossos leitores palmares profissionais prepara um relatório repleto de pistas sobre o seu futuro",
|
||||||
"point3_title": "Start your trial to receive your prediction",
|
"point3_title": "Inicie o seu teste para receber a sua previsão",
|
||||||
"point3_text": "Once you’re a AURA member, we’ll send over your prediction report so you can begin living a better life.",
|
"point3_text": "Assim que for membro da AURA, enviaremos o relatório da sua previsão para que possa começar a viver uma vida melhor.",
|
||||||
"point4_title": "Talk with a palm reading specialist anytime",
|
"point4_title": "Converse com um especialista em leitura de quiromancia a qualquer momento",
|
||||||
"point4_text": "Get ongoing support by discussing your readings, personal horoscopes, and compatibilities with our expert team."
|
"point4_text": "Obtenha apoio contínuo discutindo as suas leituras, horóscopos pessoais e compatibilidades com a nossa equipa de especialistas."
|
||||||
},
|
},
|
||||||
"money_back_guarantee": {
|
"money_back_guarantee": {
|
||||||
"title": "100% Money-back Guarantee",
|
"title": "Garantia de Devolução de 100%",
|
||||||
"text": "If you don’t notice any progress after using the app for at least a week, we are ready to make a complete refund within 14 days."
|
"text": "Se não notar qualquer progresso após utilizar a aplicação por pelo menos uma semana, estaremos prontos para fazer um reembolso completo dentro de 14 dias."
|
||||||
},
|
},
|
||||||
"begin_trial_now": "Begin Trial Now",
|
"begin_trial_now": "Iniciar Teste Agora",
|
||||||
"what_included": {
|
"what_included": {
|
||||||
"title": "What’s included?",
|
"title": "O que está incluído?",
|
||||||
"point1": "<bold> palm readings",
|
"point1": "<bold> leituras palmares",
|
||||||
"point1_bold": "Unlimited",
|
"point1_bold": "Ilimitadas",
|
||||||
"point2": "<bold> with professional astrologers",
|
"point2": "<bold> com astrólogos profissionais",
|
||||||
"point2_bold": "1:1 live chats",
|
"point2_bold": "Conversas ao vivo 1:1",
|
||||||
"point3": "<bold> readings",
|
"point3": "<bold> leituras",
|
||||||
"point3_bold": "Daily compatibility",
|
"point3_bold": "Compatibilidade diária",
|
||||||
"point4": "Cosmic relationship tips",
|
"point4": "Dicas de relacionamento cósmico",
|
||||||
"point5": "Daily horoscopes"
|
"point5": "Horóscopos diários"
|
||||||
},
|
},
|
||||||
"palms_say_about": {
|
"palms_say_about": {
|
||||||
"title": "What do your palms say about you?",
|
"title": "O que dizem as suas palmas sobre si?",
|
||||||
"point1": "<color> shows your attitude to love and the quality of love",
|
"point1": "<color> mostra a sua atitude em relação ao amor e a qualidade do amor",
|
||||||
"point1_color": "Love line",
|
"point1_color": "Linha do Amor",
|
||||||
"point2": "A long thumb indicates good fortune",
|
"point2": "Um polegar longo indica boa fortuna",
|
||||||
"point3": "<color> reflects your in telligence and mentality",
|
"point3": "<color> reflete a sua inteligência e mentalidade",
|
||||||
"point3_color": "Head line",
|
"point3_color": "Linha da Cabeça",
|
||||||
"point4": "A long index finger indicates a natural leader",
|
"point4": "Um dedo indicador longo indica um líder natural",
|
||||||
"point5": "<color> defines the quality of your life and what you will achieve",
|
"point5": "<color> define a qualidade da sua vida e o que você alcançará",
|
||||||
"point5_color": "Life line",
|
"point5_color": "Linha da Vida",
|
||||||
"point6": "A short middle finger reveals a free spirit",
|
"point6": "Um dedo médio curto revela um espírito livre",
|
||||||
"point7": "<color> represents your material achievement and career goals",
|
"point7": "<color> representa a sua realização material e objetivos de carreira",
|
||||||
"point7_color": "Fate line",
|
"point7_color": "Linha do Destino",
|
||||||
"point8": "A long ring finger reveals that a person tends to take risks",
|
"point8": "Um dedo anelar longo revela que a pessoa tende a correr riscos",
|
||||||
"point9": "A short little finger indicates the person's lack of self-confidence"
|
"point9": "Um dedo mínimo curto indica a falta de autoconfiança da pessoa"
|
||||||
},
|
},
|
||||||
"discover_more": "Discover More",
|
"discover_more": "Descubra Mais",
|
||||||
"why_love": "Why does everyone <color> ?",
|
"why_love": "Por que todos <color> ?",
|
||||||
"why_love_color": "love AURA",
|
"why_love_color": "adoram a AURA",
|
||||||
"reviews": {
|
"reviews": {
|
||||||
"username1": "Rebecca Bauman",
|
"username1": "Rebecca Bauman",
|
||||||
"tagline1": "\"It’s changed my life!\"",
|
"tagline1": "\"Mudou a minha vida!\"",
|
||||||
"text1": "I'm thankful for this app and Akho! She's an excellent palm reader and astrologer—clear, thorough, and reassuring. I eagerly look forward to more sessions with her!",
|
"text1": "Estou grata por esta aplicação e pela Akho! Ela é uma excelente leitora de palmas e astróloga—clara, minuciosa e tranquilizadora. Mal posso esperar por mais sessões com ela!",
|
||||||
"username2": "Mika Ryan",
|
"username2": "Mika Ryan",
|
||||||
"tagline2": "\"After years of seeking, I’ve finally found a true love.\"",
|
"tagline2": "\"Após anos de procura, finalmente encontrei um verdadeiro amor.\"",
|
||||||
"text2": "I was hesitant about whether it was really worth trying, but now I have no regrets and I'm enjoying my new relationships!",
|
"text2": "Estava hesitante sobre se realmente valia a pena tentar, mas agora não tenho arrependimentos e estou a desfrutar dos meus novos relacionamentos!",
|
||||||
"username3": "Amanda Holmes",
|
"username3": "Amanda Holmes",
|
||||||
"tagline3": "\"I’ve found a job I really enjoy.\"",
|
"tagline3": "\"Encontrei um trabalho de que realmente gosto.\"",
|
||||||
"text3": "Thanks to Vladana, I've finally discovered a clue about what my life's purpose really is and what kind of job resonates with me better!"
|
"text3": "Graças à Vladana, finalmente descobri uma pista sobre qual é realmente o propósito da minha vida e que tipo de trabalho me encaixa melhor!"
|
||||||
},
|
},
|
||||||
"success_story": "Become a AURA Success Story!",
|
"success_story": "Torne-se uma História de Sucesso da AURA!",
|
||||||
"as_seen_in": "<color> As Seen in",
|
"as_seen_in": "<color> Como Visto em",
|
||||||
"footer": {
|
"footer": {
|
||||||
"text1": "Questions? We’re here to help",
|
"text1": "Tem perguntas? Estamos aqui para ajudar",
|
||||||
"text2": "Customer Support",
|
"text2": "Apoio ao Cliente",
|
||||||
"text3": "Help Center"
|
"text3": "Centro de Ajuda"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/payment": {
|
"/payment": {
|
||||||
"will_be_charged_trial_info": "<trialPrice> for your <trialDuration>-day trial",
|
"will_be_charged_trial_info": "<trialPrice> pelo seu teste de <trialDuration> dias",
|
||||||
"will_be_charged_email_reminder": "email you a reminder",
|
"will_be_charged_email_reminder": "enviar-lhe-emos um lembrete para o email",
|
||||||
"will_be_charged": "You will be charged only <trialInfo>. Then <fullPrice> <trialPrice> per week. Save <save> every week. We’ll <emailReminder> before your trial ends.",
|
"will_be_charged": "Ser-lhe-á cobrado apenas <trialInfo>. Depois <fullPrice> <trialPrice> por semana. Poupe <save> todas as semanas. Enviaremos <emailReminder> antes do final do seu teste.",
|
||||||
"payment_information": {
|
"payment_information": {
|
||||||
"personalized_offer": "Personalized offer reserved",
|
"personalized_offer": "Oferta personalizada reservada",
|
||||||
"title": "Start your <trialDuration>-day trial",
|
"title": "Comece o seu teste de <trialDuration> dias",
|
||||||
"total_today": "Total today",
|
"total_today": "Total hoje",
|
||||||
"code_applied_bold": "AURA24",
|
"code_applied_bold": "AURA24",
|
||||||
"code_applied": "Code <bold> applied!"
|
"code_applied": "Código <bold> aplicado!"
|
||||||
},
|
},
|
||||||
"guarantees": {
|
"guarantees": {
|
||||||
"no_commitment": "No commitment. Cancel anytime.",
|
"no_commitment": "Sem compromisso. Cancele a qualquer momento.",
|
||||||
"30_day_money_back": "30-Day Money-Back Guarantee"
|
"30_day_money_back": "Garantia de Devolução de Dinheiro em 30 dias"
|
||||||
},
|
},
|
||||||
"get_personal_prediction": "Get personal prediction",
|
"get_personal_prediction": "Obter previsão pessoal",
|
||||||
"total_due": "Total due today: <trialPrice>",
|
"total_due": "Total a pagar hoje: <trialPrice>",
|
||||||
"app_number_one_color": "25 million people.",
|
"app_number_one_color": "25 milhões de pessoas.",
|
||||||
"app_number_one": "The #1 Astrology app trusted by over <color>"
|
"app_number_one": "A aplicação de Astrologia #1 confiada por mais de <color>"
|
||||||
}
|
},
|
||||||
}
|
"/camera": {
|
||||||
|
"bad_photo": "Foto de má qualidade!",
|
||||||
|
"try_again": "Tente novamente",
|
||||||
|
"do_better": "Pode fazer melhor",
|
||||||
|
"next": "Seguinte"
|
||||||
|
},
|
||||||
|
"threadId": "thread_jfmTAfmIt5yUWIZbMIu7LWQq",
|
||||||
|
"assistantId": "asst_6PwXvikFteUGdVwOxJ5BcxBB",
|
||||||
|
"v": "v1",
|
||||||
|
"config": "pt-pt.male"
|
||||||
|
}
|
||||||
@ -34,7 +34,10 @@ import {
|
|||||||
Locale,
|
Locale,
|
||||||
Session,
|
Session,
|
||||||
Login,
|
Login,
|
||||||
Password
|
Password,
|
||||||
|
ChatsCategories,
|
||||||
|
ChatMessages,
|
||||||
|
CreateChat
|
||||||
} from './resources'
|
} from './resources'
|
||||||
|
|
||||||
const api = {
|
const api = {
|
||||||
@ -96,7 +99,11 @@ const api = {
|
|||||||
getLocale: createMethod<undefined, Locale.ResponseGet>(Locale.createRequest),
|
getLocale: createMethod<undefined, Locale.ResponseGet>(Locale.createRequest),
|
||||||
// Session
|
// Session
|
||||||
createSession: createMethod<Session.PayloadCreate, Session.ResponseCreate>(Session.createRequest),
|
createSession: createMethod<Session.PayloadCreate, Session.ResponseCreate>(Session.createRequest),
|
||||||
updateSession: createMethod<Session.PayloadUpdate, Session.ResponseUpdate>(Session.updateRequest)
|
updateSession: createMethod<Session.PayloadUpdate, Session.ResponseUpdate>(Session.updateRequest),
|
||||||
|
// Chats
|
||||||
|
getChatsCategories: createMethod<null, ChatsCategories.ResponseGet>(ChatsCategories.getRequest),
|
||||||
|
getChatMessages: createMethod<ChatMessages.Payload, ChatMessages.ResponseGet>(ChatMessages.getRequest),
|
||||||
|
createChat: createMethod<CreateChat.Payload, CreateChat.ResponseGet>(CreateChat.createRequest)
|
||||||
}
|
}
|
||||||
|
|
||||||
export type ApiContextValue = typeof api
|
export type ApiContextValue = typeof api
|
||||||
|
|||||||
35
src/api/resources/ChatMessages.ts
Normal file
35
src/api/resources/ChatMessages.ts
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
import routes from "@/routes";
|
||||||
|
import { getAuthHeaders } from "../utils";
|
||||||
|
import { AuthPayload } from "../types";
|
||||||
|
|
||||||
|
export type Payload = {
|
||||||
|
chatId: string
|
||||||
|
} & AuthPayload
|
||||||
|
|
||||||
|
interface IResponseGetSuccess {
|
||||||
|
messages: IMessage[]
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IMessage {
|
||||||
|
id: string,
|
||||||
|
role: string,
|
||||||
|
text: string,
|
||||||
|
userId: string,
|
||||||
|
assistantId: string,
|
||||||
|
threadId: string,
|
||||||
|
chatId: string,
|
||||||
|
createdDate: string,
|
||||||
|
isRead: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
// interface IResponseGetError {
|
||||||
|
// status: string;
|
||||||
|
// message: string;
|
||||||
|
// }
|
||||||
|
|
||||||
|
export type ResponseGet = IResponseGetSuccess
|
||||||
|
|
||||||
|
export const getRequest = ({ chatId, token }: Payload): Request => {
|
||||||
|
const url = new URL(routes.server.getChatMessages(chatId));
|
||||||
|
return new Request(url, { method: "GET", headers: getAuthHeaders(token) });
|
||||||
|
};
|
||||||
44
src/api/resources/ChatsCategories.ts
Normal file
44
src/api/resources/ChatsCategories.ts
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
import routes from "@/routes";
|
||||||
|
import { getBaseHeaders } from "../utils";
|
||||||
|
|
||||||
|
interface IResponseGetSuccess {
|
||||||
|
categories: ICategory[];
|
||||||
|
day: IAssistant;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ICategory {
|
||||||
|
title: string;
|
||||||
|
subtitle: string;
|
||||||
|
icon: null | string;
|
||||||
|
assistants: IAssistant[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum EAssistantStatus {
|
||||||
|
ONLINE = "online",
|
||||||
|
BUSY = "busy"
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IAssistant {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
image: string;
|
||||||
|
status: EAssistantStatus;
|
||||||
|
rating: number;
|
||||||
|
reviews: number;
|
||||||
|
experience: number;
|
||||||
|
readings: number;
|
||||||
|
price: number;
|
||||||
|
tags?: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
// interface IResponseGetError {
|
||||||
|
// status: string;
|
||||||
|
// message: string;
|
||||||
|
// }
|
||||||
|
|
||||||
|
export type ResponseGet = IResponseGetSuccess
|
||||||
|
|
||||||
|
export const getRequest = (): Request => {
|
||||||
|
const url = new URL(routes.server.getChatsCategories());
|
||||||
|
return new Request(url, { method: "GET", headers: getBaseHeaders() });
|
||||||
|
};
|
||||||
23
src/api/resources/CreateChat.ts
Normal file
23
src/api/resources/CreateChat.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import routes from "@/routes";
|
||||||
|
import { getAuthHeaders } from "../utils";
|
||||||
|
import { AuthPayload } from "../types";
|
||||||
|
|
||||||
|
export type Payload = {
|
||||||
|
assistantId: string
|
||||||
|
} & AuthPayload
|
||||||
|
|
||||||
|
interface IResponseGetSuccess {
|
||||||
|
chatId: string
|
||||||
|
}
|
||||||
|
|
||||||
|
// interface IResponseGetError {
|
||||||
|
// status: string;
|
||||||
|
// message: string;
|
||||||
|
// }
|
||||||
|
|
||||||
|
export type ResponseGet = IResponseGetSuccess
|
||||||
|
|
||||||
|
export const createRequest = ({ assistantId, token }: Payload): Request => {
|
||||||
|
const url = new URL(routes.server.createChat(assistantId));
|
||||||
|
return new Request(url, { method: "POST", headers: getAuthHeaders(token) });
|
||||||
|
};
|
||||||
@ -16,7 +16,8 @@ export enum EPlacementKeys {
|
|||||||
"aura.placement.email.marketing" = "aura.placement.email.marketing",
|
"aura.placement.email.marketing" = "aura.placement.email.marketing",
|
||||||
"aura.placement.secret.discount" = "aura.placement.secret.discount",
|
"aura.placement.secret.discount" = "aura.placement.secret.discount",
|
||||||
"aura.placement.palmistry.main" = "aura.placement.palmistry.main",
|
"aura.placement.palmistry.main" = "aura.placement.palmistry.main",
|
||||||
"aura.placement.palmistry.redesign" = "aura.placement.palmistry.redesign"
|
"aura.placement.palmistry.redesign" = "aura.placement.palmistry.redesign",
|
||||||
|
"aura.placement.chat" = "aura.placement.chat"
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ResponseGetSuccess {
|
export interface ResponseGetSuccess {
|
||||||
@ -53,9 +54,9 @@ export interface IPaywallProduct {
|
|||||||
isFreeTrial: boolean;
|
isFreeTrial: boolean;
|
||||||
isTrial: boolean;
|
isTrial: boolean;
|
||||||
price: number;
|
price: number;
|
||||||
trialDuration: number;
|
trialDuration: number | null;
|
||||||
trialPrice: number;
|
trialPrice: number | null;
|
||||||
trialPriceId: string;
|
trialPriceId: string | null;
|
||||||
currency?: string;
|
currency?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -137,7 +137,8 @@ export enum ESourceAuthorization {
|
|||||||
"aura.chat" = "aura.chat",
|
"aura.chat" = "aura.chat",
|
||||||
"aura.moons" = "aura.moons",
|
"aura.moons" = "aura.moons",
|
||||||
"aura.main.new" = "aura.main.new",
|
"aura.main.new" = "aura.main.new",
|
||||||
"aura.palmistry.new" = "aura.palmistry.new"
|
"aura.palmistry.new" = "aura.palmistry.new",
|
||||||
|
"aura.chats" = "aura.chats"
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum EGender {
|
export enum EGender {
|
||||||
|
|||||||
@ -33,3 +33,6 @@ export * as Locale from "./Locale";
|
|||||||
export * as Session from "./Session";
|
export * as Session from "./Session";
|
||||||
export * as Login from "./Login";
|
export * as Login from "./Login";
|
||||||
export * as Password from "./Password";
|
export * as Password from "./Password";
|
||||||
|
export * as ChatsCategories from "./ChatsCategories";
|
||||||
|
export * as ChatMessages from "./ChatMessages";
|
||||||
|
export * as CreateChat from "./CreateChat";
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -2,4 +2,5 @@
|
|||||||
color: #d3d3d3;
|
color: #d3d3d3;
|
||||||
margin-top: 30px;
|
margin-top: 30px;
|
||||||
font-size: 10px;
|
font-size: 10px;
|
||||||
|
text-transform: uppercase;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,10 +12,10 @@
|
|||||||
box-shadow: 0 4px 4px rgba(0, 0, 0, 0.25);
|
box-shadow: 0 4px 4px rgba(0, 0, 0, 0.25);
|
||||||
border-radius: 16px;
|
border-radius: 16px;
|
||||||
|
|
||||||
&:hover {
|
// &:hover {
|
||||||
transform: scale(1.03);
|
// transform: scale(1.03);
|
||||||
background-color: rgba(#8e8cf0, 0.2);
|
// background-color: rgba(#8e8cf0, 0.2);
|
||||||
}
|
// }
|
||||||
|
|
||||||
&:active {
|
&:active {
|
||||||
transform: scale(1.1);
|
transform: scale(1.1);
|
||||||
|
|||||||
155
src/components/ChatsPath/components/Assistant/index.tsx
Normal file
155
src/components/ChatsPath/components/Assistant/index.tsx
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
import { EAssistantStatus, IAssistant } from "@/api/resources/ChatsCategories";
|
||||||
|
import styles from "./styles.module.scss";
|
||||||
|
import Loader, { LoaderColor } from "@/components/Loader";
|
||||||
|
|
||||||
|
type IAssistantProps = IAssistant & {
|
||||||
|
isLoading: boolean;
|
||||||
|
onAssistantClick: (assistant: IAssistant) => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
function Assistant({
|
||||||
|
id,
|
||||||
|
image,
|
||||||
|
name,
|
||||||
|
status,
|
||||||
|
rating,
|
||||||
|
reviews,
|
||||||
|
experience,
|
||||||
|
readings,
|
||||||
|
price,
|
||||||
|
isLoading,
|
||||||
|
onAssistantClick,
|
||||||
|
}: IAssistantProps) {
|
||||||
|
const handleClick = () => {
|
||||||
|
if (isLoading) return;
|
||||||
|
onAssistantClick({
|
||||||
|
id,
|
||||||
|
image,
|
||||||
|
name,
|
||||||
|
status,
|
||||||
|
rating,
|
||||||
|
reviews,
|
||||||
|
experience,
|
||||||
|
readings,
|
||||||
|
price,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div role="button" className={styles.container} onClick={handleClick}>
|
||||||
|
<div className={styles.content}>
|
||||||
|
<div className={styles["main-info-wrapper"]}>
|
||||||
|
<div className={styles["avatar-wrapper"]}>
|
||||||
|
<div className={styles["avatar-wrapper-container"]}>
|
||||||
|
<div className={styles.avatar}>
|
||||||
|
<img src={image} alt="user avatar" />
|
||||||
|
</div>
|
||||||
|
{/* <span className={styles.status}></span> */}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className={styles["name-wrapper"]}>
|
||||||
|
<span className={styles.name}>{name}</span>
|
||||||
|
</div>
|
||||||
|
<span className={`${styles.status} ${styles[status]}`}>
|
||||||
|
{status}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className={styles["main-info"]}>
|
||||||
|
<div className={styles["main-info-container"]}>
|
||||||
|
<span className={styles.rating}>
|
||||||
|
{rating}
|
||||||
|
<svg
|
||||||
|
width="16"
|
||||||
|
height="17"
|
||||||
|
viewBox="0 0 16 17"
|
||||||
|
fill="#F2C94C"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<g clipPath="url(#clip0)">
|
||||||
|
<path d="M8.00027 12.1889L3.29827 14.8209L4.34827 9.53554L0.391602 5.87688L5.74294 5.24221L8.00027 0.348877L10.2576 5.24221L15.6089 5.87688L11.6523 9.53554L12.7023 14.8209L8.00027 12.1889Z"></path>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0">
|
||||||
|
<rect
|
||||||
|
width="16"
|
||||||
|
height="16"
|
||||||
|
fill="white"
|
||||||
|
transform="translate(0 0.015625)"
|
||||||
|
></rect>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
<p className={styles.reviews}>{reviews} reviews</p>
|
||||||
|
</div>
|
||||||
|
<div className={styles.experience}>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
>
|
||||||
|
<title>hands-with-heart-thin-mono</title>
|
||||||
|
<path d="M22.77 10.944c-0.15-0.056-0.311-0.081-0.474-0.074-0.318 0.015-0.617 0.156-0.832 0.393l-2.876 3.169c-0.201 0.221-0.543 0.238-0.764 0.037s-0.238-0.543-0.037-0.764l2.876-3.169c0 0 0 0 0 0 0.408-0.449 0.977-0.718 1.582-0.747s1.197 0.185 1.646 0.594c0.197 0.18 0.234 0.476 0.087 0.698l-7.060 10.673c-0.165 0.249-0.501 0.318-0.75 0.153s-0.318-0.501-0.153-0.75l6.756-10.214z"></path>
|
||||||
|
<path d="M17.633 14.273c-0.111-0.102-0.258-0.155-0.407-0.149-0.149 0.006-0.289 0.069-0.392 0.178l-3.264 3.596c-0.612 0.645-0.801 0.86-0.903 1.204-0.055 0.183-0.089 0.423-0.107 0.805s-0.018 0.873-0.018 1.551c0 0.299-0.242 0.541-0.541 0.541s-0.541-0.242-0.541-0.541v-0.014c0-0.661 0-1.177 0.019-1.587 0.019-0.414 0.059-0.757 0.151-1.065 0.184-0.617 0.563-1.016 1.096-1.577 0.018-0.019 0.036-0.038 0.055-0.058l3.261-3.593c0.297-0.318 0.708-0.505 1.142-0.522s0.858 0.138 1.179 0.432c0.321 0.293 0.514 0.701 0.537 1.135s-0.124 0.861-0.411 1.187l-0.005 0.006-2.114 2.33c-0.201 0.221-0.543 0.238-0.764 0.037s-0.238-0.543-0.037-0.764l2.111-2.327c0.098-0.113 0.149-0.26 0.141-0.411-0.008-0.152-0.075-0.293-0.187-0.395z"></path>
|
||||||
|
<path d="M0.873 9.923c0.282-0.102 0.582-0.147 0.882-0.133s0.594 0.088 0.865 0.216c0.271 0.128 0.515 0.309 0.716 0.531 0 0-0 0 0 0l2.876 3.169c0.201 0.221 0.184 0.564-0.037 0.764s-0.564 0.184-0.764-0.037l-2.876-3.169c-0.106-0.117-0.234-0.212-0.377-0.279s-0.297-0.106-0.454-0.113c-0.157-0.008-0.315 0.016-0.463 0.070-0.004 0.001-0.007 0.003-0.011 0.004l6.756 10.214c0.165 0.249 0.096 0.585-0.153 0.75s-0.585 0.096-0.75-0.153l-7.060-10.673c-0.147-0.222-0.11-0.519 0.087-0.698 0.222-0.202 0.481-0.359 0.763-0.461z"></path>
|
||||||
|
<path d="M5.627 13.461c0.325-0.296 0.753-0.451 1.193-0.431s0.851 0.216 1.147 0.541c0 0 0 0 0 0l3.255 3.586c0.018 0.019 0.037 0.039 0.055 0.058 0.534 0.561 0.913 0.96 1.097 1.577 0.092 0.309 0.132 0.651 0.151 1.065 0.019 0.411 0.019 0.926 0.019 1.587v0.014c0 0.299-0.242 0.541-0.541 0.541s-0.541-0.242-0.541-0.541c0-0.678-0-1.169-0.018-1.551s-0.052-0.622-0.107-0.805c-0.103-0.344-0.291-0.559-0.904-1.204l-0.009-0.009-3.259-3.591c-0.102-0.113-0.245-0.18-0.396-0.187s-0.299 0.046-0.412 0.149c-0.113 0.103-0.18 0.246-0.187 0.4s0.047 0.303 0.149 0.416c0 0-0 0 0 0l2.115 2.33c0.201 0.221 0.184 0.564-0.037 0.764s-0.564 0.184-0.764-0.037l-2.115-2.33c-0.295-0.325-0.449-0.755-0.429-1.194s0.214-0.852 0.539-1.148z"></path>
|
||||||
|
<path d="M5.515 5.57c0.050-1.953 1.585-3.57 3.573-3.57 1.081 0 2.147 0.47 2.91 1.136 0.763-0.667 1.829-1.136 2.91-1.136 1.987 0 3.524 1.616 3.574 3.57v0c0.052 2.062-1.303 3.942-2.684 5.327-1.402 1.407-2.951 2.424-3.521 2.766-0.171 0.103-0.385 0.103-0.557 0-0.571-0.342-2.12-1.359-3.522-2.766-1.381-1.386-2.735-3.266-2.683-5.328v-0zM6.597 5.597c-0.040 1.593 1.029 3.192 2.368 4.537 1.131 1.135 2.372 2.005 3.033 2.428 0.661-0.424 1.903-1.295 3.033-2.429 1.34-1.344 2.409-2.944 2.368-4.536zM17.401 5.597c-0.036-1.406-1.13-2.515-2.492-2.515-0.944 0-1.925 0.507-2.501 1.172-0.103 0.119-0.252 0.187-0.409 0.187s-0.306-0.068-0.409-0.186c-0.577-0.665-1.558-1.172-2.502-1.172-1.362 0-2.455 1.109-2.491 2.515z"></path>
|
||||||
|
</svg>
|
||||||
|
<span>
|
||||||
|
<span className={styles.bold}>
|
||||||
|
{experience} year{experience === 1 ? "" : "s"}
|
||||||
|
</span>{" "}
|
||||||
|
of experience
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className={styles.experience}>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="768"
|
||||||
|
height="768"
|
||||||
|
viewBox="0 0 768 768"
|
||||||
|
>
|
||||||
|
<g id="icomoon-ignore"></g>
|
||||||
|
<path d="M100.375 127.716c-3.943-0.047-7.81 1.078-11.111 3.233s-5.886 5.239-7.427 8.865c-1.541 3.625-1.969 7.626-1.229 11.494s2.615 7.43 5.387 10.232c2.77 2.801 6.313 4.718 10.177 5.503s7.873 0.406 11.52-1.090c3.647-1.496 6.766-4.042 8.962-7.313s3.368-7.12 3.368-11.059c0.031-2.598-0.454-5.175-1.426-7.583s-2.416-4.601-4.243-6.448c-1.828-1.847-4.004-3.314-6.404-4.315s-4.973-1.516-7.573-1.516z"></path>
|
||||||
|
<path d="M169.822 127.715c-3.932 0-7.777 1.165-11.046 3.347s-5.818 5.285-7.324 8.915c-1.505 3.629-1.898 7.623-1.131 11.476s2.661 7.392 5.442 10.171c2.78 2.778 6.324 4.67 10.18 5.436s7.855 0.373 11.488-1.13c3.634-1.504 6.738-4.049 8.923-7.315s3.351-7.107 3.351-11.035c0-2.609-0.514-5.191-1.513-7.601s-2.464-4.6-4.31-6.444c-1.846-1.845-4.038-3.308-6.451-4.306s-4.998-1.511-7.609-1.511z"></path>
|
||||||
|
<path d="M239.202 127.716c-3.932 0-7.777 1.165-11.046 3.348s-5.818 5.285-7.323 8.914c-1.505 3.629-1.898 7.623-1.131 11.477s2.661 7.392 5.442 10.171c2.78 2.778 6.324 4.67 10.18 5.436s7.855 0.373 11.488-1.13c3.634-1.503 6.738-4.049 8.923-7.316s3.351-7.107 3.351-11.035c0.031-2.618-0.461-5.215-1.449-7.639s-2.452-4.626-4.304-6.478c-1.853-1.851-4.058-3.313-6.485-4.3s-5.026-1.479-7.646-1.447z"></path>
|
||||||
|
<path d="M634.882 640.096c0 7.524-2.993 14.742-8.318 20.064s-12.553 8.311-20.083 8.311h-269.849c-3.23 0.242-6.474 0.242-9.705 0-3.225 0.36-6.481 0.36-9.706 0h-246.649c-7.368-0.247-14.352-3.344-19.476-8.64s-7.986-12.372-7.982-19.736v-421.624h591.768v6.385h23.671v-97.188c0.004-6.808-1.359-13.548-4.003-19.823-2.64-6.275-6.513-11.96-11.389-16.718-4.872-4.759-10.649-8.496-16.99-10.992s-13.116-3.701-19.931-3.544h-535.669c-13.56 0-26.564 5.381-36.154 14.96s-14.975 22.57-14.975 36.117v512.427c-0.032 6.725 1.268 13.394 3.824 19.617s6.317 11.882 11.068 16.652c4.751 4.766 10.398 8.549 16.616 11.131s12.886 3.913 19.622 3.913h535.669c6.834 0.157 13.63-1.053 19.985-3.568 6.356-2.51 12.145-6.266 17.021-11.053 4.876-4.782 8.746-10.496 11.373-16.798 2.628-6.305 3.967-13.069 3.931-19.896v-62.902h-23.671v62.902zM43.114 127.669c0.236-7.2 3.206-14.040 8.304-19.134s11.947-8.059 19.153-8.296h535.67c7.414-0.067 14.558 2.766 19.911 7.891 5.35 5.125 8.483 12.137 8.729 19.538v67.157h-591.768v-67.157z"></path>
|
||||||
|
<path d="M699.088 258.632h-333.756c-13.142 0-25.75 5.199-35.066 14.461s-14.58 21.831-14.643 34.961v315.919c0.004 2.217 0.656 4.382 1.875 6.231s2.954 3.298 4.99 4.175c1.481 0.337 3.017 0.337 4.497 0 2.792 0.039 5.496-0.975 7.575-2.836l101.786-89.385h262.741c13.144-0.063 25.726-5.323 34.997-14.628 9.27-9.309 14.476-21.901 14.476-35.033v-184.444c-0.063-13.089-5.295-25.623-14.558-34.878-9.266-9.255-21.811-14.482-34.915-14.544zM725.837 493.445c0 7.085-2.816 13.883-7.833 18.893s-11.82 7.825-18.917 7.825h-267.003c-2.769 0.086-5.436 1.085-7.574 2.84l-85.927 75.67v-290.619c0-7.087 2.818-13.883 7.834-18.895s11.82-7.827 18.914-7.827h333.756c7.077 0.062 13.844 2.897 18.845 7.895 5.005 4.998 7.84 11.758 7.903 18.826v185.391z"></path>
|
||||||
|
<path d="M520.835 429.478h-102.732c-3.141 0-6.149 1.245-8.369 3.462-2.221 2.221-3.466 5.224-3.466 8.362s1.245 6.145 3.466 8.362c2.221 2.217 5.228 3.462 8.369 3.462h102.732c3.137 0 6.149-1.245 8.365-3.462 2.221-2.217 3.47-5.225 3.47-8.362s-1.25-6.141-3.47-8.362c-2.217-2.217-5.228-3.462-8.365-3.462z"></path>
|
||||||
|
<path d="M646.036 349.722h-227.948c-2.993 0.061-5.847 1.276-7.966 3.391s-3.333 4.967-3.395 7.959c0 3.011 1.198 5.897 3.329 8.026s5.021 3.325 8.033 3.325h227.948c1.661 0.221 3.349 0.065 4.939-0.456s3.039-1.394 4.245-2.552c1.206-1.159 2.135-2.575 2.718-4.142 0.58-1.567 0.803-3.245 0.646-4.909-0.090-1.535-0.486-3.036-1.175-4.413-0.685-1.376-1.641-2.6-2.815-3.595s-2.538-1.741-4.006-2.195c-1.472-0.453-3.020-0.603-4.55-0.439z"></path>
|
||||||
|
</svg>
|
||||||
|
<span>
|
||||||
|
<span className={styles.bold}>{readings}</span> readings
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div className={styles["button-wrapper"]}>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className={`${styles.button} ${styles.primary}`}
|
||||||
|
disabled={status === EAssistantStatus.BUSY || isLoading}
|
||||||
|
>
|
||||||
|
{!isLoading && status === EAssistantStatus.ONLINE && (
|
||||||
|
<span>Start chat</span>
|
||||||
|
)}
|
||||||
|
{!isLoading && status === EAssistantStatus.BUSY && (
|
||||||
|
<span>Chat</span>
|
||||||
|
)}
|
||||||
|
{isLoading && <Loader color={LoaderColor.White} />}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div className={styles["price-info-wrapper"]}>
|
||||||
|
<span className={styles["price-info"]}>
|
||||||
|
Chat for {price} credits/min
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Assistant;
|
||||||
231
src/components/ChatsPath/components/Assistant/styles.module.scss
Normal file
231
src/components/ChatsPath/components/Assistant/styles.module.scss
Normal file
@ -0,0 +1,231 @@
|
|||||||
|
.container {
|
||||||
|
color: var(--typography-100);
|
||||||
|
background: var(--secondary-700);
|
||||||
|
border-radius: 16px;
|
||||||
|
overflow: hidden;
|
||||||
|
max-width: 160px;
|
||||||
|
margin-right: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
padding-left: 12px;
|
||||||
|
padding-right: 12px;
|
||||||
|
padding-top: 12px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main-info-wrapper {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
& > .avatar-wrapper {
|
||||||
|
flex-shrink: 0;
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
|
||||||
|
& > .avatar-wrapper-container {
|
||||||
|
display: inline-block;
|
||||||
|
font-size: 0;
|
||||||
|
line-height: 0;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
& > .avatar {
|
||||||
|
height: 136px;
|
||||||
|
width: 136px;
|
||||||
|
border-radius: 17px;
|
||||||
|
object-fit: cover;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 0;
|
||||||
|
line-height: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
& > img {
|
||||||
|
min-width: 100%;
|
||||||
|
min-height: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
max-height: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .name-wrapper {
|
||||||
|
position: absolute;
|
||||||
|
text-align: center;
|
||||||
|
padding-top: 4px;
|
||||||
|
padding-bottom: 18px;
|
||||||
|
background: var(--secondary-800);
|
||||||
|
bottom: -30px;
|
||||||
|
width: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
border-bottom-left-radius: 17px;
|
||||||
|
border-bottom-right-radius: 17px;
|
||||||
|
|
||||||
|
& > .name {
|
||||||
|
cursor: pointer;
|
||||||
|
width: 100%;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 18px;
|
||||||
|
line-height: 135%;
|
||||||
|
color: var(--typography-100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .status {
|
||||||
|
display: inline-block;
|
||||||
|
min-width: 80px;
|
||||||
|
text-align: center;
|
||||||
|
padding: 2px 8px;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 16px;
|
||||||
|
color: var(--typography-100);
|
||||||
|
text-transform: capitalize;
|
||||||
|
background-color: var(--success-400);
|
||||||
|
width: 80px;
|
||||||
|
height: 20px;
|
||||||
|
position: absolute;
|
||||||
|
border-radius: 22px;
|
||||||
|
bottom: -40px;
|
||||||
|
left: 28px;
|
||||||
|
|
||||||
|
&.busy {
|
||||||
|
background: var(--warning);
|
||||||
|
color: var(--typography-900);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .main-info {
|
||||||
|
overflow: hidden;
|
||||||
|
flex-grow: 1;
|
||||||
|
|
||||||
|
& > .main-info-container {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
color: var(--typography-100);
|
||||||
|
|
||||||
|
& > .rating {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 22px;
|
||||||
|
line-height: 32px;
|
||||||
|
color: var(--typography-100);
|
||||||
|
|
||||||
|
& > svg {
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
margin-right: 1px;
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .reviews {
|
||||||
|
max-width: 85px;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 130%;
|
||||||
|
margin-left: 26px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .experience {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
font-size: 10px;
|
||||||
|
line-height: 130%;
|
||||||
|
margin-top: 7px;
|
||||||
|
color: var(--typography-300);
|
||||||
|
|
||||||
|
& > svg {
|
||||||
|
margin-right: 6px;
|
||||||
|
fill: var(--primary-200);
|
||||||
|
width: 12px;
|
||||||
|
height: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-wrapper {
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
z-index: 2;
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 20px;
|
||||||
|
|
||||||
|
& > .button {
|
||||||
|
font-family: Open Sans, sans-serif;
|
||||||
|
color: var(--typography-100);
|
||||||
|
cursor: pointer;
|
||||||
|
background: var(--gradient-pink-base);
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: center;
|
||||||
|
text-decoration: none;
|
||||||
|
vertical-align: middle;
|
||||||
|
user-select: none;
|
||||||
|
padding: 5px 10px;
|
||||||
|
align-self: center;
|
||||||
|
outline: none;
|
||||||
|
border: none;
|
||||||
|
font-size: 16px;
|
||||||
|
transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out,
|
||||||
|
border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
|
||||||
|
|
||||||
|
height: 40px;
|
||||||
|
width: 136px;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 24px;
|
||||||
|
border-radius: 8px;
|
||||||
|
|
||||||
|
&:disabled {
|
||||||
|
opacity: 0.7;
|
||||||
|
cursor: not-allowed;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.primary {
|
||||||
|
background: var(--gradient-pink-base);
|
||||||
|
|
||||||
|
&:disabled {
|
||||||
|
background: none;
|
||||||
|
background-color: var(--secondary);
|
||||||
|
color: var(--typography-400);
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-info-wrapper {
|
||||||
|
margin-top: 8px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
margin-right: 20px;
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
& > .price-info {
|
||||||
|
display: inline-block;
|
||||||
|
color: var(--typography-200);
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 130%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.bold {
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--typography-100);
|
||||||
|
}
|
||||||
184
src/components/ChatsPath/components/AssistantOfDay/index.tsx
Normal file
184
src/components/ChatsPath/components/AssistantOfDay/index.tsx
Normal file
@ -0,0 +1,184 @@
|
|||||||
|
import Title from "@/components/Title";
|
||||||
|
import styles from "./styles.module.scss";
|
||||||
|
import { EAssistantStatus, IAssistant } from "@/api/resources/ChatsCategories";
|
||||||
|
import Loader, { LoaderColor } from "@/components/Loader";
|
||||||
|
|
||||||
|
interface IAssistantOfDayProps {
|
||||||
|
assistant: IAssistant;
|
||||||
|
isLoading: boolean;
|
||||||
|
onAssistantClick: (assistant: IAssistant) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
function AssistantOfDay({
|
||||||
|
assistant,
|
||||||
|
isLoading,
|
||||||
|
onAssistantClick,
|
||||||
|
}: IAssistantOfDayProps) {
|
||||||
|
const {
|
||||||
|
image,
|
||||||
|
status,
|
||||||
|
name,
|
||||||
|
rating,
|
||||||
|
reviews,
|
||||||
|
tags,
|
||||||
|
experience,
|
||||||
|
readings,
|
||||||
|
price,
|
||||||
|
} = assistant;
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className={styles.container}
|
||||||
|
onClick={() => !isLoading && onAssistantClick(assistant)}
|
||||||
|
>
|
||||||
|
<div className={styles["title-container"]}>
|
||||||
|
<div className={styles["icon-container"]}>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="768"
|
||||||
|
height="768"
|
||||||
|
viewBox="0 0 768 768"
|
||||||
|
>
|
||||||
|
<g id="icomoon-ignore"></g>
|
||||||
|
<path
|
||||||
|
fill="none"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeMiterlimit="4"
|
||||||
|
strokeWidth="61.44"
|
||||||
|
stroke="#E8E8FC"
|
||||||
|
d="M726.309 198.364l-157.99 157.989-184.32-263.315-184.319 263.315-157.988-157.989v397.605c0 20.951 8.323 41.042 23.137 55.858 14.815 14.813 34.907 23.135 55.858 23.135h526.63c20.948 0 41.042-8.322 55.855-23.135 14.816-14.816 23.138-34.907 23.138-55.858v-397.605z"
|
||||||
|
></path>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<Title variant="h2" className={styles.title}>
|
||||||
|
Psychic of the day
|
||||||
|
</Title>
|
||||||
|
</div>
|
||||||
|
<div role="button" className={styles.expert}>
|
||||||
|
<div className={styles["info-wrapper"]}>
|
||||||
|
<div className={styles["avatar-wrapper"]}>
|
||||||
|
<img
|
||||||
|
className={styles.avatar}
|
||||||
|
src={image}
|
||||||
|
alt={`${assistant.name} avatar`}
|
||||||
|
/>
|
||||||
|
<span className={`${styles.status} ${styles[status]}`}>
|
||||||
|
{status}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className={styles["main-info"]}>
|
||||||
|
<div className={styles["name-wrapper"]}>
|
||||||
|
<span className={styles.name}>{name}</span>
|
||||||
|
<svg
|
||||||
|
width="20"
|
||||||
|
height="20"
|
||||||
|
viewBox="0 0 20 20"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M2 9C1.44772 9 1 9.44772 1 10C1 10.5523 1.44772 11 2 11V9ZM17.7071 10.7071C18.0976 10.3166 18.0976 9.68342 17.7071 9.29289L11.3431 2.92893C10.9526 2.53841 10.3195 2.53841 9.92893 2.92893C9.53841 3.31946 9.53841 3.95262 9.92893 4.34315L15.5858 10L9.92893 15.6569C9.53841 16.0474 9.53841 16.6805 9.92893 17.0711C10.3195 17.4616 10.9526 17.4616 11.3431 17.0711L17.7071 10.7071ZM2 11H17V9H2V11Z"
|
||||||
|
fill="#FAFAFA"
|
||||||
|
></path>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<div className={styles["reviews-wrapper"]}>
|
||||||
|
<span className={styles.review}>
|
||||||
|
{rating}
|
||||||
|
<svg
|
||||||
|
width="16"
|
||||||
|
height="17"
|
||||||
|
viewBox="0 0 16 17"
|
||||||
|
fill="#F2C94C"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
className={styles.star}
|
||||||
|
>
|
||||||
|
<g clipPath="url(#clip0)">
|
||||||
|
<path d="M8.00027 12.1889L3.29827 14.8209L4.34827 9.53554L0.391602 5.87688L5.74294 5.24221L8.00027 0.348877L10.2576 5.24221L15.6089 5.87688L11.6523 9.53554L12.7023 14.8209L8.00027 12.1889Z"></path>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0">
|
||||||
|
<rect
|
||||||
|
width="16"
|
||||||
|
height="16"
|
||||||
|
fill="white"
|
||||||
|
transform="translate(0 0.015625)"
|
||||||
|
></rect>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
<p className={styles.reviews}>{reviews} reviews</p>
|
||||||
|
</div>
|
||||||
|
<ul className={styles.specializations}>
|
||||||
|
{tags?.map((tag, index) => (
|
||||||
|
<li className={styles.item} key={index}>
|
||||||
|
<div role="button" className={styles.tag}>
|
||||||
|
<span className={styles.label}>{tag}</span>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
<div className={styles.experience}>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
>
|
||||||
|
<title>hands-with-heart-thin-mono</title>
|
||||||
|
<path d="M22.77 10.944c-0.15-0.056-0.311-0.081-0.474-0.074-0.318 0.015-0.617 0.156-0.832 0.393l-2.876 3.169c-0.201 0.221-0.543 0.238-0.764 0.037s-0.238-0.543-0.037-0.764l2.876-3.169c0 0 0 0 0 0 0.408-0.449 0.977-0.718 1.582-0.747s1.197 0.185 1.646 0.594c0.197 0.18 0.234 0.476 0.087 0.698l-7.060 10.673c-0.165 0.249-0.501 0.318-0.75 0.153s-0.318-0.501-0.153-0.75l6.756-10.214z"></path>
|
||||||
|
<path d="M17.633 14.273c-0.111-0.102-0.258-0.155-0.407-0.149-0.149 0.006-0.289 0.069-0.392 0.178l-3.264 3.596c-0.612 0.645-0.801 0.86-0.903 1.204-0.055 0.183-0.089 0.423-0.107 0.805s-0.018 0.873-0.018 1.551c0 0.299-0.242 0.541-0.541 0.541s-0.541-0.242-0.541-0.541v-0.014c0-0.661 0-1.177 0.019-1.587 0.019-0.414 0.059-0.757 0.151-1.065 0.184-0.617 0.563-1.016 1.096-1.577 0.018-0.019 0.036-0.038 0.055-0.058l3.261-3.593c0.297-0.318 0.708-0.505 1.142-0.522s0.858 0.138 1.179 0.432c0.321 0.293 0.514 0.701 0.537 1.135s-0.124 0.861-0.411 1.187l-0.005 0.006-2.114 2.33c-0.201 0.221-0.543 0.238-0.764 0.037s-0.238-0.543-0.037-0.764l2.111-2.327c0.098-0.113 0.149-0.26 0.141-0.411-0.008-0.152-0.075-0.293-0.187-0.395z"></path>
|
||||||
|
<path d="M0.873 9.923c0.282-0.102 0.582-0.147 0.882-0.133s0.594 0.088 0.865 0.216c0.271 0.128 0.515 0.309 0.716 0.531 0 0-0 0 0 0l2.876 3.169c0.201 0.221 0.184 0.564-0.037 0.764s-0.564 0.184-0.764-0.037l-2.876-3.169c-0.106-0.117-0.234-0.212-0.377-0.279s-0.297-0.106-0.454-0.113c-0.157-0.008-0.315 0.016-0.463 0.070-0.004 0.001-0.007 0.003-0.011 0.004l6.756 10.214c0.165 0.249 0.096 0.585-0.153 0.75s-0.585 0.096-0.75-0.153l-7.060-10.673c-0.147-0.222-0.11-0.519 0.087-0.698 0.222-0.202 0.481-0.359 0.763-0.461z"></path>
|
||||||
|
<path d="M5.627 13.461c0.325-0.296 0.753-0.451 1.193-0.431s0.851 0.216 1.147 0.541c0 0 0 0 0 0l3.255 3.586c0.018 0.019 0.037 0.039 0.055 0.058 0.534 0.561 0.913 0.96 1.097 1.577 0.092 0.309 0.132 0.651 0.151 1.065 0.019 0.411 0.019 0.926 0.019 1.587v0.014c0 0.299-0.242 0.541-0.541 0.541s-0.541-0.242-0.541-0.541c0-0.678-0-1.169-0.018-1.551s-0.052-0.622-0.107-0.805c-0.103-0.344-0.291-0.559-0.904-1.204l-0.009-0.009-3.259-3.591c-0.102-0.113-0.245-0.18-0.396-0.187s-0.299 0.046-0.412 0.149c-0.113 0.103-0.18 0.246-0.187 0.4s0.047 0.303 0.149 0.416c0 0-0 0 0 0l2.115 2.33c0.201 0.221 0.184 0.564-0.037 0.764s-0.564 0.184-0.764-0.037l-2.115-2.33c-0.295-0.325-0.449-0.755-0.429-1.194s0.214-0.852 0.539-1.148z"></path>
|
||||||
|
<path d="M5.515 5.57c0.050-1.953 1.585-3.57 3.573-3.57 1.081 0 2.147 0.47 2.91 1.136 0.763-0.667 1.829-1.136 2.91-1.136 1.987 0 3.524 1.616 3.574 3.57v0c0.052 2.062-1.303 3.942-2.684 5.327-1.402 1.407-2.951 2.424-3.521 2.766-0.171 0.103-0.385 0.103-0.557 0-0.571-0.342-2.12-1.359-3.522-2.766-1.381-1.386-2.735-3.266-2.683-5.328v-0zM6.597 5.597c-0.040 1.593 1.029 3.192 2.368 4.537 1.131 1.135 2.372 2.005 3.033 2.428 0.661-0.424 1.903-1.295 3.033-2.429 1.34-1.344 2.409-2.944 2.368-4.536zM17.401 5.597c-0.036-1.406-1.13-2.515-2.492-2.515-0.944 0-1.925 0.507-2.501 1.172-0.103 0.119-0.252 0.187-0.409 0.187s-0.306-0.068-0.409-0.186c-0.577-0.665-1.558-1.172-2.502-1.172-1.362 0-2.455 1.109-2.491 2.515z"></path>
|
||||||
|
</svg>
|
||||||
|
{experience} years of experience
|
||||||
|
</div>
|
||||||
|
<div className={styles.experience}>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="768"
|
||||||
|
height="768"
|
||||||
|
viewBox="0 0 768 768"
|
||||||
|
>
|
||||||
|
<g id="icomoon-ignore"></g>
|
||||||
|
<path d="M100.375 127.716c-3.943-0.047-7.81 1.078-11.111 3.233s-5.886 5.239-7.427 8.865c-1.541 3.625-1.969 7.626-1.229 11.494s2.615 7.43 5.387 10.232c2.77 2.801 6.313 4.718 10.177 5.503s7.873 0.406 11.52-1.090c3.647-1.496 6.766-4.042 8.962-7.313s3.368-7.12 3.368-11.059c0.031-2.598-0.454-5.175-1.426-7.583s-2.416-4.601-4.243-6.448c-1.828-1.847-4.004-3.314-6.404-4.315s-4.973-1.516-7.573-1.516z"></path>
|
||||||
|
<path d="M169.822 127.715c-3.932 0-7.777 1.165-11.046 3.347s-5.818 5.285-7.324 8.915c-1.505 3.629-1.898 7.623-1.131 11.476s2.661 7.392 5.442 10.171c2.78 2.778 6.324 4.67 10.18 5.436s7.855 0.373 11.488-1.13c3.634-1.504 6.738-4.049 8.923-7.315s3.351-7.107 3.351-11.035c0-2.609-0.514-5.191-1.513-7.601s-2.464-4.6-4.31-6.444c-1.846-1.845-4.038-3.308-6.451-4.306s-4.998-1.511-7.609-1.511z"></path>
|
||||||
|
<path d="M239.202 127.716c-3.932 0-7.777 1.165-11.046 3.348s-5.818 5.285-7.323 8.914c-1.505 3.629-1.898 7.623-1.131 11.477s2.661 7.392 5.442 10.171c2.78 2.778 6.324 4.67 10.18 5.436s7.855 0.373 11.488-1.13c3.634-1.503 6.738-4.049 8.923-7.316s3.351-7.107 3.351-11.035c0.031-2.618-0.461-5.215-1.449-7.639s-2.452-4.626-4.304-6.478c-1.853-1.851-4.058-3.313-6.485-4.3s-5.026-1.479-7.646-1.447z"></path>
|
||||||
|
<path d="M634.882 640.096c0 7.524-2.993 14.742-8.318 20.064s-12.553 8.311-20.083 8.311h-269.849c-3.23 0.242-6.474 0.242-9.705 0-3.225 0.36-6.481 0.36-9.706 0h-246.649c-7.368-0.247-14.352-3.344-19.476-8.64s-7.986-12.372-7.982-19.736v-421.624h591.768v6.385h23.671v-97.188c0.004-6.808-1.359-13.548-4.003-19.823-2.64-6.275-6.513-11.96-11.389-16.718-4.872-4.759-10.649-8.496-16.99-10.992s-13.116-3.701-19.931-3.544h-535.669c-13.56 0-26.564 5.381-36.154 14.96s-14.975 22.57-14.975 36.117v512.427c-0.032 6.725 1.268 13.394 3.824 19.617s6.317 11.882 11.068 16.652c4.751 4.766 10.398 8.549 16.616 11.131s12.886 3.913 19.622 3.913h535.669c6.834 0.157 13.63-1.053 19.985-3.568 6.356-2.51 12.145-6.266 17.021-11.053 4.876-4.782 8.746-10.496 11.373-16.798 2.628-6.305 3.967-13.069 3.931-19.896v-62.902h-23.671v62.902zM43.114 127.669c0.236-7.2 3.206-14.040 8.304-19.134s11.947-8.059 19.153-8.296h535.67c7.414-0.067 14.558 2.766 19.911 7.891 5.35 5.125 8.483 12.137 8.729 19.538v67.157h-591.768v-67.157z"></path>
|
||||||
|
<path d="M699.088 258.632h-333.756c-13.142 0-25.75 5.199-35.066 14.461s-14.58 21.831-14.643 34.961v315.919c0.004 2.217 0.656 4.382 1.875 6.231s2.954 3.298 4.99 4.175c1.481 0.337 3.017 0.337 4.497 0 2.792 0.039 5.496-0.975 7.575-2.836l101.786-89.385h262.741c13.144-0.063 25.726-5.323 34.997-14.628 9.27-9.309 14.476-21.901 14.476-35.033v-184.444c-0.063-13.089-5.295-25.623-14.558-34.878-9.266-9.255-21.811-14.482-34.915-14.544zM725.837 493.445c0 7.085-2.816 13.883-7.833 18.893s-11.82 7.825-18.917 7.825h-267.003c-2.769 0.086-5.436 1.085-7.574 2.84l-85.927 75.67v-290.619c0-7.087 2.818-13.883 7.834-18.895s11.82-7.827 18.914-7.827h333.756c7.077 0.062 13.844 2.897 18.845 7.895 5.005 4.998 7.84 11.758 7.903 18.826v185.391z"></path>
|
||||||
|
<path d="M520.835 429.478h-102.732c-3.141 0-6.149 1.245-8.369 3.462-2.221 2.221-3.466 5.224-3.466 8.362s1.245 6.145 3.466 8.362c2.221 2.217 5.228 3.462 8.369 3.462h102.732c3.137 0 6.149-1.245 8.365-3.462 2.221-2.217 3.47-5.225 3.47-8.362s-1.25-6.141-3.47-8.362c-2.217-2.217-5.228-3.462-8.365-3.462z"></path>
|
||||||
|
<path d="M646.036 349.722h-227.948c-2.993 0.061-5.847 1.276-7.966 3.391s-3.333 4.967-3.395 7.959c0 3.011 1.198 5.897 3.329 8.026s5.021 3.325 8.033 3.325h227.948c1.661 0.221 3.349 0.065 4.939-0.456s3.039-1.394 4.245-2.552c1.206-1.159 2.135-2.575 2.718-4.142 0.58-1.567 0.803-3.245 0.646-4.909-0.090-1.535-0.486-3.036-1.175-4.413-0.685-1.376-1.641-2.6-2.815-3.595s-2.538-1.741-4.006-2.195c-1.472-0.453-3.020-0.603-4.55-0.439z"></path>
|
||||||
|
</svg>
|
||||||
|
{readings} readings
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className={styles.footer}>
|
||||||
|
<div className={styles["price-wrapper"]}>
|
||||||
|
<span className={styles.price}>Chat for {price} credits/min</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className={styles["button-wrapper"]}>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className={`${styles.button} ${styles.primary}`}
|
||||||
|
disabled={status === EAssistantStatus.BUSY || isLoading}
|
||||||
|
>
|
||||||
|
{!isLoading && status === EAssistantStatus.ONLINE && (
|
||||||
|
<span>Start chat</span>
|
||||||
|
)}
|
||||||
|
{!isLoading && status === EAssistantStatus.BUSY && (
|
||||||
|
<span>Chat</span>
|
||||||
|
)}
|
||||||
|
{isLoading && <Loader color={LoaderColor.White} />}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default AssistantOfDay;
|
||||||
@ -0,0 +1,269 @@
|
|||||||
|
.container {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
padding-left: 0;
|
||||||
|
padding-right: 0;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
width: fit-content;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title-container {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
color: var(--primary-400);
|
||||||
|
margin-bottom: 24px;
|
||||||
|
|
||||||
|
& > .icon-container {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
background: var(--primary);
|
||||||
|
border-radius: 4px;
|
||||||
|
margin-right: 12px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
& > svg {
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .title {
|
||||||
|
font-family: Montserrat, sans-serif;
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 20px;
|
||||||
|
line-height: 24px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.expert {
|
||||||
|
color: var(--typography-100);
|
||||||
|
padding: 20px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
background: var(--secondary-700);
|
||||||
|
border-radius: 16px;
|
||||||
|
position: relative;
|
||||||
|
width: 330px;
|
||||||
|
|
||||||
|
& > .info-wrapper {
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
& > .avatar-wrapper {
|
||||||
|
flex-shrink: 0;
|
||||||
|
margin-right: 14px;
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
& > .avatar {
|
||||||
|
object-fit: cover;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
height: 82px;
|
||||||
|
width: 82px;
|
||||||
|
border-radius: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .status {
|
||||||
|
display: inline-block;
|
||||||
|
min-width: 80px;
|
||||||
|
text-align: center;
|
||||||
|
padding: 2px 8px;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 16px;
|
||||||
|
color: var(--typography-100);
|
||||||
|
background-color: var(--typography);
|
||||||
|
text-transform: capitalize;
|
||||||
|
margin-top: 7px;
|
||||||
|
border-radius: 22px;
|
||||||
|
|
||||||
|
&.busy {
|
||||||
|
background: var(--warning);
|
||||||
|
color: var(--typography-900);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .main-info {
|
||||||
|
overflow: hidden;
|
||||||
|
flex-grow: 1;
|
||||||
|
|
||||||
|
& > .name-wrapper {
|
||||||
|
display: flex;
|
||||||
|
overflow: hidden;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
margin-bottom: 3px;
|
||||||
|
|
||||||
|
& > .name {
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 18px;
|
||||||
|
line-height: 135%;
|
||||||
|
padding-right: 10px;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .reviews-wrapper {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
color: var(--typography-100);
|
||||||
|
|
||||||
|
& > .review {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 22px;
|
||||||
|
line-height: 32px;
|
||||||
|
color: var(--typography-100);
|
||||||
|
|
||||||
|
& > .star {
|
||||||
|
margin-left: 5px;
|
||||||
|
margin-right: 1px;
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .reviews {
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 130%;
|
||||||
|
margin-left: 26px;
|
||||||
|
max-width: 85px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .specializations {
|
||||||
|
margin: 7px -2.5px -8px;
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
& > .item {
|
||||||
|
padding-right: 2.5px;
|
||||||
|
padding-left: 2.5px;
|
||||||
|
padding-bottom: 8px;
|
||||||
|
|
||||||
|
& > .tag {
|
||||||
|
color: var(--typography-200);
|
||||||
|
padding: 3px 10px;
|
||||||
|
cursor: default;
|
||||||
|
height: 28px;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
white-space: nowrap;
|
||||||
|
border-radius: 20px;
|
||||||
|
justify-content: center;
|
||||||
|
transition: color 0.15s ease-in-out,
|
||||||
|
background-color 0.15s ease-in-out, border 0.15s ease-in-out;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 18px;
|
||||||
|
background: var(--primary-600);
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .experience {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 130%;
|
||||||
|
margin-top: 7px;
|
||||||
|
|
||||||
|
& > svg {
|
||||||
|
margin-right: 6px;
|
||||||
|
fill: var(--primary-200);
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .footer {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
& > .price-wrapper {
|
||||||
|
margin-top: auto;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
width: 88px;
|
||||||
|
margin-right: 20px;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 130%;
|
||||||
|
|
||||||
|
& > .price {
|
||||||
|
display: inline-block;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 24px;
|
||||||
|
color: var(--typography-200);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .button-wrapper {
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
z-index: 2;
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 20px;
|
||||||
|
|
||||||
|
& > .button {
|
||||||
|
font-family: Open Sans, sans-serif;
|
||||||
|
color: var(--typography-100);
|
||||||
|
cursor: pointer;
|
||||||
|
background: var(--gradient-pink-base);
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: center;
|
||||||
|
text-decoration: none;
|
||||||
|
vertical-align: middle;
|
||||||
|
user-select: none;
|
||||||
|
padding: 5px 10px;
|
||||||
|
align-self: center;
|
||||||
|
outline: none;
|
||||||
|
border: none;
|
||||||
|
font-size: 16px;
|
||||||
|
transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out,
|
||||||
|
border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
|
||||||
|
|
||||||
|
height: 40px;
|
||||||
|
width: 100%;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 24px;
|
||||||
|
border-radius: 30px;
|
||||||
|
|
||||||
|
&:disabled {
|
||||||
|
opacity: 0.7;
|
||||||
|
cursor: not-allowed;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.primary {
|
||||||
|
background: var(--gradient-pink-base);
|
||||||
|
|
||||||
|
&:disabled {
|
||||||
|
background: none;
|
||||||
|
background-color: var(--secondary);
|
||||||
|
color: var(--typography-400);
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
99
src/components/ChatsPath/components/AuthModal/index.tsx
Normal file
99
src/components/ChatsPath/components/AuthModal/index.tsx
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
import Title from "@/components/Title";
|
||||||
|
import styles from "./styles.module.scss";
|
||||||
|
import EmailInput from "@/components/pages/ABDesign/v1/pages/EmailEnterPage/EmailInput";
|
||||||
|
import { useState } from "react";
|
||||||
|
import { useDispatch } from "react-redux";
|
||||||
|
import { actions } from "@/store";
|
||||||
|
import Button from "../../ui/Button";
|
||||||
|
import metricService, {
|
||||||
|
EGoals,
|
||||||
|
EMetrics,
|
||||||
|
} from "@/services/metric/metricService";
|
||||||
|
import { ESourceAuthorization } from "@/api/resources/User";
|
||||||
|
import { useAuthentication } from "@/hooks/authentication/use-authentication";
|
||||||
|
import Loader, { LoaderColor } from "@/components/Loader";
|
||||||
|
import { useNavigate } from "react-router-dom";
|
||||||
|
import routes from "@/routes";
|
||||||
|
|
||||||
|
function AuthModal() {
|
||||||
|
const navigate = useNavigate();
|
||||||
|
const { error, isLoading, authorization } = useAuthentication();
|
||||||
|
const dispatch = useDispatch();
|
||||||
|
|
||||||
|
const [email, setEmail] = useState("");
|
||||||
|
const [isValidEmail, setIsValidEmail] = useState(false);
|
||||||
|
const [isValidationShow, setIsValidationShow] = useState(false);
|
||||||
|
|
||||||
|
const handleValidEmail = (email: string) => {
|
||||||
|
dispatch(actions.form.addEmail(email));
|
||||||
|
setEmail(email);
|
||||||
|
setIsValidEmail(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleClickAuth = async (event: React.FormEvent) => {
|
||||||
|
event.preventDefault();
|
||||||
|
if (!isValidEmail) return setIsValidationShow(true);
|
||||||
|
await authorize();
|
||||||
|
metricService.reachGoal(EGoals.ENTERED_EMAIL, [
|
||||||
|
EMetrics.KLAVIYO,
|
||||||
|
EMetrics.YANDEX,
|
||||||
|
EMetrics.FACEBOOK,
|
||||||
|
]);
|
||||||
|
navigate(routes.client.chatsEmailConfirm());
|
||||||
|
};
|
||||||
|
|
||||||
|
const authorize = async () => {
|
||||||
|
await authorization(email, ESourceAuthorization["aura.chats"]);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={styles.container}>
|
||||||
|
<div className={styles.wrapper}>
|
||||||
|
<div className={styles.content}>
|
||||||
|
<Title className={styles.title} variant="h2">
|
||||||
|
Answers are a few steps away
|
||||||
|
</Title>
|
||||||
|
<h3 className={styles.subtitle}>
|
||||||
|
Just enter your email to get <span>3 FREE 🎁</span> <br />
|
||||||
|
sessions with 3 different psychics
|
||||||
|
</h3>
|
||||||
|
<form className={styles.form} onSubmit={handleClickAuth}>
|
||||||
|
<label htmlFor="email" className={styles.label}>
|
||||||
|
Enter your email:
|
||||||
|
</label>
|
||||||
|
<EmailInput
|
||||||
|
name="email"
|
||||||
|
value={email}
|
||||||
|
placeholder={"example@mail.com"}
|
||||||
|
onValid={handleValidEmail}
|
||||||
|
onInvalid={() => setIsValidEmail(false)}
|
||||||
|
inputContainerClassName={styles.inputContainer}
|
||||||
|
inputClassName={`${styles.input} ${
|
||||||
|
!isValidEmail && isValidationShow && styles.invalid
|
||||||
|
}`}
|
||||||
|
placeholderClassName={styles.placeholder}
|
||||||
|
/>
|
||||||
|
{!error && !isValidEmail && isValidationShow && (
|
||||||
|
<span className={styles.error}>Invalid email</span>
|
||||||
|
)}
|
||||||
|
{!!error && (
|
||||||
|
<span className={styles.error}>Something went wrong</span>
|
||||||
|
)}
|
||||||
|
<Button type="submit" classNameContainer={styles.button}>
|
||||||
|
{!isLoading && "Continue"}
|
||||||
|
{isLoading && <Loader color={LoaderColor.White} />}
|
||||||
|
</Button>
|
||||||
|
</form>
|
||||||
|
{/* Todo: add modal "why ask" */}
|
||||||
|
<div className={styles["why-ask"]}>
|
||||||
|
<button type="button">
|
||||||
|
<span>Why do we ask for your email?</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default AuthModal;
|
||||||
155
src/components/ChatsPath/components/AuthModal/styles.module.scss
Normal file
155
src/components/ChatsPath/components/AuthModal/styles.module.scss
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
.container {
|
||||||
|
width: 100%;
|
||||||
|
position: fixed;
|
||||||
|
z-index: 3;
|
||||||
|
bottom: 0dvh;
|
||||||
|
border: 1px solid var(--secondary);
|
||||||
|
border-top-left-radius: 16px;
|
||||||
|
border-top-right-radius: 16px;
|
||||||
|
background: var(--secondary-600);
|
||||||
|
}
|
||||||
|
|
||||||
|
.wrapper {
|
||||||
|
padding: 20px 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
max-width: 340px;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 20px;
|
||||||
|
line-height: 135%;
|
||||||
|
font-weight: 700;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
text-align: center;
|
||||||
|
color: var(--primary-100);
|
||||||
|
}
|
||||||
|
|
||||||
|
.subtitle {
|
||||||
|
font-size: 16px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
line-height: 150%;
|
||||||
|
color: var(--primary-200);
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
& > span {
|
||||||
|
color: var(--primary);
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.form {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
cursor: pointer;
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
text-align: left;
|
||||||
|
font-weight: 600;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
line-height: 120%;
|
||||||
|
color: var(--typography-100);
|
||||||
|
}
|
||||||
|
|
||||||
|
.inputContainer {
|
||||||
|
min-width: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
|
||||||
|
& > input:focus {
|
||||||
|
border-color: var(--primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .input:focus + .placeholder,
|
||||||
|
& > .input:not(:placeholder-shown) + .placeholder {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.input {
|
||||||
|
display: block;
|
||||||
|
color: var(--typography-100) !important;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 24px !important;
|
||||||
|
background-color: transparent;
|
||||||
|
background-clip: padding-box;
|
||||||
|
padding: 0 15px !important;
|
||||||
|
height: 40px !important;
|
||||||
|
border: 1px solid var(--secondary-100);
|
||||||
|
border-radius: 25px !important;
|
||||||
|
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out !important;
|
||||||
|
-webkit-appearance: none !important;
|
||||||
|
appearance: none !important;
|
||||||
|
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
||||||
|
|
||||||
|
&.invalid {
|
||||||
|
border: 2px solid var(--error) !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.placeholder {
|
||||||
|
left: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
display: inline-block;
|
||||||
|
width: 100%;
|
||||||
|
padding-left: 17px;
|
||||||
|
margin-top: 8px;
|
||||||
|
color: var(--error);
|
||||||
|
font-size: 12px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button {
|
||||||
|
margin-top: 28px;
|
||||||
|
|
||||||
|
& > button {
|
||||||
|
width: 100%;
|
||||||
|
height: 50px;
|
||||||
|
font-weight: 600;
|
||||||
|
padding: 10px 50px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.why-ask {
|
||||||
|
margin: 8px auto 5px;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
& > button {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: center;
|
||||||
|
vertical-align: middle;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
align-self: center;
|
||||||
|
border-radius: 30px;
|
||||||
|
outline: none;
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 24px;
|
||||||
|
transition: all 0.15s ease-in-out 0ms;
|
||||||
|
padding: 0;
|
||||||
|
border: none;
|
||||||
|
height: auto;
|
||||||
|
width: auto;
|
||||||
|
background: transparent;
|
||||||
|
color: var(--secondary-100);
|
||||||
|
text-decoration: underline;
|
||||||
|
|
||||||
|
& > span {
|
||||||
|
display: inherit;
|
||||||
|
align-items: inherit;
|
||||||
|
justify-content: inherit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
31
src/components/ChatsPath/components/BottomModal/index.tsx
Normal file
31
src/components/ChatsPath/components/BottomModal/index.tsx
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import styles from "./styles.module.scss";
|
||||||
|
|
||||||
|
interface IModalProps {
|
||||||
|
children: React.ReactNode;
|
||||||
|
handleClose: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
function BottomModal({ children, handleClose }: IModalProps) {
|
||||||
|
return (
|
||||||
|
<div className={styles.overlay}>
|
||||||
|
<div className={styles.wrapper}>
|
||||||
|
<div className={styles.content}>
|
||||||
|
<button type="button" className={styles.close} onClick={handleClose}>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
>
|
||||||
|
<title>cross</title>
|
||||||
|
<path d="M10.674 12l-6.837 6.837 1.326 1.326 6.837-6.837 6.837 6.837 1.326-1.326-6.837-6.837 6.837-6.837-1.326-1.326-6.837 6.837-6.837-6.837-1.326 1.326 6.837 6.837z"></path>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<div className={styles.body}>{children}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default BottomModal;
|
||||||
@ -0,0 +1,75 @@
|
|||||||
|
.overlay {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100dvw;
|
||||||
|
height: 100dvh;
|
||||||
|
z-index: 11;
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.wrapper {
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
background: var(--gradient-amethyst);
|
||||||
|
color: var(--typography-100);
|
||||||
|
bottom: 0;
|
||||||
|
border-top-right-radius: 20px;
|
||||||
|
border-top-left-radius: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
flex-grow: 1;
|
||||||
|
overflow-y: auto;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.close {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: center;
|
||||||
|
text-decoration: none;
|
||||||
|
vertical-align: middle;
|
||||||
|
user-select: none;
|
||||||
|
font-size: 24px;
|
||||||
|
line-height: 24px;
|
||||||
|
outline: none;
|
||||||
|
transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out,
|
||||||
|
border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
|
||||||
|
background: transparent;
|
||||||
|
flex: 0 0 auto;
|
||||||
|
overflow: visible;
|
||||||
|
border-radius: 50%;
|
||||||
|
padding: 0;
|
||||||
|
border: none;
|
||||||
|
color: var(--secondary-300);
|
||||||
|
position: absolute;
|
||||||
|
right: 16px;
|
||||||
|
top: 16px;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
& > svg {
|
||||||
|
fill: currentColor;
|
||||||
|
transition: fill 0.3s ease-in-out, opacity 0.3s ease-in-out;
|
||||||
|
flex-shrink: 0;
|
||||||
|
display: inline-block;
|
||||||
|
user-select: none;
|
||||||
|
width: 1em;
|
||||||
|
height: 1em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.body {
|
||||||
|
padding-right: 15px;
|
||||||
|
padding-left: 15px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
flex-grow: 1;
|
||||||
|
max-width: 360px;
|
||||||
|
margin: 50px auto 20px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
47
src/components/ChatsPath/components/ChatsCategory/index.tsx
Normal file
47
src/components/ChatsPath/components/ChatsCategory/index.tsx
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
import { IAssistant, ICategory } from "@/api/resources/ChatsCategories";
|
||||||
|
import styles from "./styles.module.scss";
|
||||||
|
import Title from "@/components/Title";
|
||||||
|
import Assistant from "../Assistant";
|
||||||
|
|
||||||
|
interface IChatsCategoryProps {
|
||||||
|
category: ICategory;
|
||||||
|
loadingAssistantId: string;
|
||||||
|
handleAssistantClick: (assistant: IAssistant) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ChatsCategory({
|
||||||
|
category,
|
||||||
|
loadingAssistantId,
|
||||||
|
handleAssistantClick,
|
||||||
|
}: IChatsCategoryProps) {
|
||||||
|
return (
|
||||||
|
<div className={styles.container}>
|
||||||
|
<div className={styles.header}>
|
||||||
|
<div className={styles.icon}>
|
||||||
|
{category.icon?.length && (
|
||||||
|
<img src={category.icon} alt={category.title} />
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<Title variant="h2" className={styles.title}>
|
||||||
|
{category.title}
|
||||||
|
</Title>
|
||||||
|
</div>
|
||||||
|
<Title variant="h3" className={styles.subtitle}>
|
||||||
|
{category.subtitle}
|
||||||
|
</Title>
|
||||||
|
<ul className={styles.assistants}>
|
||||||
|
{category.assistants.map((assistant, index) => (
|
||||||
|
<li key={index}>
|
||||||
|
<Assistant
|
||||||
|
{...assistant}
|
||||||
|
isLoading={loadingAssistantId === assistant.id}
|
||||||
|
onAssistantClick={handleAssistantClick}
|
||||||
|
/>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ChatsCategory;
|
||||||
@ -0,0 +1,64 @@
|
|||||||
|
.container {
|
||||||
|
padding-left: 15px;
|
||||||
|
padding-right: 15px;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
color: var(--primary-400);
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
background: var(--primary);
|
||||||
|
border-radius: 4px;
|
||||||
|
margin-right: 12px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
flex-shrink: 0;
|
||||||
|
|
||||||
|
& > img {
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
margin: 0;
|
||||||
|
font-family: Montserrat, sans-serif;
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 20px;
|
||||||
|
line-height: 24px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.subtitle {
|
||||||
|
margin-bottom: 24px;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 130%;
|
||||||
|
font-weight: 400;
|
||||||
|
color: var(--primary-200);
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.assistants {
|
||||||
|
display: flex;
|
||||||
|
overflow: auto;
|
||||||
|
|
||||||
|
&::-webkit-scrollbar {
|
||||||
|
display: none !important;
|
||||||
|
height: 0 !important;
|
||||||
|
width: 0 !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
display: none !important;
|
||||||
|
height: 0 !important;
|
||||||
|
width: 0 !important;
|
||||||
|
}
|
||||||
@ -18,7 +18,7 @@ function DrawerMenu({ open, toggleDrawer }: IDrawerMenuProps) {
|
|||||||
onClose={toggleDrawer(false)}
|
onClose={toggleDrawer(false)}
|
||||||
>
|
>
|
||||||
<div className={styles.close}>
|
<div className={styles.close}>
|
||||||
<span className={styles["close-wrapper"]}>
|
<span className={styles["close-wrapper"]} onClick={toggleDrawer(false)}>
|
||||||
<svg
|
<svg
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
width="16px"
|
width="16px"
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import Burger from "../../ui/Burger";
|
|||||||
interface IHeaderProps {
|
interface IHeaderProps {
|
||||||
isBackButtonVisible?: boolean;
|
isBackButtonVisible?: boolean;
|
||||||
isBurgerVisible?: boolean;
|
isBurgerVisible?: boolean;
|
||||||
|
isLogoVisible?: boolean;
|
||||||
className?: string;
|
className?: string;
|
||||||
classNameTitle?: string;
|
classNameTitle?: string;
|
||||||
onBack?: () => void;
|
onBack?: () => void;
|
||||||
@ -17,6 +18,7 @@ function Header({
|
|||||||
classNameTitle = "",
|
classNameTitle = "",
|
||||||
isBackButtonVisible = true,
|
isBackButtonVisible = true,
|
||||||
isBurgerVisible = true,
|
isBurgerVisible = true,
|
||||||
|
isLogoVisible = true,
|
||||||
onBurger,
|
onBurger,
|
||||||
onBack,
|
onBack,
|
||||||
}: IHeaderProps) {
|
}: IHeaderProps) {
|
||||||
@ -32,9 +34,11 @@ function Header({
|
|||||||
onClick={handleBack}
|
onClick={handleBack}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<Title className={`${styles.title} ${classNameTitle}`} variant="h2">
|
{isLogoVisible && (
|
||||||
AURA
|
<Title className={`${styles.title} ${classNameTitle}`} variant="h2">
|
||||||
</Title>
|
AURA
|
||||||
|
</Title>
|
||||||
|
)}
|
||||||
{isBurgerVisible && (
|
{isBurgerVisible && (
|
||||||
<Burger onClick={onBurger} className={styles.burger} />
|
<Burger onClick={onBurger} className={styles.burger} />
|
||||||
)}
|
)}
|
||||||
|
|||||||
@ -5,6 +5,7 @@
|
|||||||
flex-grow: 0;
|
flex-grow: 0;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
min-height: 45px;
|
||||||
position: relative;
|
position: relative;
|
||||||
align-self: center;
|
align-self: center;
|
||||||
padding: 17px 25px 0;
|
padding: 17px 25px 0;
|
||||||
|
|||||||
@ -27,7 +27,11 @@ function InputAnswerModal({
|
|||||||
aria-describedby="modal-modal-description"
|
aria-describedby="modal-modal-description"
|
||||||
>
|
>
|
||||||
<div className={styles.container}>
|
<div className={styles.container}>
|
||||||
<button type="button" className={styles["close-icon"]}>
|
<button
|
||||||
|
type="button"
|
||||||
|
className={styles["close-icon"]}
|
||||||
|
onClick={onClose}
|
||||||
|
>
|
||||||
<span className={styles["close-icon-label"]}>
|
<span className={styles["close-icon-label"]}>
|
||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
|||||||
29
src/components/ChatsPath/data/goalAnswers.ts
Normal file
29
src/components/ChatsPath/data/goalAnswers.ts
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import { IAnswer } from ".";
|
||||||
|
|
||||||
|
|
||||||
|
export const goalAnswers: IAnswer[] = [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
value: "about_ex",
|
||||||
|
name: "💖 Find out about my ex",
|
||||||
|
questionId: "goal",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
value: "give_advice",
|
||||||
|
name: "👩❤️👨 Give advice for my love life",
|
||||||
|
questionId: "goal",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 3,
|
||||||
|
value: "give_guidance",
|
||||||
|
name: "✨ Give guidance on my future",
|
||||||
|
questionId: "goal",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 4,
|
||||||
|
value: "all",
|
||||||
|
name: "🔮 All above",
|
||||||
|
questionId: "goal",
|
||||||
|
},
|
||||||
|
];
|
||||||
41
src/components/ChatsPath/data/missingInLifeAnswers.ts
Normal file
41
src/components/ChatsPath/data/missingInLifeAnswers.ts
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
import { IAnswer } from ".";
|
||||||
|
|
||||||
|
export const missingInLifeAnswers: IAnswer[] = [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
value: "love_happiness",
|
||||||
|
name: "Love happiness",
|
||||||
|
questionId: "missingInLife"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
value: "personal_fulfillment",
|
||||||
|
name: "Personal fulfillment",
|
||||||
|
questionId: "missingInLife"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 3,
|
||||||
|
value: "guidance_and_support",
|
||||||
|
name: "Guidance and support",
|
||||||
|
questionId: "missingInLife"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 4,
|
||||||
|
value: "self_confidence",
|
||||||
|
name: "Self-confidence",
|
||||||
|
questionId: "missingInLife"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 5,
|
||||||
|
value: "all_the_above",
|
||||||
|
name: "All the above",
|
||||||
|
questionId: "missingInLife"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 6,
|
||||||
|
value: "not_sure",
|
||||||
|
name: "Not sure",
|
||||||
|
questionId: "missingInLife"
|
||||||
|
},
|
||||||
|
|
||||||
|
]
|
||||||
156
src/components/ChatsPath/data/reviews.ts
Normal file
156
src/components/ChatsPath/data/reviews.ts
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
import { IReview } from ".";
|
||||||
|
|
||||||
|
export const reviewsByGoal: Record<string, IReview[]> = {
|
||||||
|
about_ex: [
|
||||||
|
{
|
||||||
|
avatar: "Customer1.webp",
|
||||||
|
name: "Leslie, 30",
|
||||||
|
text: `"These readings have provided insights into my ex and helped me understand what went wrong. That was truly helpful!"`,
|
||||||
|
date: "01/08/2024",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
avatar: "Customer2.webp",
|
||||||
|
name: "Theresa Webb, 24",
|
||||||
|
text: `"Thank you so much, Olivia! Your readings played a crucial role in my healing journey after the breakup."`,
|
||||||
|
date: "02/11/2024",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
avatar: "Customer3.webp",
|
||||||
|
name: "Numich, 32",
|
||||||
|
text: `"Guidance gave me confidence in next steps and reduced confusions. Helped me to look both ways with my decisions! Told me a lot that helped me trust my intuition and guts!"`,
|
||||||
|
date: "10/11/2023",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
avatar: "Customer4.webp",
|
||||||
|
name: "Heather Camille, 26",
|
||||||
|
text: `"I’ve been using Aura for a few months now, and have had amazing readings/guidance from a few different advisors."`,
|
||||||
|
date: "10/09/2023",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
avatar: "Customer5.webp",
|
||||||
|
name: "Emersyn, 21",
|
||||||
|
text: `"I’m happy with my experience in Aura. I like that there is important improvements from time to time, which really helps to use Aura."`,
|
||||||
|
date: "06/22/2023",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
avatar: "Customer6.webp",
|
||||||
|
name: "Rylee, 34",
|
||||||
|
text: `"Best reading I\`ve had. Thank you for helping understand what is going on in my life. I stand firmly on my feet, I met my soulmate, my love. I fell very inspired."`,
|
||||||
|
date: "10/14/2023",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
give_advice: [
|
||||||
|
{
|
||||||
|
avatar: "Customer9.webp",
|
||||||
|
name: "Khaly, 24",
|
||||||
|
text: `"It was a fast and direct reading I felt she connected to my situation and the person I asked about. It felt honest and I would certainly be back or recommend to others."`,
|
||||||
|
date: "01/16/2024",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
avatar: "Customer2.webp",
|
||||||
|
name: "Layla, 31",
|
||||||
|
text: `"These readings have offered invaluable insights into my love life, guiding me towards a brighter path. I'm truly grateful!"`,
|
||||||
|
date: "10/15/2023",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
avatar: "Customer3.webp",
|
||||||
|
name: "Numich, 32",
|
||||||
|
text: `"Guidance gave me confidence in next steps and reduced confusions. Helped me to look both ways with my decisions! Told me a lot that helped me trust my intuition and guts!"`,
|
||||||
|
date: "10/11/2023",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
avatar: "Customer4.webp",
|
||||||
|
name: "Heather Camille, 26",
|
||||||
|
text: `"I’ve been using Aura for a few months now, and have had amazing readings/guidance from a few different advisors."`,
|
||||||
|
date: "10/09/2023",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
avatar: "Customer5.webp",
|
||||||
|
name: "Emersyn, 21",
|
||||||
|
text: `"I’m happy with my experience in Aura. I like that there is important improvements from time to time, which really helps to use Aura."`,
|
||||||
|
date: "06/22/2023",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
avatar: "Customer6.webp",
|
||||||
|
name: "Rylee, 34",
|
||||||
|
text: `"Best reading I\`ve had. Thank you for helping understand what is going on in my life. I stand firmly on my feet, I met my soulmate, my love. I fell very inspired."`,
|
||||||
|
date: "10/14/2023",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
give_guidance: [
|
||||||
|
{
|
||||||
|
avatar: "Customer8.webp",
|
||||||
|
name: "Hazel, 24",
|
||||||
|
text: `"These readings have been a guiding light toward a brighter future. Thank you for your wisdom."`,
|
||||||
|
date: "01/16/2024",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
avatar: "Customer1.webp",
|
||||||
|
name: "Ellison, 31",
|
||||||
|
text: `"I was confused about everything that was happening in my life. I was confused about myself. And step by step, this amazing woman, my expert, helped me to feel better."`,
|
||||||
|
date: "10/15/2023",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
avatar: "Customer3.webp",
|
||||||
|
name: "Numich, 32",
|
||||||
|
text: `"Guidance gave me confidence in next steps and reduced confusions. Helped me to look both ways with my decisions! Told me a lot that helped me trust my intuition and guts!"`,
|
||||||
|
date: "10/11/2023",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
avatar: "Customer4.webp",
|
||||||
|
name: "Heather Camille, 26",
|
||||||
|
text: `"I’ve been using Aura for a few months now, and have had amazing readings/guidance from a few different advisors."`,
|
||||||
|
date: "10/09/2023",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
avatar: "Customer5.webp",
|
||||||
|
name: "Emersyn, 21",
|
||||||
|
text: `"I’m happy with my experience in Aura. I like that there is important improvements from time to time, which really helps to use Aura."`,
|
||||||
|
date: "06/22/2023",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
avatar: "Customer6.webp",
|
||||||
|
name: "Rylee, 34",
|
||||||
|
text: `"Best reading I\`ve had. Thank you for helping understand what is going on in my life. I stand firmly on my feet, I met my soulmate, my love. I fell very inspired."`,
|
||||||
|
date: "10/14/2023",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
all: [
|
||||||
|
{
|
||||||
|
avatar: "Customer1.webp",
|
||||||
|
name: "Leslie, 30",
|
||||||
|
text: `"These readings have provided insights into my ex and helped me understand what went wrong. That was truly helpful!"`,
|
||||||
|
date: "01/08/2024",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
avatar: "Customer9.webp",
|
||||||
|
name: "Khaly, 24",
|
||||||
|
text: `"It was a fast and direct reading I felt she connected to my situation and the person I asked about. It felt honest and I would certainly be back or recommend to others."`,
|
||||||
|
date: "01/16/2024",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
avatar: "Customer3.webp",
|
||||||
|
name: "Numich, 32",
|
||||||
|
text: `"Guidance gave me confidence in next steps and reduced confusions. Helped me to look both ways with my decisions! Told me a lot that helped me trust my intuition and guts!"`,
|
||||||
|
date: "10/11/2023",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
avatar: "Customer4.webp",
|
||||||
|
name: "Heather Camille, 26",
|
||||||
|
text: `"I’ve been using Aura for a few months now, and have had amazing readings/guidance from a few different advisors."`,
|
||||||
|
date: "10/09/2023",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
avatar: "Customer5.webp",
|
||||||
|
name: "Emersyn, 21",
|
||||||
|
text: `"I’m happy with my experience in Aura. I like that there is important improvements from time to time, which really helps to use Aura."`,
|
||||||
|
date: "06/22/2023",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
avatar: "Customer6.webp",
|
||||||
|
name: "Rylee, 34",
|
||||||
|
text: `"Best reading I\`ve had. Thank you for helping understand what is going on in my life. I stand firmly on my feet, I met my soulmate, my love. I fell very inspired."`,
|
||||||
|
date: "10/14/2023",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
};
|
||||||
34
src/components/ChatsPath/data/whatEmotionAnswers.ts
Normal file
34
src/components/ChatsPath/data/whatEmotionAnswers.ts
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
import { IAnswer } from ".";
|
||||||
|
|
||||||
|
export const whatEmotionAnswers: IAnswer[] = [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
value: "confused_about_choices",
|
||||||
|
name: "Confused about choices",
|
||||||
|
questionId: "whatEmotion",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
value: "worried_future",
|
||||||
|
name: "Worried about the future",
|
||||||
|
questionId: "whatEmotion",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 3,
|
||||||
|
value: "disappointed_in_love_life",
|
||||||
|
name: "Disappointed in love life",
|
||||||
|
questionId: "whatEmotion",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 4,
|
||||||
|
value: "optimistic_for_changes",
|
||||||
|
name: "Optimistic for changes",
|
||||||
|
questionId: "whatEmotion",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 5,
|
||||||
|
value: "not_sure",
|
||||||
|
name: "Not sure",
|
||||||
|
questionId: "whatEmotion",
|
||||||
|
},
|
||||||
|
]
|
||||||
132
src/components/ChatsPath/data/yourGoalAnswers.ts
Normal file
132
src/components/ChatsPath/data/yourGoalAnswers.ts
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
import { IAnswer } from ".";
|
||||||
|
|
||||||
|
export const yourGoalAnswers: Record<string, IAnswer[]> = {
|
||||||
|
about_ex: [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
value: "back_together",
|
||||||
|
name: "Find out if we’ll get back together",
|
||||||
|
questionId: "yourGoal",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
value: "ex_still_feelings",
|
||||||
|
name: "Find out if ex still has feelings",
|
||||||
|
questionId: "yourGoal",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 3,
|
||||||
|
value: "ex_has_someone_else",
|
||||||
|
name: "Find out if my ex has someone else",
|
||||||
|
questionId: "yourGoal",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 4,
|
||||||
|
value: "move_on_after_breakup",
|
||||||
|
name: "Move on after breakup",
|
||||||
|
questionId: "yourGoal",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 5,
|
||||||
|
value: "other",
|
||||||
|
name: "Other (please specify)",
|
||||||
|
questionId: "yourGoal",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
give_advice: [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
value: "improve_relationship",
|
||||||
|
name: "Improve my relationship",
|
||||||
|
questionId: "yourGoal",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
value: "find_soulmate",
|
||||||
|
name: "Find my soulmate",
|
||||||
|
questionId: "yourGoal",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 3,
|
||||||
|
value: "check_compatibility",
|
||||||
|
name: "Check compatibility",
|
||||||
|
questionId: "yourGoal",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 4,
|
||||||
|
value: "heal_from_heartbreak",
|
||||||
|
name: "Heal from heartbreak",
|
||||||
|
questionId: "yourGoal",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 5,
|
||||||
|
value: "other",
|
||||||
|
name: "Other (please specify)",
|
||||||
|
questionId: "yourGoal",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
give_guidance: [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
value: "get_advice",
|
||||||
|
name: "Get advice on decision",
|
||||||
|
questionId: "yourGoal",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
value: "find_clarity",
|
||||||
|
name: "Find clarity in life",
|
||||||
|
questionId: "yourGoal",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 3,
|
||||||
|
value: "receive_insights",
|
||||||
|
name: "Receive insights about future",
|
||||||
|
questionId: "yourGoal",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 4,
|
||||||
|
value: "understanding_support",
|
||||||
|
name: "Get understanding and support",
|
||||||
|
questionId: "yourGoal",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 5,
|
||||||
|
value: "other",
|
||||||
|
name: "Other (please specify)",
|
||||||
|
questionId: "yourGoal",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
all: [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
value: "we_can_back_together",
|
||||||
|
name: "Find out if we can get back together",
|
||||||
|
questionId: "yourGoal",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
value: "get_clarity",
|
||||||
|
name: "Get clarity in love & life",
|
||||||
|
questionId: "yourGoal",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 3,
|
||||||
|
value: "explore_future_relationship",
|
||||||
|
name: "Explore future relationship paths",
|
||||||
|
questionId: "yourGoal",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 4,
|
||||||
|
value: "discover_myself",
|
||||||
|
name: "Discover more about myself",
|
||||||
|
questionId: "yourGoal",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 5,
|
||||||
|
value: "other",
|
||||||
|
name: "Other (please specify)",
|
||||||
|
questionId: "yourGoal",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
@ -6,6 +6,8 @@ import Button from "../../ui/Button";
|
|||||||
import AnimateMessages, {
|
import AnimateMessages, {
|
||||||
IAnimateMessage,
|
IAnimateMessage,
|
||||||
} from "../../components/AnimateMessages";
|
} from "../../components/AnimateMessages";
|
||||||
|
import { useSelector } from "react-redux";
|
||||||
|
import { selectors } from "@/store";
|
||||||
|
|
||||||
const messages: IAnimateMessage[] = [
|
const messages: IAnimateMessage[] = [
|
||||||
{
|
{
|
||||||
@ -35,8 +37,19 @@ const messages: IAnimateMessage[] = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const currentDescription: Record<string, string> = {
|
||||||
|
confused_about_choices: "guiding you towards confident choices",
|
||||||
|
worried_future: "easing your concerns about the future",
|
||||||
|
disappointed_in_love_life: "improving your love life and relationships",
|
||||||
|
optimistic_for_changes: "maximizing the positive changes in your life",
|
||||||
|
not_sure: "clarifying your thoughts and emotions",
|
||||||
|
default: "maximizing the positive changes in your life",
|
||||||
|
};
|
||||||
|
|
||||||
function AnswerHub() {
|
function AnswerHub() {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
const { gender } = useSelector(selectors.selectQuestionnaire);
|
||||||
|
const { whatEmotion } = useSelector(selectors.selectAnswers);
|
||||||
|
|
||||||
const handleNext = () => {
|
const handleNext = () => {
|
||||||
navigate(routes.client.chatsQuizWhatYouWant());
|
navigate(routes.client.chatsQuizWhatYouWant());
|
||||||
@ -49,10 +62,11 @@ function AnswerHub() {
|
|||||||
Get answers to every question that bothers you
|
Get answers to every question that bothers you
|
||||||
</Title>
|
</Title>
|
||||||
<p className={styles.text}>
|
<p className={styles.text}>
|
||||||
Our experts already helped <strong>10 million men</strong> with their
|
Our experts already helped{" "}
|
||||||
personal questions, and look forward to{" "}
|
<strong>10 million {gender === "female" ? "women" : "men"}</strong> with
|
||||||
|
their personal questions, and look forward to{" "}
|
||||||
<span className={styles.purple}>
|
<span className={styles.purple}>
|
||||||
guiding you towards confident choices
|
{currentDescription[whatEmotion] || currentDescription.default}
|
||||||
</span>
|
</span>
|
||||||
</p>
|
</p>
|
||||||
<Button classNameContainer={styles.button} onClick={handleNext}>
|
<Button classNameContainer={styles.button} onClick={handleNext}>
|
||||||
|
|||||||
@ -38,7 +38,7 @@ function Date() {
|
|||||||
value={birthdate}
|
value={birthdate}
|
||||||
onValid={handleValid}
|
onValid={handleValid}
|
||||||
onInvalid={() => setIsDisabled(true)}
|
onInvalid={() => setIsDisabled(true)}
|
||||||
inputClassName="date-picker-input"
|
inputClassName={styles["date-picker-input"]}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
|
|||||||
@ -9,3 +9,8 @@
|
|||||||
.title {
|
.title {
|
||||||
margin-top: 24px;
|
margin-top: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.date-picker-input > h3 {
|
||||||
|
margin-left: 0;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
@ -1,9 +1,9 @@
|
|||||||
import Answers from "@/components/ChatsPath/components/Answers";
|
import Answers from "@/components/ChatsPath/components/Answers";
|
||||||
import { IAnswer } from "../../../data";
|
|
||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
import routes from "@/routes";
|
import routes from "@/routes";
|
||||||
import styles from "./styles.module.scss";
|
import styles from "./styles.module.scss";
|
||||||
import { useUpdateStep } from "@/components/ChatsPath/hooks/useUpdateStep";
|
import { useUpdateStep } from "@/components/ChatsPath/hooks/useUpdateStep";
|
||||||
|
import { goalAnswers } from "@/components/ChatsPath/data/goalAnswers";
|
||||||
|
|
||||||
function Goal() {
|
function Goal() {
|
||||||
useUpdateStep(2);
|
useUpdateStep(2);
|
||||||
@ -13,36 +13,12 @@ function Goal() {
|
|||||||
navigate(routes.client.chatsGoalSetup());
|
navigate(routes.client.chatsGoalSetup());
|
||||||
};
|
};
|
||||||
|
|
||||||
const answers: IAnswer[] = [
|
const answers = goalAnswers.map((answer) => {
|
||||||
{
|
return {
|
||||||
id: 1,
|
...answer,
|
||||||
value: "about_ex",
|
|
||||||
name: "💖 Find out about my ex",
|
|
||||||
questionId: "goal",
|
|
||||||
onClick: handleNext,
|
onClick: handleNext,
|
||||||
},
|
};
|
||||||
{
|
});
|
||||||
id: 2,
|
|
||||||
value: "give_advice",
|
|
||||||
name: "👩❤️👨 Give advice for my love life",
|
|
||||||
questionId: "goal",
|
|
||||||
onClick: handleNext,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 3,
|
|
||||||
value: "give_guidance",
|
|
||||||
name: "✨ Give guidance on my future",
|
|
||||||
questionId: "goal",
|
|
||||||
onClick: handleNext,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 3,
|
|
||||||
value: "all",
|
|
||||||
name: "🔮 All above",
|
|
||||||
questionId: "goal",
|
|
||||||
onClick: handleNext,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@ -3,6 +3,7 @@ import { useUpdateStep } from "@/components/ChatsPath/hooks/useUpdateStep";
|
|||||||
import routes from "@/routes";
|
import routes from "@/routes";
|
||||||
import { IAnswer } from "@/components/ChatsPath/data";
|
import { IAnswer } from "@/components/ChatsPath/data";
|
||||||
import Answers from "@/components/ChatsPath/components/Answers";
|
import Answers from "@/components/ChatsPath/components/Answers";
|
||||||
|
import { missingInLifeAnswers } from "@/components/ChatsPath/data/missingInLifeAnswers";
|
||||||
|
|
||||||
function MissingInLife() {
|
function MissingInLife() {
|
||||||
useUpdateStep(9);
|
useUpdateStep(9);
|
||||||
@ -12,50 +13,12 @@ function MissingInLife() {
|
|||||||
navigate(routes.client.chatsRecognize());
|
navigate(routes.client.chatsRecognize());
|
||||||
};
|
};
|
||||||
|
|
||||||
const answers: IAnswer[] = [
|
const answers: IAnswer[] = missingInLifeAnswers.map((answer) => {
|
||||||
{
|
return {
|
||||||
id: 1,
|
...answer,
|
||||||
value: "love_happiness",
|
|
||||||
name: "Love happiness",
|
|
||||||
questionId: "missingInLife",
|
|
||||||
onClick: handleNext,
|
onClick: handleNext,
|
||||||
},
|
};
|
||||||
{
|
});
|
||||||
id: 2,
|
|
||||||
value: "personal_fulfillment",
|
|
||||||
name: "Personal fulfillment",
|
|
||||||
questionId: "missingInLife",
|
|
||||||
onClick: handleNext,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 3,
|
|
||||||
value: "guidance_and_support",
|
|
||||||
name: "Guidance and support",
|
|
||||||
questionId: "missingInLife",
|
|
||||||
onClick: handleNext,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 4,
|
|
||||||
value: "self_confidence",
|
|
||||||
name: "Self-confidence",
|
|
||||||
questionId: "missingInLife",
|
|
||||||
onClick: handleNext,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 5,
|
|
||||||
value: "all_the_above",
|
|
||||||
name: "All the above",
|
|
||||||
questionId: "missingInLife",
|
|
||||||
onClick: handleNext,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 6,
|
|
||||||
value: "not_sure",
|
|
||||||
name: "Not sure",
|
|
||||||
questionId: "missingInLife",
|
|
||||||
onClick: handleNext,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@ -29,8 +29,8 @@
|
|||||||
line-height: 24px !important;
|
line-height: 24px !important;
|
||||||
background-color: transparent !important;
|
background-color: transparent !important;
|
||||||
background-clip: padding-box !important;
|
background-clip: padding-box !important;
|
||||||
padding-left: 15px !important;
|
padding-left: 24px !important;
|
||||||
padding-right: 15px !important;
|
padding-right: 24px !important;
|
||||||
border: 1px solid var(--secondary-100) !important;
|
border: 1px solid var(--secondary-100) !important;
|
||||||
border-radius: 25px !important;
|
border-radius: 25px !important;
|
||||||
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out !important;
|
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out !important;
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
import Answers from "@/components/ChatsPath/components/Answers";
|
import Answers from "@/components/ChatsPath/components/Answers";
|
||||||
import { IAnswer } from "../../../data";
|
|
||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
import routes from "@/routes";
|
import routes from "@/routes";
|
||||||
import { useUpdateStep } from "@/components/ChatsPath/hooks/useUpdateStep";
|
import { useUpdateStep } from "@/components/ChatsPath/hooks/useUpdateStep";
|
||||||
|
import { whatEmotionAnswers } from "@/components/ChatsPath/data/whatEmotionAnswers";
|
||||||
|
|
||||||
function WhatEmotion() {
|
function WhatEmotion() {
|
||||||
useUpdateStep(7);
|
useUpdateStep(7);
|
||||||
@ -12,43 +12,12 @@ function WhatEmotion() {
|
|||||||
navigate(routes.client.chatsAnswerHub());
|
navigate(routes.client.chatsAnswerHub());
|
||||||
};
|
};
|
||||||
|
|
||||||
const answers: IAnswer[] = [
|
const answers = whatEmotionAnswers.map((answer) => {
|
||||||
{
|
return {
|
||||||
id: 1,
|
...answer,
|
||||||
value: "confused_about_choices",
|
|
||||||
name: "Confused about choices",
|
|
||||||
questionId: "whatEmotion",
|
|
||||||
onClick: handleNext,
|
onClick: handleNext,
|
||||||
},
|
};
|
||||||
{
|
});
|
||||||
id: 2,
|
|
||||||
value: "worried_future",
|
|
||||||
name: "Worried about the future",
|
|
||||||
questionId: "whatEmotion",
|
|
||||||
onClick: handleNext,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 3,
|
|
||||||
value: "disappointed_in_love_life",
|
|
||||||
name: "Disappointed in love life",
|
|
||||||
questionId: "whatEmotion",
|
|
||||||
onClick: handleNext,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 4,
|
|
||||||
value: "optimistic_for_changes",
|
|
||||||
name: "Optimistic for changes",
|
|
||||||
questionId: "whatEmotion",
|
|
||||||
onClick: handleNext,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 5,
|
|
||||||
value: "not_sure",
|
|
||||||
name: "Not sure",
|
|
||||||
questionId: "whatEmotion",
|
|
||||||
onClick: handleNext,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@ -5,13 +5,15 @@ import { IAnswer } from "@/components/ChatsPath/data";
|
|||||||
import Answers from "@/components/ChatsPath/components/Answers";
|
import Answers from "@/components/ChatsPath/components/Answers";
|
||||||
import InputAnswerModal from "@/components/ChatsPath/components/InputAnswerModal";
|
import InputAnswerModal from "@/components/ChatsPath/components/InputAnswerModal";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useDispatch } from "react-redux";
|
import { useDispatch, useSelector } from "react-redux";
|
||||||
import { actions } from "@/store";
|
import { actions, selectors } from "@/store";
|
||||||
|
import { yourGoalAnswers } from "@/components/ChatsPath/data/yourGoalAnswers";
|
||||||
|
|
||||||
function YourGoal() {
|
function YourGoal() {
|
||||||
useUpdateStep(10);
|
useUpdateStep(10);
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
|
const { goal } = useSelector(selectors.selectAnswers);
|
||||||
|
|
||||||
const [answer, setAnswer] = useState("");
|
const [answer, setAnswer] = useState("");
|
||||||
|
|
||||||
@ -24,43 +26,12 @@ function YourGoal() {
|
|||||||
navigate(routes.client.chatsQuizSomethingWorrying());
|
navigate(routes.client.chatsQuizSomethingWorrying());
|
||||||
};
|
};
|
||||||
|
|
||||||
const answers: IAnswer[] = [
|
const answers: IAnswer[] = yourGoalAnswers[goal]?.map((answer) => {
|
||||||
{
|
return {
|
||||||
id: 1,
|
...answer,
|
||||||
value: "back_together",
|
onClick: answer.value === "other" ? handleOpen : handleNext,
|
||||||
name: "Find out if we’ll get back together",
|
};
|
||||||
questionId: "yourGoal",
|
});
|
||||||
onClick: handleNext,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 2,
|
|
||||||
value: "ex_still_feelings",
|
|
||||||
name: "Find out if ex still has feelings",
|
|
||||||
questionId: "yourGoal",
|
|
||||||
onClick: handleNext,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 3,
|
|
||||||
value: "ex_has_someone_else",
|
|
||||||
name: "Find out if my ex has someone else",
|
|
||||||
questionId: "yourGoal",
|
|
||||||
onClick: handleNext,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 4,
|
|
||||||
value: "move_on_after_breakup",
|
|
||||||
name: "Move on after breakup",
|
|
||||||
questionId: "yourGoal",
|
|
||||||
onClick: handleNext,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 5,
|
|
||||||
value: "other",
|
|
||||||
name: "Other (please specify)",
|
|
||||||
questionId: "yourGoal",
|
|
||||||
onClick: handleOpen,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
const handleChangeAnswer = (event: React.ChangeEvent<HTMLInputElement>) => {
|
const handleChangeAnswer = (event: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
setAnswer(event.target.value);
|
setAnswer(event.target.value);
|
||||||
|
|||||||
87
src/components/ChatsPath/pages/Categories/index.tsx
Normal file
87
src/components/ChatsPath/pages/Categories/index.tsx
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
import { useCallback, useState } from "react";
|
||||||
|
import styles from "./styles.module.scss";
|
||||||
|
import { ChatsCategories, useApi, useApiCall } from "@/api";
|
||||||
|
import Loader, { LoaderColor } from "@/components/Loader";
|
||||||
|
import ChatsCategory from "../../components/ChatsCategory";
|
||||||
|
import AssistantOfDay from "../../components/AssistantOfDay";
|
||||||
|
import { useNavigate } from "react-router-dom";
|
||||||
|
import routes from "@/routes";
|
||||||
|
import { EAssistantStatus, IAssistant } from "@/api/resources/ChatsCategories";
|
||||||
|
import { useDispatch, useSelector } from "react-redux";
|
||||||
|
import { actions, selectors } from "@/store";
|
||||||
|
|
||||||
|
function Categories() {
|
||||||
|
const dispatch = useDispatch();
|
||||||
|
const api = useApi();
|
||||||
|
const navigate = useNavigate();
|
||||||
|
const token = useSelector(selectors.selectToken);
|
||||||
|
|
||||||
|
const [loadingAssistantId, setIsLoadingAssistantId] = useState<string>("");
|
||||||
|
|
||||||
|
const assetsData = useCallback(async () => {
|
||||||
|
const categories = await api.getChatsCategories(null);
|
||||||
|
return categories;
|
||||||
|
}, [api]);
|
||||||
|
|
||||||
|
const { data, isPending } =
|
||||||
|
useApiCall<ChatsCategories.ResponseGet>(assetsData);
|
||||||
|
|
||||||
|
const createChat = async (assistantId: string) => {
|
||||||
|
const response = await api.createChat({
|
||||||
|
assistantId,
|
||||||
|
token,
|
||||||
|
});
|
||||||
|
return response;
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleAssistantClick = async (assistant: IAssistant) => {
|
||||||
|
if (assistant.status === EAssistantStatus.BUSY) return;
|
||||||
|
setIsLoadingAssistantId(assistant.id);
|
||||||
|
try {
|
||||||
|
const { chatId } = await createChat(assistant.id);
|
||||||
|
dispatch(actions.chat.updateChatId(chatId));
|
||||||
|
dispatch(actions.chat.updateAssistant(assistant));
|
||||||
|
navigate(routes.client.chatsConnecting());
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
} finally {
|
||||||
|
setIsLoadingAssistantId("");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section className={styles.container}>
|
||||||
|
{isPending && (
|
||||||
|
<Loader className={styles.loader} color={LoaderColor.White} />
|
||||||
|
)}
|
||||||
|
{!isPending &&
|
||||||
|
// !error &&
|
||||||
|
data?.categories &&
|
||||||
|
data.categories.map((category, index) => (
|
||||||
|
<div key={index}>
|
||||||
|
<ChatsCategory
|
||||||
|
loadingAssistantId={loadingAssistantId}
|
||||||
|
category={category}
|
||||||
|
handleAssistantClick={handleAssistantClick}
|
||||||
|
/>
|
||||||
|
{index === 1 && data.categories.length > 1 && !!data.day && (
|
||||||
|
<AssistantOfDay
|
||||||
|
isLoading={loadingAssistantId === data.day.id}
|
||||||
|
onAssistantClick={handleAssistantClick}
|
||||||
|
assistant={data.day}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
{data.categories.length <= 1 && !!data.day && (
|
||||||
|
<AssistantOfDay
|
||||||
|
isLoading={loadingAssistantId === data.day.id}
|
||||||
|
onAssistantClick={handleAssistantClick}
|
||||||
|
assistant={data.day}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Categories;
|
||||||
16
src/components/ChatsPath/pages/Categories/styles.module.scss
Normal file
16
src/components/ChatsPath/pages/Categories/styles.module.scss
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
.container {
|
||||||
|
max-width: 560px;
|
||||||
|
width: 100%;
|
||||||
|
padding-left: 0;
|
||||||
|
padding-right: 0;
|
||||||
|
padding-top: 16px;
|
||||||
|
margin: 0 auto;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
}
|
||||||
71
src/components/ChatsPath/pages/Connecting/index.tsx
Normal file
71
src/components/ChatsPath/pages/Connecting/index.tsx
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
import { useNavigate } from "react-router-dom";
|
||||||
|
import styles from "./styles.module.scss";
|
||||||
|
import Title from "@/components/Title";
|
||||||
|
import ProgressBarLine from "@/components/ui/ProgressBarLine";
|
||||||
|
import { useEffect, useState } from "react";
|
||||||
|
import routes from "@/routes";
|
||||||
|
import { useSelector } from "react-redux";
|
||||||
|
import { selectors } from "@/store";
|
||||||
|
|
||||||
|
const points = [
|
||||||
|
"You will not be charged during this step",
|
||||||
|
"Connection to the psychic takes 15-20 sec",
|
||||||
|
"Once connected, you can discuss anything you want",
|
||||||
|
"The psychic is focused on you. Enjoy!",
|
||||||
|
];
|
||||||
|
|
||||||
|
const animationDuration = points.length * 2000;
|
||||||
|
|
||||||
|
function Connecting() {
|
||||||
|
const navigate = useNavigate();
|
||||||
|
const assistant = useSelector(selectors.selectCurrentAssistant);
|
||||||
|
const [progress, setProgress] = useState(0);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setProgress(100);
|
||||||
|
const timeOut = setTimeout(() => {
|
||||||
|
navigate(routes.client.chatsExpert());
|
||||||
|
}, animationDuration + 2000);
|
||||||
|
|
||||||
|
return () => clearTimeout(timeOut);
|
||||||
|
}, [navigate]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section className={styles.container}>
|
||||||
|
<Title variant="h2" className={styles.title}>
|
||||||
|
Connecting you to {assistant?.name} guide so you can get the answer to
|
||||||
|
your question
|
||||||
|
</Title>
|
||||||
|
<div className={styles.avatar}>
|
||||||
|
<img src={assistant?.image} alt={assistant?.name} />
|
||||||
|
</div>
|
||||||
|
<Title variant="h3" className={styles.subtitle}>
|
||||||
|
{assistant?.name} guide
|
||||||
|
</Title>
|
||||||
|
<ProgressBarLine
|
||||||
|
containerClassName={styles["progress-bar"]}
|
||||||
|
lineColor="var(--primary-600)"
|
||||||
|
value={progress}
|
||||||
|
delay={animationDuration}
|
||||||
|
/>
|
||||||
|
<div className={styles.points}>
|
||||||
|
{points.map((point, index) => (
|
||||||
|
<div
|
||||||
|
className={styles.point}
|
||||||
|
key={index}
|
||||||
|
style={{
|
||||||
|
animationDelay: `${
|
||||||
|
((index + 1) * animationDuration) / points.length
|
||||||
|
}ms`,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div className={styles.icon} />
|
||||||
|
{point}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Connecting;
|
||||||
127
src/components/ChatsPath/pages/Connecting/styles.module.scss
Normal file
127
src/components/ChatsPath/pages/Connecting/styles.module.scss
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
.container {
|
||||||
|
max-width: 560px;
|
||||||
|
width: 100%;
|
||||||
|
padding-left: 16px;
|
||||||
|
padding-right: 16px;
|
||||||
|
margin: 0 auto;
|
||||||
|
text-align: left;
|
||||||
|
font-family: Open Sans, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 18px;
|
||||||
|
padding: 0 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.avatar {
|
||||||
|
position: relative;
|
||||||
|
padding: 8px;
|
||||||
|
background-color: rgba(114, 112, 192, 0.8);
|
||||||
|
border-radius: 100%;
|
||||||
|
width: 88px;
|
||||||
|
height: 88px;
|
||||||
|
margin: 0 auto;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
width: 96px;
|
||||||
|
height: 96px;
|
||||||
|
outline: solid 1px var(--primary-600);
|
||||||
|
border-radius: 100%;
|
||||||
|
opacity: 0.3;
|
||||||
|
animation: ripple 2s cubic-bezier(0, 0, 0.98, 0.64) infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > img {
|
||||||
|
width: 72px;
|
||||||
|
height: 72px;
|
||||||
|
border-radius: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.subtitle {
|
||||||
|
color: var(--secondary-200);
|
||||||
|
font-size: 24px;
|
||||||
|
margin-top: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.progress-bar {
|
||||||
|
height: 8px;
|
||||||
|
background-color: rgba(114, 112, 192, 0.25);
|
||||||
|
}
|
||||||
|
|
||||||
|
.points {
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 24px;
|
||||||
|
|
||||||
|
& > .point {
|
||||||
|
background-color: var(--primary-800);
|
||||||
|
padding: 4px;
|
||||||
|
height: 40px;
|
||||||
|
border-radius: 20px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
gap: 10px;
|
||||||
|
align-items: center;
|
||||||
|
font-size: 14px;
|
||||||
|
animation: point-done .5s linear forwards;
|
||||||
|
opacity: 0.7;
|
||||||
|
|
||||||
|
// &.done {
|
||||||
|
// animation: point-done 1s linear forwards;
|
||||||
|
// }
|
||||||
|
|
||||||
|
& > .icon {
|
||||||
|
position: relative;
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
background-color: var(--secondary-700);
|
||||||
|
border-radius: 16px;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
width: 8px;
|
||||||
|
height: 8px;
|
||||||
|
border-radius: 100%;
|
||||||
|
background-color: var(--success);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes point-done {
|
||||||
|
100% {
|
||||||
|
background-color: var(--primary-700);
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes ripple {
|
||||||
|
0% {
|
||||||
|
// scale: 1;
|
||||||
|
|
||||||
|
width: 96px;
|
||||||
|
height: 96px;
|
||||||
|
opacity: 0.3;
|
||||||
|
}
|
||||||
|
80% {
|
||||||
|
opacity: 0.3;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
// scale: 1.4;
|
||||||
|
|
||||||
|
width: 120px;
|
||||||
|
height: 120px;
|
||||||
|
opacity: 0;
|
||||||
|
outline-width: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
45
src/components/ChatsPath/pages/EmailConfirm/index.tsx
Normal file
45
src/components/ChatsPath/pages/EmailConfirm/index.tsx
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
import Title from "@/components/Title";
|
||||||
|
import { images } from "../../data";
|
||||||
|
import styles from "./styles.module.scss";
|
||||||
|
import Button from "../../ui/Button";
|
||||||
|
import { useNavigate } from "react-router-dom";
|
||||||
|
import routes from "@/routes";
|
||||||
|
|
||||||
|
function EmailConfirm() {
|
||||||
|
const navigate = useNavigate();
|
||||||
|
|
||||||
|
const handleNext = () => {
|
||||||
|
navigate(routes.client.chatsThankYou());
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section className={styles.container}>
|
||||||
|
<img
|
||||||
|
className={styles.image}
|
||||||
|
src={images("email-consent.webp")}
|
||||||
|
alt="email consent"
|
||||||
|
/>
|
||||||
|
<Title className={styles.title} variant="h2">
|
||||||
|
Don't miss out on a single perk!
|
||||||
|
</Title>
|
||||||
|
<p className={styles.text}>
|
||||||
|
Get access to <b>relationship tips</b>, astrology insights, tasty
|
||||||
|
recipes, and more. Plus, receive <b>complimentary gifts</b> just for
|
||||||
|
signing up
|
||||||
|
</p>
|
||||||
|
<p className={styles.text}>
|
||||||
|
To get all this, just opt-in to our email updates
|
||||||
|
</p>
|
||||||
|
<div className={styles.footer}>
|
||||||
|
<Button classNameContainer={styles.button} onClick={handleNext}>
|
||||||
|
Confirm
|
||||||
|
</Button>
|
||||||
|
<Button classNameContainer={styles["button-know"]} onClick={handleNext}>
|
||||||
|
I know everything about astrology & relationship
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default EmailConfirm;
|
||||||
@ -0,0 +1,59 @@
|
|||||||
|
.container {
|
||||||
|
max-width: 330px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
text-align: center;
|
||||||
|
margin: 20px auto 10px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.image {
|
||||||
|
width: 140px;
|
||||||
|
height: 140px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
margin-top: 40px;
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 20px;
|
||||||
|
line-height: 145%;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
width: 100%;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text {
|
||||||
|
font-size: 18px;
|
||||||
|
line-height: 145%;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
|
||||||
|
& > b {
|
||||||
|
font-weight: 700px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
position: fixed;
|
||||||
|
bottom: calc(0dvh + 20px);
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
|
||||||
|
& > .button {
|
||||||
|
& > button {
|
||||||
|
width: 330px;
|
||||||
|
font-weight: 600;
|
||||||
|
padding: 10px 50px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .button-know {
|
||||||
|
margin-top: 20px;
|
||||||
|
& > button {
|
||||||
|
background: transparent;
|
||||||
|
text-decoration-line: underline;
|
||||||
|
color: var(--secondary-100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,73 @@
|
|||||||
|
import { useEffect, useState } from "react";
|
||||||
|
import styles from "./styles.module.css";
|
||||||
|
import { sleep } from "@/services/date";
|
||||||
|
|
||||||
|
interface IChatHeaderProps {
|
||||||
|
name: string;
|
||||||
|
avatar: string;
|
||||||
|
classNameContainer?: string;
|
||||||
|
hasBackButton?: boolean;
|
||||||
|
isTimerGoing?: boolean;
|
||||||
|
clickBackButton: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ChatHeader({
|
||||||
|
name,
|
||||||
|
avatar,
|
||||||
|
classNameContainer = "",
|
||||||
|
hasBackButton = true,
|
||||||
|
isTimerGoing = false,
|
||||||
|
clickBackButton,
|
||||||
|
}: IChatHeaderProps) {
|
||||||
|
const [timer, setTimer] = useState(0);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
(async () => {
|
||||||
|
await sleep(1000);
|
||||||
|
if (isTimerGoing) {
|
||||||
|
setTimer(timer + 1);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}, [isTimerGoing, timer]);
|
||||||
|
|
||||||
|
function formatSecondsToHHMMSS(seconds: number) {
|
||||||
|
const hours = Math.floor(seconds / 3600);
|
||||||
|
const minutes = Math.floor((seconds % 3600) / 60);
|
||||||
|
const secs = seconds % 60;
|
||||||
|
|
||||||
|
return [
|
||||||
|
String(hours).padStart(2, "0"),
|
||||||
|
String(minutes).padStart(2, "0"),
|
||||||
|
String(secs).padStart(2, "0"),
|
||||||
|
].join(":");
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={`${styles.container} ${classNameContainer}`}>
|
||||||
|
{hasBackButton && (
|
||||||
|
<div className={styles["back-button"]} onClick={clickBackButton}>
|
||||||
|
<div className={styles["arrow"]} /> Advisors
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<div className={styles["name-wrapper"]}>
|
||||||
|
<img className={styles.avatar} src={avatar} alt={name} />
|
||||||
|
<div className={styles.name}>
|
||||||
|
{name}
|
||||||
|
<span className={styles["online-status"]} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className={styles["info-wrapper"]}>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className={styles.button}
|
||||||
|
onClick={clickBackButton}
|
||||||
|
>
|
||||||
|
End chat
|
||||||
|
</button>
|
||||||
|
<span className={styles.timer}>{formatSecondsToHHMMSS(timer)}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ChatHeader;
|
||||||
@ -0,0 +1,100 @@
|
|||||||
|
.container {
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
background: rgb(255 255 255 / 10%);
|
||||||
|
-webkit-backdrop-filter: blur(10px);
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
padding: 2px 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.avatar {
|
||||||
|
width: 42px;
|
||||||
|
height: 42px;
|
||||||
|
border-radius: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.online-status {
|
||||||
|
display: block;
|
||||||
|
width: 9px;
|
||||||
|
height: 9px;
|
||||||
|
background-color: rgb(6, 183, 6);
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.name {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.back-button {
|
||||||
|
font-weight: 500;
|
||||||
|
color: rgb(0, 128, 255);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.back-button > .arrow {
|
||||||
|
display: flex;
|
||||||
|
width: 14px;
|
||||||
|
height: 20px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.back-button > .arrow::before,
|
||||||
|
.back-button > .arrow::after {
|
||||||
|
content: "";
|
||||||
|
display: block;
|
||||||
|
width: 12px;
|
||||||
|
height: 2px;
|
||||||
|
background-color: rgb(0, 128, 255);
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.back-button > .arrow::before {
|
||||||
|
transform: rotate(-45deg);
|
||||||
|
top: calc(50% - 4px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.back-button > .arrow::after {
|
||||||
|
transform: rotate(45deg);
|
||||||
|
top: calc(50% + 4px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.name-wrapper {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-wrapper {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-end;
|
||||||
|
gap: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-wrapper > .button {
|
||||||
|
background-color: transparent;
|
||||||
|
border: none;
|
||||||
|
padding-right: 0;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 16px;
|
||||||
|
padding-top: 6px;
|
||||||
|
line-height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-wrapper > .timer {
|
||||||
|
font-size: 12px;
|
||||||
|
opacity: .6;
|
||||||
|
padding-bottom: 6px;
|
||||||
|
}
|
||||||
@ -0,0 +1,75 @@
|
|||||||
|
import { ChangeEvent, FormEvent } from "react";
|
||||||
|
import styles from "./styles.module.css";
|
||||||
|
import Loader, { LoaderColor } from "@/components/Loader";
|
||||||
|
|
||||||
|
interface IInputMessageProps {
|
||||||
|
placeholder?: string;
|
||||||
|
classNameContainer?: string;
|
||||||
|
messageText: string;
|
||||||
|
textareaRows: number;
|
||||||
|
disabledButton: boolean;
|
||||||
|
disabledTextArea: boolean;
|
||||||
|
isLoading: boolean;
|
||||||
|
description?: string;
|
||||||
|
handleChangeMessageText: (e: ChangeEvent<HTMLTextAreaElement>) => void;
|
||||||
|
submitForm: (messageText: string) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
function InputMessage({
|
||||||
|
placeholder,
|
||||||
|
messageText,
|
||||||
|
textareaRows,
|
||||||
|
disabledButton,
|
||||||
|
disabledTextArea,
|
||||||
|
isLoading,
|
||||||
|
description,
|
||||||
|
handleChangeMessageText,
|
||||||
|
submitForm,
|
||||||
|
classNameContainer = "",
|
||||||
|
}: IInputMessageProps) {
|
||||||
|
const handleSubmit = (e: FormEvent<HTMLFormElement>) => {
|
||||||
|
e.preventDefault();
|
||||||
|
submitForm(messageText);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<form
|
||||||
|
className={`${styles.container} ${classNameContainer}`}
|
||||||
|
onSubmit={(e) => handleSubmit(e)}
|
||||||
|
>
|
||||||
|
<textarea
|
||||||
|
className={styles.input}
|
||||||
|
disabled={disabledTextArea}
|
||||||
|
value={messageText}
|
||||||
|
onChange={(e) => handleChangeMessageText(e)}
|
||||||
|
rows={textareaRows}
|
||||||
|
placeholder={placeholder || "Type your message"}
|
||||||
|
/>
|
||||||
|
{!isLoading && (
|
||||||
|
<button className={styles.button} disabled={disabledButton}>
|
||||||
|
<div className={styles["arrow"]} />
|
||||||
|
</button>
|
||||||
|
)}
|
||||||
|
{isLoading && <Loader color={LoaderColor.White} />}
|
||||||
|
|
||||||
|
{description && (
|
||||||
|
<div role="button" className={styles["chat-cost"]}>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
>
|
||||||
|
<title>alert</title>
|
||||||
|
<path d="M12-0c-2.373 0-4.693 0.704-6.667 2.022s-3.511 3.193-4.42 5.385c-0.908 2.193-1.146 4.605-0.683 6.933s1.606 4.466 3.284 6.144c1.678 1.678 3.816 2.821 6.144 3.284s4.741 0.225 6.933-0.683c2.193-0.908 4.067-2.446 5.385-4.42s2.022-4.293 2.022-6.667c0-3.183-1.264-6.235-3.515-8.485s-5.303-3.515-8.485-3.515zM12 22c-1.978 0-3.911-0.587-5.556-1.685s-2.926-2.661-3.683-4.488c-0.757-1.827-0.955-3.838-0.569-5.778s1.338-3.722 2.737-5.12c1.399-1.399 3.18-2.351 5.12-2.737s3.95-0.188 5.778 0.569c1.827 0.757 3.389 2.039 4.488 3.683s1.685 3.578 1.685 5.556c0 1.313-0.259 2.614-0.761 3.827s-1.239 2.316-2.168 3.244-2.031 1.665-3.244 2.168c-1.213 0.503-2.514 0.761-3.827 0.761z"></path>
|
||||||
|
<path d="M12 14.070c-0.345 0-0.675-0.137-0.919-0.381s-0.381-0.574-0.381-0.919v-6c0-0.345 0.137-0.675 0.381-0.919s0.574-0.381 0.919-0.381 0.675 0.137 0.919 0.381c0.244 0.244 0.381 0.574 0.381 0.919v6c0 0.345-0.137 0.675-0.381 0.919s-0.574 0.381-0.919 0.381z"></path>
|
||||||
|
<path d="M11.95 18.52c0.828 0 1.5-0.672 1.5-1.5s-0.672-1.5-1.5-1.5c-0.828 0-1.5 0.672-1.5 1.5s0.672 1.5 1.5 1.5z"></path>
|
||||||
|
</svg>
|
||||||
|
<span className={styles.text}>{description}</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</form>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default InputMessage;
|
||||||
@ -0,0 +1,93 @@
|
|||||||
|
.container {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 36px;
|
||||||
|
align-items: center;
|
||||||
|
width: 100%;
|
||||||
|
gap: 8px;
|
||||||
|
padding: 8px 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
height: 36px;
|
||||||
|
width: 36px;
|
||||||
|
min-width: 0;
|
||||||
|
/* aspect-ratio: 1 / 1; */
|
||||||
|
background-color: rgb(0, 110, 255);
|
||||||
|
border: none;
|
||||||
|
border-radius: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:disabled {
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button > .arrow {
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
width: 2px;
|
||||||
|
height: 10px;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button > .arrow::before,
|
||||||
|
.button > .arrow::after {
|
||||||
|
content: "";
|
||||||
|
display: block;
|
||||||
|
width: 6px;
|
||||||
|
height: 2px;
|
||||||
|
background-color: #fff;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button > .arrow::before {
|
||||||
|
transform: rotate(-45deg);
|
||||||
|
left: -4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button > .arrow::after {
|
||||||
|
transform: rotate(45deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.input {
|
||||||
|
border: solid 1px #929292;
|
||||||
|
outline: none;
|
||||||
|
background-color: #232322;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 18px;
|
||||||
|
padding: 4px 14px;
|
||||||
|
border-radius: 16px;
|
||||||
|
height: inherit;
|
||||||
|
min-height: 34px;
|
||||||
|
/* max-height: 176px; */
|
||||||
|
/* width: calc(100% - 34px); */
|
||||||
|
resize: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input:disabled {
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-cost {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding-left: 5px;
|
||||||
|
cursor: pointer;
|
||||||
|
opacity: .7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-cost > svg {
|
||||||
|
width: 12px;
|
||||||
|
height: 12px;
|
||||||
|
fill: #fff;
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-cost > .text {
|
||||||
|
color: #fff;
|
||||||
|
font-size: 10px;
|
||||||
|
line-height: 14px;
|
||||||
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
import styles from "./styles.module.css"
|
||||||
|
|
||||||
|
function LoaderDots() {
|
||||||
|
return (
|
||||||
|
<div className={styles.container} />
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default LoaderDots
|
||||||
@ -0,0 +1,72 @@
|
|||||||
|
.container {
|
||||||
|
position: relative;
|
||||||
|
left: -9999px;
|
||||||
|
width: 10px;
|
||||||
|
height: 10px;
|
||||||
|
border-radius: 5px;
|
||||||
|
background-color: #7f7f7f;
|
||||||
|
color: #7f7f7f;
|
||||||
|
box-shadow: 9999px 0 0 -5px;
|
||||||
|
animation: container 1.5s infinite linear;
|
||||||
|
animation-delay: 0.25s;
|
||||||
|
margin: 2px 24px;
|
||||||
|
}
|
||||||
|
.container::before,
|
||||||
|
.container::after {
|
||||||
|
content: "";
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
width: 10px;
|
||||||
|
height: 10px;
|
||||||
|
border-radius: 5px;
|
||||||
|
background-color: #7f7f7f;
|
||||||
|
color: #7f7f7f;
|
||||||
|
}
|
||||||
|
.container::before {
|
||||||
|
box-shadow: 9984px 0 0 -5px;
|
||||||
|
animation: container-before 1.5s infinite linear;
|
||||||
|
animation-delay: 0s;
|
||||||
|
}
|
||||||
|
.container::after {
|
||||||
|
box-shadow: 10014px 0 0 -5px;
|
||||||
|
animation: container-after 1.5s infinite linear;
|
||||||
|
animation-delay: 0.5s;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes container-before {
|
||||||
|
0% {
|
||||||
|
box-shadow: 9984px 0 0 -5px;
|
||||||
|
}
|
||||||
|
30% {
|
||||||
|
box-shadow: 9984px 0 0 2px;
|
||||||
|
}
|
||||||
|
60%,
|
||||||
|
100% {
|
||||||
|
box-shadow: 9984px 0 0 -5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@keyframes container {
|
||||||
|
0% {
|
||||||
|
box-shadow: 9999px 0 0 -5px;
|
||||||
|
}
|
||||||
|
30% {
|
||||||
|
box-shadow: 9999px 0 0 2px;
|
||||||
|
}
|
||||||
|
60%,
|
||||||
|
100% {
|
||||||
|
box-shadow: 9999px 0 0 -5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@keyframes container-after {
|
||||||
|
0% {
|
||||||
|
box-shadow: 10014px 0 0 -5px;
|
||||||
|
}
|
||||||
|
30% {
|
||||||
|
box-shadow: 10014px 0 0 2px;
|
||||||
|
}
|
||||||
|
60%,
|
||||||
|
100% {
|
||||||
|
box-shadow: 10014px 0 0 -5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,69 @@
|
|||||||
|
import React, { useEffect } from "react";
|
||||||
|
import styles from "./styles.module.css";
|
||||||
|
|
||||||
|
interface IMessageProps {
|
||||||
|
text: string | React.ReactNode;
|
||||||
|
isSelf: boolean;
|
||||||
|
advisorName?: string;
|
||||||
|
avatar?: string;
|
||||||
|
backgroundTextColor?: string;
|
||||||
|
textColor?: string;
|
||||||
|
isVisible?: boolean;
|
||||||
|
messageId?: string;
|
||||||
|
isRead?: boolean;
|
||||||
|
isBlur?: boolean;
|
||||||
|
readMessage?: (messagesId: string[]) => void;
|
||||||
|
onClickBlur?: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line react-refresh/only-export-components
|
||||||
|
function Message({
|
||||||
|
text,
|
||||||
|
avatar,
|
||||||
|
isSelf,
|
||||||
|
advisorName = "Advisor",
|
||||||
|
backgroundTextColor = "#0080ff",
|
||||||
|
textColor = "#fff",
|
||||||
|
isVisible = true,
|
||||||
|
messageId,
|
||||||
|
isRead,
|
||||||
|
isBlur = false,
|
||||||
|
readMessage,
|
||||||
|
onClickBlur,
|
||||||
|
}: IMessageProps) {
|
||||||
|
useEffect(() => {
|
||||||
|
if (!messageId || !readMessage || isRead) return;
|
||||||
|
readMessage([messageId]);
|
||||||
|
}, [isRead, messageId, readMessage]);
|
||||||
|
|
||||||
|
if (!isVisible) return <></>;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className={`${styles.container} ${isSelf && styles.self}`}
|
||||||
|
style={{ flexDirection: isSelf ? "row-reverse" : "row" }}
|
||||||
|
>
|
||||||
|
{!isSelf && avatar?.length && (
|
||||||
|
<img
|
||||||
|
className={styles.avatar}
|
||||||
|
src={avatar}
|
||||||
|
alt={`${advisorName} avatar`}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
<div
|
||||||
|
className={styles.text}
|
||||||
|
style={{ color: textColor, backgroundColor: backgroundTextColor }}
|
||||||
|
>
|
||||||
|
{text}
|
||||||
|
{isBlur && (
|
||||||
|
<div className={styles["blur-element"]}>
|
||||||
|
<span onClick={onClickBlur}>See the answer</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line react-refresh/only-export-components
|
||||||
|
export default React.memo(Message);
|
||||||
@ -0,0 +1,64 @@
|
|||||||
|
.container {
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: flex-end;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.avatar {
|
||||||
|
width: 36px;
|
||||||
|
height: 36px;
|
||||||
|
border-radius: 100%;
|
||||||
|
object-fit: contain;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text {
|
||||||
|
position: relative;
|
||||||
|
width: fit-content;
|
||||||
|
max-width: 70%;
|
||||||
|
padding: 8px;
|
||||||
|
border-radius: 8px;
|
||||||
|
text-align: left;
|
||||||
|
max-width: min(30rem, 100vw - 3.75rem - 44px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.self > .text {
|
||||||
|
padding-left: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blur-element {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: calc(100% - 32px);
|
||||||
|
/* background-color: rgba(255, 255, 255, .1); */
|
||||||
|
/* filter: blur(8px); */
|
||||||
|
/* backdrop-filter: blur(4px);
|
||||||
|
-webkit-backdrop-filter: blur(4px); */
|
||||||
|
background: rgba(201, 201, 201, 0.5); /* Примерный фон */
|
||||||
|
backdrop-filter: blur(5px); /* Основной эффект размытия */
|
||||||
|
-webkit-backdrop-filter: blur(10px); /* Для Safari */
|
||||||
|
|
||||||
|
mask-image: linear-gradient(to top, black 50%, rgba(0, 0, 0, 1) 75%, rgba(0, 0, 0, .8) 95%, transparent);
|
||||||
|
-webkit-mask-image: linear-gradient(to top, black 50%, rgba(0, 0, 0, 1) 75%, rgba(0, 0, 0, .8) 95%, transparent);
|
||||||
|
|
||||||
|
border-radius: 0 0 8px 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blur-element > span {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
font-size: 16px;
|
||||||
|
color: #000000;
|
||||||
|
padding: 8px 24px;
|
||||||
|
background: #ffffffe3;
|
||||||
|
border-radius: 16px;
|
||||||
|
text-wrap: nowrap;
|
||||||
|
width: fit-content;
|
||||||
|
display: block;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
@ -0,0 +1,119 @@
|
|||||||
|
import Button from "@/components/ChatsPath/ui/Button";
|
||||||
|
import styles from "./styles.module.scss";
|
||||||
|
import { CircularProgressbar } from "react-circular-progressbar";
|
||||||
|
import { useEffect, useMemo, useState } from "react";
|
||||||
|
import { sleep } from "@/services/date";
|
||||||
|
import ToggleSwitch from "@/components/ChatsPath/ui/ToggleSwitch";
|
||||||
|
import Loader, { LoaderColor } from "@/components/Loader";
|
||||||
|
import { IPaywallProduct } from "@/api/resources/Paywall";
|
||||||
|
import { getPriceCentsToDollars } from "@/services/price";
|
||||||
|
import { useDispatch, useSelector } from "react-redux";
|
||||||
|
import { actions, selectors } from "@/store";
|
||||||
|
|
||||||
|
interface IOutOfCreditsModalProps {
|
||||||
|
isLoading?: boolean;
|
||||||
|
isError?: boolean;
|
||||||
|
products: IPaywallProduct[];
|
||||||
|
handleClickNotWant: () => void;
|
||||||
|
handleClickButton: () => void;
|
||||||
|
timerLeft?: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const timerSeconds = 30;
|
||||||
|
|
||||||
|
function OutOfCreditsModal({
|
||||||
|
isLoading = false,
|
||||||
|
isError = false,
|
||||||
|
products,
|
||||||
|
handleClickNotWant,
|
||||||
|
handleClickButton,
|
||||||
|
timerLeft,
|
||||||
|
}: IOutOfCreditsModalProps) {
|
||||||
|
const dispatch = useDispatch();
|
||||||
|
const [timerValue, setTimerValue] = useState(timerSeconds);
|
||||||
|
const isAutoRefill = useSelector(selectors.selectIsAutoRefill);
|
||||||
|
|
||||||
|
const currentProduct = useMemo(() => {
|
||||||
|
return products.find((product) => product.key === "credits.80");
|
||||||
|
}, [products]);
|
||||||
|
|
||||||
|
const handleToggle = () => {
|
||||||
|
dispatch(actions.chat.updateIsAutoRefill(!isAutoRefill));
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
(async () => {
|
||||||
|
await sleep(1000);
|
||||||
|
if (timerValue > 0) {
|
||||||
|
setTimerValue(timerValue - 1);
|
||||||
|
} else {
|
||||||
|
timerLeft && timerLeft();
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
|
}, [timerValue]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<h3 className={styles.title}>You`ve run out of credits</h3>
|
||||||
|
<div className={styles["refill-wrapper"]}>
|
||||||
|
<h4>Refill credits in 1 click</h4>
|
||||||
|
<p>
|
||||||
|
{currentProduct?.description} credits for{" "}
|
||||||
|
<span>${getPriceCentsToDollars(currentProduct?.price || 0)}</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div className={styles["progress-container"]}>
|
||||||
|
<CircularProgressbar
|
||||||
|
// counterClockwise={true}
|
||||||
|
className={styles["progress-bar"]}
|
||||||
|
styles={{
|
||||||
|
path: { stroke: "#7ED8F8" },
|
||||||
|
trail: { stroke: "#4F4B88" },
|
||||||
|
text: {
|
||||||
|
fill: "#7ED8F8",
|
||||||
|
fontSize: "30px",
|
||||||
|
fontWeight: "bold",
|
||||||
|
dominantBaseline: "no-change",
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
maxValue={timerSeconds}
|
||||||
|
minValue={0}
|
||||||
|
value={timerValue}
|
||||||
|
text={timerValue.toString()}
|
||||||
|
strokeWidth={8}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<hr className={styles.line} />
|
||||||
|
<div className={styles["auto-refill"]}>
|
||||||
|
<div className={styles["text-container"]}>
|
||||||
|
<h4>Chat without interruption</h4>
|
||||||
|
<p>
|
||||||
|
Activate auto refill and stay focused on gaining insights. You can
|
||||||
|
manage it in the settings
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<ToggleSwitch isOn={isAutoRefill} onToggle={handleToggle} />
|
||||||
|
</div>
|
||||||
|
<div className={styles["button-wrapper"]}>
|
||||||
|
<Button
|
||||||
|
classNameContainer={styles.button}
|
||||||
|
onClick={handleClickButton}
|
||||||
|
disabled={!currentProduct || isLoading}
|
||||||
|
>
|
||||||
|
{isLoading && <Loader color={LoaderColor.White} />}
|
||||||
|
{!isLoading && "Get credits"}
|
||||||
|
</Button>
|
||||||
|
{isError && <span className={styles.error}>Something went wrong</span>}
|
||||||
|
</div>
|
||||||
|
<Button
|
||||||
|
classNameContainer={styles["not-continue"]}
|
||||||
|
onClick={handleClickNotWant}
|
||||||
|
>
|
||||||
|
I don`t want to continue chatting
|
||||||
|
</Button>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default OutOfCreditsModal;
|
||||||
@ -0,0 +1,114 @@
|
|||||||
|
.title {
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 18px;
|
||||||
|
line-height: 135%;
|
||||||
|
color: var(--primary-300);
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.refill-wrapper {
|
||||||
|
width: 100%;
|
||||||
|
padding: 12px;
|
||||||
|
background-color: #232149;
|
||||||
|
margin-top: 16px;
|
||||||
|
border-radius: 8px;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
& > h4 {
|
||||||
|
font-size: 14px;
|
||||||
|
color: var(--primary-300);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > p {
|
||||||
|
margin-top: 8px;
|
||||||
|
font-size: 14px;
|
||||||
|
|
||||||
|
& > span {
|
||||||
|
color: var(--primary-300);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.progress-container {
|
||||||
|
position: relative;
|
||||||
|
width: 100px;
|
||||||
|
margin: 16px auto;
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: "seconds";
|
||||||
|
position: absolute;
|
||||||
|
top: 56px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
font-size: 14px;
|
||||||
|
color: #7ed8f8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.line {
|
||||||
|
margin: 0 0 16px 0;
|
||||||
|
background-color: #312e64;
|
||||||
|
width: 100%;
|
||||||
|
height: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auto-refill {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr auto;
|
||||||
|
gap: 8px;
|
||||||
|
margin: 0 0 16px 0;
|
||||||
|
|
||||||
|
& > .text-container {
|
||||||
|
& > h4 {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > p {
|
||||||
|
font-size: 12px;
|
||||||
|
color: var(--primary-200);
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-wrapper {
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
z-index: 2;
|
||||||
|
margin-top: auto;
|
||||||
|
|
||||||
|
& > .button {
|
||||||
|
margin-top: 0;
|
||||||
|
|
||||||
|
& > button {
|
||||||
|
box-shadow: var(--primary-box-shadow);
|
||||||
|
width: 295px;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 120%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.not-continue {
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
& > button {
|
||||||
|
background: none;
|
||||||
|
font-size: 14px;
|
||||||
|
text-decoration: underline;
|
||||||
|
color: var(--primary-200);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.error {
|
||||||
|
font-size: 14px;
|
||||||
|
color: var(--error);
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
@ -0,0 +1,66 @@
|
|||||||
|
import Button from "@/components/ChatsPath/ui/Button";
|
||||||
|
import styles from "./styles.module.scss";
|
||||||
|
import Loader, { LoaderColor } from "@/components/Loader";
|
||||||
|
import { IPaywallProduct } from "@/api/resources/Paywall";
|
||||||
|
import { useMemo } from "react";
|
||||||
|
import { getPriceCentsToDollars } from "@/services/price";
|
||||||
|
import { useSelector } from "react-redux";
|
||||||
|
import { selectors } from "@/store";
|
||||||
|
|
||||||
|
interface IRefillCreditsModalProps {
|
||||||
|
isLoading?: boolean;
|
||||||
|
isError?: boolean;
|
||||||
|
products: IPaywallProduct[];
|
||||||
|
handleClickButton: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
function RefillCreditsModal({
|
||||||
|
isLoading = false,
|
||||||
|
isError = false,
|
||||||
|
products,
|
||||||
|
handleClickButton,
|
||||||
|
}: IRefillCreditsModalProps) {
|
||||||
|
const assistant = useSelector(selectors.selectCurrentAssistant);
|
||||||
|
const currentProduct = useMemo(() => {
|
||||||
|
return products.find((product) => product.key === "credits.100");
|
||||||
|
}, [products]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<h3 className={styles.title}>Refill credits for the reading</h3>
|
||||||
|
<h4 className={styles.subtitle}>
|
||||||
|
Refill and continue to get insights with {assistant?.name}
|
||||||
|
</h4>
|
||||||
|
<div role="button" className={styles.package}>
|
||||||
|
<div className={styles.discount}>-85% DISCOUNT</div>
|
||||||
|
<div className={styles["description-wrapper"]}>
|
||||||
|
<div className={styles.description}>
|
||||||
|
<p className={styles["package-name"]}>WELCOME PACK</p>
|
||||||
|
<p className={styles["credits-amount"]}>
|
||||||
|
{currentProduct?.description} credits
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className={styles["price-wrapper"]}>
|
||||||
|
<span className={styles["price-old"]}>$19.99</span>
|
||||||
|
<span className={styles.price}>
|
||||||
|
${getPriceCentsToDollars(currentProduct?.price || 0)}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className={styles["button-wrapper"]}>
|
||||||
|
<Button
|
||||||
|
classNameContainer={styles.button}
|
||||||
|
disabled={!currentProduct || isLoading}
|
||||||
|
onClick={handleClickButton}
|
||||||
|
>
|
||||||
|
{isLoading && <Loader color={LoaderColor.White} />}
|
||||||
|
{!isLoading && "Continue"}
|
||||||
|
</Button>
|
||||||
|
{isError && <span className={styles.error}>Something went wrong</span>}
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default RefillCreditsModal;
|
||||||
@ -0,0 +1,146 @@
|
|||||||
|
.title {
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 18px;
|
||||||
|
line-height: 135%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.subtitle {
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 135%;
|
||||||
|
margin-top: 6px;
|
||||||
|
margin-bottom: 36px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: var(--primary-100);
|
||||||
|
}
|
||||||
|
|
||||||
|
.package {
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
border-radius: 15px;
|
||||||
|
box-shadow: 2px 4px 12px rgba(218, 218, 218, 0.3);
|
||||||
|
background-color: var(--white-with-opacity-25);
|
||||||
|
border: 1px solid var(--primary-600);
|
||||||
|
padding: 24px 16px 20px;
|
||||||
|
color: var(--typography-100);
|
||||||
|
transition: background-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
|
||||||
|
max-width: 300px;
|
||||||
|
width: 100%;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
border: 4px solid var(--tertiary);
|
||||||
|
border-radius: 15px;
|
||||||
|
left: -2px;
|
||||||
|
top: -2px;
|
||||||
|
bottom: -2px;
|
||||||
|
right: -2px;
|
||||||
|
transition: border-color 0.2s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .discount {
|
||||||
|
position: absolute;
|
||||||
|
top: -16px;
|
||||||
|
height: 32px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%);
|
||||||
|
min-width: 97px;
|
||||||
|
border-radius: 30px;
|
||||||
|
padding: 6px 12px;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 135%;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-transform: uppercase;
|
||||||
|
background-color: var(--tertiary);
|
||||||
|
color: var(--typography-100);
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .description-wrapper {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: center;
|
||||||
|
width: 100%;
|
||||||
|
margin-right: 8px;
|
||||||
|
|
||||||
|
& > .description {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 130px;
|
||||||
|
margin-right: 8px;
|
||||||
|
|
||||||
|
& > .package-name {
|
||||||
|
text-transform: lowercase;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 700;
|
||||||
|
line-height: 135%;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .credits-amount {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 135%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .price-wrapper {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-end;
|
||||||
|
max-width: 120px;
|
||||||
|
width: 100%;
|
||||||
|
flex-basis: 0;
|
||||||
|
margin-top: auto;
|
||||||
|
|
||||||
|
& > .price-old {
|
||||||
|
text-decoration: line-through;
|
||||||
|
color: var(--typography-300);
|
||||||
|
font-family: Montserrat, sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 20px;
|
||||||
|
margin-right: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .price {
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 135%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-wrapper {
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
z-index: 2;
|
||||||
|
margin-top: auto;
|
||||||
|
|
||||||
|
& > .button {
|
||||||
|
margin-top: 0;
|
||||||
|
|
||||||
|
& > button {
|
||||||
|
box-shadow: var(--primary-box-shadow);
|
||||||
|
width: 295px;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 120%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.error {
|
||||||
|
font-size: 14px;
|
||||||
|
color: var(--error);
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
@ -0,0 +1,48 @@
|
|||||||
|
import styles from "./styles.module.scss";
|
||||||
|
|
||||||
|
interface IRefillProductProps {
|
||||||
|
isActive: boolean;
|
||||||
|
isOneTimeOffer: boolean;
|
||||||
|
credits: number | string;
|
||||||
|
price: number;
|
||||||
|
oldPrice?: number;
|
||||||
|
onClick: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
function RefillProduct({
|
||||||
|
isActive,
|
||||||
|
isOneTimeOffer,
|
||||||
|
credits,
|
||||||
|
price,
|
||||||
|
oldPrice,
|
||||||
|
onClick,
|
||||||
|
}: IRefillProductProps) {
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className={`${styles.container} ${isActive && styles.active} ${
|
||||||
|
isOneTimeOffer && styles["one-time"]
|
||||||
|
}`}
|
||||||
|
onClick={onClick}
|
||||||
|
>
|
||||||
|
{isOneTimeOffer && <div className={styles.label}>ONE-TIME OFFER</div>}
|
||||||
|
<div className={styles.content}>
|
||||||
|
<div className={styles["credits-info"]}>
|
||||||
|
<span className={styles.credits}>{credits} credits</span>
|
||||||
|
{isOneTimeOffer && (
|
||||||
|
<span className={styles["extra-credits"]}>
|
||||||
|
<b>+100</b> extra credits
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<div className={styles.pricing}>
|
||||||
|
<span className={styles["current-price"]}>€{price}</span>
|
||||||
|
{isOneTimeOffer && (
|
||||||
|
<span className={styles["old-price"]}>€{oldPrice}</span>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default RefillProduct;
|
||||||
@ -0,0 +1,78 @@
|
|||||||
|
.container {
|
||||||
|
width: 100%;
|
||||||
|
padding: 16px;
|
||||||
|
background-color: #37345d;
|
||||||
|
border-radius: 12px;
|
||||||
|
outline: 2px solid #4a477d;
|
||||||
|
color: var(--typography-100);
|
||||||
|
position: relative;
|
||||||
|
text-align: center;
|
||||||
|
transition: outline 0.2s ease-in-out, background-color 0.2s ease-in-out;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
outline: 3px solid #9d64e1;
|
||||||
|
background-color: #4e4c76;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.one-time {
|
||||||
|
padding: 20px 20px 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
position: absolute;
|
||||||
|
top: -12px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
background-color: #c87ee0;
|
||||||
|
color: var(--typography-800);
|
||||||
|
padding: 6px 16px;
|
||||||
|
font-size: 10px;
|
||||||
|
font-weight: 600;
|
||||||
|
border-radius: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.credits-info {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
|
|
||||||
|
& > .credits {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .extra-credits {
|
||||||
|
font-size: 12px;
|
||||||
|
color: var(--typography-100);
|
||||||
|
background-color: #ba68d5;
|
||||||
|
padding: 4px 8px;
|
||||||
|
border-radius: 6px;
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.pricing {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-end;
|
||||||
|
|
||||||
|
& > .current-price {
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .old-price {
|
||||||
|
font-size: 16px;
|
||||||
|
color: var(--typography-500);
|
||||||
|
text-decoration: line-through;
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,81 @@
|
|||||||
|
import Button from "@/components/ChatsPath/ui/Button";
|
||||||
|
import styles from "./styles.module.scss";
|
||||||
|
import { useMemo, useState } from "react";
|
||||||
|
import Timer from "@/components/ChatsPath/ui/Timer";
|
||||||
|
import RefillProduct from "../RefillProduct";
|
||||||
|
import Loader, { LoaderColor } from "@/components/Loader";
|
||||||
|
import { IPaywallProduct } from "@/api/resources/Paywall";
|
||||||
|
import { useSelector } from "react-redux";
|
||||||
|
import { selectors } from "@/store";
|
||||||
|
|
||||||
|
interface IOutOfCreditsModalProps {
|
||||||
|
isLoading?: boolean;
|
||||||
|
isError?: boolean;
|
||||||
|
products: IPaywallProduct[];
|
||||||
|
handleClickButton: (productKey: string) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const timerSeconds = 30;
|
||||||
|
|
||||||
|
const productsKeys = ["credits.400", "credits.500", "credits.80"];
|
||||||
|
|
||||||
|
function RefillProductsModal({
|
||||||
|
isLoading = false,
|
||||||
|
isError = false,
|
||||||
|
products,
|
||||||
|
handleClickButton,
|
||||||
|
}: IOutOfCreditsModalProps) {
|
||||||
|
const assistant = useSelector(selectors.selectCurrentAssistant);
|
||||||
|
const [timerValue, setTimerValue] = useState(timerSeconds);
|
||||||
|
const [activeProduct, setActiveProduct] = useState<IPaywallProduct | null>(
|
||||||
|
products.find((product) => product.key === "credits.400") || null
|
||||||
|
);
|
||||||
|
const filteredProducts = useMemo(
|
||||||
|
() =>
|
||||||
|
products.filter((product) => {
|
||||||
|
return productsKeys.includes(product.key);
|
||||||
|
}),
|
||||||
|
[products]
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<h3 className={styles.title}>Refill credits to continue chat</h3>
|
||||||
|
<div className={styles["timer-wrapper"]}>
|
||||||
|
<Timer
|
||||||
|
seconds={timerValue}
|
||||||
|
onChangeSeconds={(seconds: number) => setTimerValue(seconds)}
|
||||||
|
/>
|
||||||
|
<div className={styles["timer-text"]}>
|
||||||
|
<h5>{assistant?.name}</h5>
|
||||||
|
<p>will wait for you!</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className={styles["products-wrapper"]}>
|
||||||
|
{filteredProducts.map((product) => (
|
||||||
|
<RefillProduct
|
||||||
|
isActive={activeProduct?._id === product._id}
|
||||||
|
isOneTimeOffer={false}
|
||||||
|
credits={product.description}
|
||||||
|
price={product.price / 100}
|
||||||
|
onClick={() => setActiveProduct(product)}
|
||||||
|
key={product._id}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
<div className={styles["button-wrapper"]}>
|
||||||
|
<Button
|
||||||
|
classNameContainer={styles.button}
|
||||||
|
onClick={() => handleClickButton(activeProduct?.key || "")}
|
||||||
|
disabled={!activeProduct || isLoading}
|
||||||
|
>
|
||||||
|
{isLoading && <Loader color={LoaderColor.White} />}
|
||||||
|
{!isLoading && "Continue"}
|
||||||
|
</Button>
|
||||||
|
{isError && <span className={styles.error}>Something went wrong</span>}
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default RefillProductsModal;
|
||||||
@ -0,0 +1,64 @@
|
|||||||
|
.title {
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 18px;
|
||||||
|
line-height: 135%;
|
||||||
|
color: var(--primary-300);
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.timer-wrapper {
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 16px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
|
||||||
|
.timer-text {
|
||||||
|
& > h5 {
|
||||||
|
font-size: 14px;
|
||||||
|
color: var(--typography-200);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > p {
|
||||||
|
font-size: 14px;
|
||||||
|
color: var(--typography-200);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.products-wrapper {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 20px;
|
||||||
|
margin: 24px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-wrapper {
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
z-index: 2;
|
||||||
|
margin-top: 8px;
|
||||||
|
|
||||||
|
& > .button {
|
||||||
|
margin-top: 0;
|
||||||
|
|
||||||
|
& > button {
|
||||||
|
box-shadow: var(--primary-box-shadow);
|
||||||
|
width: 295px;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 120%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.error {
|
||||||
|
font-size: 14px;
|
||||||
|
color: var(--error);
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
@ -0,0 +1,303 @@
|
|||||||
|
import Title from "@/components/Title";
|
||||||
|
import styles from "./styles.module.scss";
|
||||||
|
|
||||||
|
function StartInfo() {
|
||||||
|
return (
|
||||||
|
<div className={styles.container}>
|
||||||
|
<Title variant="h3" className={styles.title}>
|
||||||
|
Ready? Start the live chat
|
||||||
|
</Title>
|
||||||
|
<ul className={styles.list}>
|
||||||
|
<li className={styles.item}>
|
||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="25"
|
||||||
|
viewBox="0 0 24 25"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<g clipPath="url(#clip0_1930_9774)">
|
||||||
|
<path
|
||||||
|
d="M8.08771 9.65332H7.10938"
|
||||||
|
stroke="url(#paint0_linear_1930_9774)"
|
||||||
|
strokeMiterlimit="10"
|
||||||
|
></path>
|
||||||
|
<path
|
||||||
|
d="M6.13068 9.65332H5.15234"
|
||||||
|
stroke="url(#paint1_linear_1930_9774)"
|
||||||
|
strokeMiterlimit="10"
|
||||||
|
></path>
|
||||||
|
<path
|
||||||
|
d="M4.17413 9.65332H3.1958"
|
||||||
|
stroke="url(#paint2_linear_1930_9774)"
|
||||||
|
strokeMiterlimit="10"
|
||||||
|
></path>
|
||||||
|
<path
|
||||||
|
d="M16.8922 23V19.5398H19.8272C20.0867 19.5398 20.3355 19.4356 20.519 19.2502C20.7025 19.0648 20.8056 18.8133 20.8056 18.5511V15.0909H22.5176C22.6442 15.0906 22.7686 15.0573 22.8786 14.994C22.9887 14.9308 23.0807 14.8399 23.1457 14.7301C23.2107 14.6204 23.2464 14.4955 23.2495 14.3676C23.2526 14.2397 23.2229 14.1132 23.1633 14.0003L20.7982 9.55763C20.8056 4.71023 17.1912 1.25 12.7343 1.25C11.4416 1.24954 10.1678 1.56376 9.02063 2.16606C7.8735 2.76836 6.8868 3.64103 6.14404 4.71023"
|
||||||
|
stroke="url(#paint3_linear_1930_9774)"
|
||||||
|
strokeMiterlimit="10"
|
||||||
|
></path>
|
||||||
|
<path
|
||||||
|
d="M7.59831 23.0001V18.0495C7.59728 16.8098 7.2103 15.6018 6.49219 14.5967"
|
||||||
|
stroke="url(#paint4_linear_1930_9774)"
|
||||||
|
strokeMiterlimit="10"
|
||||||
|
></path>
|
||||||
|
<path
|
||||||
|
d="M9.55499 4.70996C9.81446 4.70996 10.0633 4.81412 10.2468 4.99953C10.4302 5.18493 10.5333 5.43639 10.5333 5.6986V8.17018L12.9791 9.65314L10.5333 11.1361V13.6077C10.5333 13.8699 10.4302 14.1213 10.2468 14.3068C10.0633 14.4922 9.81446 14.5963 9.55499 14.5963H1.72833C1.46886 14.5963 1.22002 14.4922 1.03655 14.3068C0.853074 14.1213 0.75 13.8699 0.75 13.6077V5.6986C0.75 5.43639 0.853074 5.18493 1.03655 4.99953C1.22002 4.81412 1.46886 4.70996 1.72833 4.70996H9.55499Z"
|
||||||
|
stroke="url(#paint5_linear_1930_9774)"
|
||||||
|
strokeMiterlimit="10"
|
||||||
|
></path>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<linearGradient
|
||||||
|
id="paint0_linear_1930_9774"
|
||||||
|
x1="7.10937"
|
||||||
|
y1="10.1067"
|
||||||
|
x2="8.46823"
|
||||||
|
y2="10.1207"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<stop stopColor="#6A4DBC"></stop>
|
||||||
|
<stop offset="1" stopColor="#F2994A"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="paint1_linear_1930_9774"
|
||||||
|
x1="5.15234"
|
||||||
|
y1="10.1067"
|
||||||
|
x2="6.5112"
|
||||||
|
y2="10.1207"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<stop stopColor="#6A4DBC"></stop>
|
||||||
|
<stop offset="1" stopColor="#F2994A"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="paint2_linear_1930_9774"
|
||||||
|
x1="3.1958"
|
||||||
|
y1="10.1067"
|
||||||
|
x2="4.55465"
|
||||||
|
y2="10.1207"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<stop stopColor="#6A4DBC"></stop>
|
||||||
|
<stop offset="1" stopColor="#F2994A"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="paint3_linear_1930_9774"
|
||||||
|
x1="6.14404"
|
||||||
|
y1="11.112"
|
||||||
|
x2="29.9039"
|
||||||
|
y2="11.3086"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<stop stopColor="#6A4DBC"></stop>
|
||||||
|
<stop offset="1" stopColor="#F2994A"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="paint4_linear_1930_9774"
|
||||||
|
x1="6.49219"
|
||||||
|
y1="18.407"
|
||||||
|
x2="8.0287"
|
||||||
|
y2="18.4091"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<stop stopColor="#6A4DBC"></stop>
|
||||||
|
<stop offset="1" stopColor="#F2994A"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="paint5_linear_1930_9774"
|
||||||
|
x1="0.75"
|
||||||
|
y1="9.1927"
|
||||||
|
x2="17.7346"
|
||||||
|
y2="9.41372"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<stop stopColor="#6A4DBC"></stop>
|
||||||
|
<stop offset="1" stopColor="#F2994A"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clip0_1930_9774">
|
||||||
|
<rect
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
fill="white"
|
||||||
|
transform="translate(0 0.5)"
|
||||||
|
></rect>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
<span className={styles.text}>
|
||||||
|
You can ask the psychic anything on your mind and get an answer.
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
<li className={styles.item}>
|
||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="25"
|
||||||
|
viewBox="0 0 24 25"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M14.9273 14.4941L11.9941 17.4961L10.0386 15.4948"
|
||||||
|
stroke="url(#paint0_linear_1930_9785)"
|
||||||
|
strokeMiterlimit="10"
|
||||||
|
></path>
|
||||||
|
<path
|
||||||
|
d="M16.8829 14.9947H18.3495C19.0512 14.9964 19.745 14.8435 20.3837 14.5464C21.0225 14.2494 21.5913 13.8151 22.0515 13.273C22.5118 12.7309 22.8526 12.0939 23.0508 11.405C23.249 10.7162 23.3001 9.99177 23.2005 9.28095C23.1008 8.57014 22.8529 7.8896 22.4734 7.28558C22.094 6.68156 21.5919 6.1682 21.0014 5.7804C20.4109 5.39259 19.7457 5.13943 19.0511 5.0381C18.3565 4.93677 17.6487 4.98965 16.9758 5.19316C16.3288 4.07364 15.3687 3.17835 14.2196 2.62291C13.0704 2.06747 11.7849 1.8774 10.5291 2.07724C9.27329 2.27708 8.10488 2.85765 7.17475 3.74398C6.24462 4.63031 5.59549 5.78168 5.31121 7.04939C5.09639 7.0116 4.87896 6.99152 4.66101 6.98935C3.62374 6.98935 2.62896 7.41106 1.89551 8.1617C1.16205 8.91235 0.75 9.93044 0.75 10.992C0.75 12.0536 1.16205 13.0717 1.89551 13.8223C2.62896 14.573 3.62374 14.9947 4.66101 14.9947H7.10538"
|
||||||
|
stroke="url(#paint1_linear_1930_9785)"
|
||||||
|
strokeMiterlimit="10"
|
||||||
|
></path>
|
||||||
|
<path
|
||||||
|
d="M7.39355 6.88923C7.71069 6.03604 8.27371 5.30163 9.00797 4.78338C9.74223 4.26512 10.6131 3.9875 11.505 3.9873"
|
||||||
|
stroke="url(#paint2_linear_1930_9785)"
|
||||||
|
strokeMiterlimit="10"
|
||||||
|
></path>
|
||||||
|
<path
|
||||||
|
d="M16.883 10.9919V17.5562C16.8827 18.0059 16.7837 18.4498 16.5933 18.8551C16.4029 19.2604 16.126 19.6167 15.783 19.8978L11.9942 22.9999L8.20544 19.8978C7.86243 19.6167 7.58551 19.2604 7.39512 18.8551C7.20473 18.4498 7.10574 18.0059 7.10547 17.5562V10.9919L11.9942 9.99121L16.883 10.9919Z"
|
||||||
|
stroke="url(#paint3_linear_1930_9785)"
|
||||||
|
strokeMiterlimit="10"
|
||||||
|
></path>
|
||||||
|
<defs>
|
||||||
|
<linearGradient
|
||||||
|
id="paint0_linear_1930_9785"
|
||||||
|
x1="10.0386"
|
||||||
|
y1="15.8553"
|
||||||
|
x2="16.8275"
|
||||||
|
y2="15.9716"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<stop stopColor="#6A4DBC"></stop>
|
||||||
|
<stop offset="1" stopColor="#F2994A"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="paint1_linear_1930_9785"
|
||||||
|
x1="0.75"
|
||||||
|
y1="7.89215"
|
||||||
|
x2="31.9943"
|
||||||
|
y2="8.46125"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<stop stopColor="#6A4DBC"></stop>
|
||||||
|
<stop offset="1" stopColor="#F2994A"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="paint2_linear_1930_9785"
|
||||||
|
x1="7.39355"
|
||||||
|
y1="5.30312"
|
||||||
|
x2="13.1035"
|
||||||
|
y2="5.38822"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<stop stopColor="#6A4DBC"></stop>
|
||||||
|
<stop offset="1" stopColor="#F2994A"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="paint3_linear_1930_9785"
|
||||||
|
x1="7.10547"
|
||||||
|
y1="15.8897"
|
||||||
|
x2="20.6865"
|
||||||
|
y2="15.9971"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<stop stopColor="#6A4DBC"></stop>
|
||||||
|
<stop offset="1" stopColor="#F2994A"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
<span className={styles.text}>
|
||||||
|
The chat is 100% private and confidential.
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
<li className={styles.item}>
|
||||||
|
<svg
|
||||||
|
width="60"
|
||||||
|
height="60"
|
||||||
|
viewBox="0 0 60 60"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M24.9012 25.8547L24.9012 8.48985C24.9012 7.23276 25.4005 6.02716 26.2894 5.13827C27.1783 4.24938 28.3839 3.75 29.641 3.75C30.8981 3.75 32.1037 4.24938 32.9926 5.13827C33.8815 6.02716 34.3809 7.23276 34.3809 8.48985L34.3809 25.8547"
|
||||||
|
stroke="url(#paint0_linear_3539_93393)"
|
||||||
|
strokeWidth="1.5"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
></path>
|
||||||
|
<path
|
||||||
|
d="M34.3794 25.8543L34.3793 12.6346C34.3793 12.0122 34.5019 11.3958 34.7401 10.8208C34.9783 10.2457 35.3275 9.72318 35.7676 9.28305C36.2078 8.84291 36.7303 8.49378 37.3053 8.25558C37.8804 8.01738 38.4968 7.89478 39.1192 7.89478C39.7416 7.89478 40.358 8.01738 40.9331 8.25558C41.5081 8.49378 42.0306 8.84291 42.4708 9.28305C42.9109 9.72318 43.26 10.2457 43.4982 10.8208C43.7364 11.3958 43.859 12.0122 43.859 12.6346L43.859 36.9519C43.859 36.9519 45.3574 28.7315 52.919 28.1339C56.5744 27.8424 55.3618 30.7224 55.3618 30.7224C55.3618 30.7224 52.336 36.468 52.7499 44.8953C53.1638 53.3227 45.3836 56.2494 39.1192 56.2494L20.1715 56.2494C13.9071 56.2494 6.12682 53.3344 6.54076 44.8953C6.95469 36.4563 3.94346 30.7224 3.94346 30.7224C3.94346 30.7224 2.72789 27.8453 6.38335 28.1339C13.9333 28.7169 15.42 36.9519 15.42 36.9519L15.42 12.6346C15.42 11.3775 15.9193 10.1719 16.8082 9.28305C17.6971 8.39415 18.9027 7.89478 20.1598 7.89478C21.4169 7.89478 22.6225 8.39415 23.5114 9.28305C24.4003 10.1719 24.8997 11.3775 24.8997 12.6346L24.8997 25.8543"
|
||||||
|
stroke="url(#paint1_linear_3539_93393)"
|
||||||
|
strokeWidth="1.5"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
></path>
|
||||||
|
<path
|
||||||
|
d="M17.5938 43.2354C17.5938 43.2354 22.9895 49.5931 29.6416 49.5931C36.2937 49.5931 41.6895 43.2354 41.6895 43.2354C41.6895 43.2354 36.3054 36.8777 29.6416 36.8777C22.9778 36.8777 17.5938 43.2354 17.5938 43.2354Z"
|
||||||
|
stroke="url(#paint2_linear_3539_93393)"
|
||||||
|
strokeWidth="1.5"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
></path>
|
||||||
|
<path
|
||||||
|
d="M26.9509 43.8708C26.6004 42.3854 27.5203 40.897 29.0057 40.5465C30.4911 40.1959 31.9795 41.1158 32.3301 42.6012C32.6806 44.0866 31.7607 45.575 30.2753 45.9256C28.7899 46.2762 27.3015 45.3562 26.9509 43.8708Z"
|
||||||
|
stroke="url(#paint3_linear_3539_93393)"
|
||||||
|
strokeWidth="1.5"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
></path>
|
||||||
|
<defs>
|
||||||
|
<linearGradient
|
||||||
|
id="paint0_linear_3539_93393"
|
||||||
|
x1="34.3809"
|
||||||
|
y1="13.7729"
|
||||||
|
x2="21.2129"
|
||||||
|
y2="13.8323"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<stop stopColor="#6A4DBC"></stop>
|
||||||
|
<stop offset="1" stopColor="#F2994A"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="paint1_linear_3539_93393"
|
||||||
|
x1="55.5547"
|
||||||
|
y1="29.8201"
|
||||||
|
x2="-16.3986"
|
||||||
|
y2="30.631"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<stop stopColor="#6A4DBC"></stop>
|
||||||
|
<stop offset="1" stopColor="#F2994A"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="paint2_linear_3539_93393"
|
||||||
|
x1="41.6895"
|
||||||
|
y1="42.6432"
|
||||||
|
x2="8.23151"
|
||||||
|
y2="43.3102"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<stop stopColor="#6A4DBC"></stop>
|
||||||
|
<stop offset="1" stopColor="#F2994A"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="paint3_linear_3539_93393"
|
||||||
|
x1="30.5258"
|
||||||
|
y1="45.8664"
|
||||||
|
x2="28.6838"
|
||||||
|
y2="38.4137"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<stop stopColor="#6A4DBC"></stop>
|
||||||
|
<stop offset="1" stopColor="#F2994A"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
<span className={styles.text}>
|
||||||
|
You can use questions in bubble to start
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default StartInfo;
|
||||||
@ -0,0 +1,45 @@
|
|||||||
|
.container {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
background: rgb(255 255 255 / 10%);
|
||||||
|
border-radius: 20px;
|
||||||
|
padding: 16px;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 340px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 22px;
|
||||||
|
text-align: center;
|
||||||
|
color: var(--typography-100);
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list {
|
||||||
|
& > .item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
|
||||||
|
& > svg {
|
||||||
|
flex-shrink: 0;
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .text {
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 22px;
|
||||||
|
color: var(--primary-100);
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
386
src/components/ChatsPath/pages/ExpertChat/index.tsx
Normal file
386
src/components/ChatsPath/pages/ExpertChat/index.tsx
Normal file
@ -0,0 +1,386 @@
|
|||||||
|
import { useNavigate } from "react-router-dom";
|
||||||
|
import styles from "./styles.module.scss";
|
||||||
|
import { ChangeEvent, useCallback, useEffect, useRef, useState } from "react";
|
||||||
|
import Loader, { LoaderColor } from "@/components/Loader";
|
||||||
|
import ChatHeader from "./components/ChatHeader";
|
||||||
|
import InputMessage from "./components/InputMessage";
|
||||||
|
import routes from "@/routes";
|
||||||
|
import Message from "./components/Message";
|
||||||
|
import LoaderDots from "./components/LoaderDots";
|
||||||
|
import StartInfo from "./components/StartInfo";
|
||||||
|
import RefillCreditsModal from "./components/RefillCreditsModal";
|
||||||
|
import useChatSocket from "@/hooks/chatsSocket/useChatsSocket";
|
||||||
|
import { useDispatch, useSelector } from "react-redux";
|
||||||
|
import { actions, selectors } from "@/store";
|
||||||
|
import BottomModal from "../../components/BottomModal";
|
||||||
|
import OutOfCreditsModal from "./components/OutOfCreditsModal";
|
||||||
|
import RefillProductsModal from "./components/RefillProductsModal";
|
||||||
|
import { Products, useApi, useApiCall } from "@/api";
|
||||||
|
import { usePaywall } from "@/hooks/paywall/usePaywall";
|
||||||
|
import { EPlacementKeys, IPaywallProduct } from "@/api/resources/Paywall";
|
||||||
|
import { useAuth } from "@/auth";
|
||||||
|
import { ResponsePost } from "@/api/resources/SinglePayment";
|
||||||
|
import { createSinglePayment } from "@/services/singlePayment";
|
||||||
|
import Modal from "@/components/Modal";
|
||||||
|
import Title from "@/components/Title";
|
||||||
|
import PaymentForm from "@/components/pages/SinglePaymentPage/PaymentForm";
|
||||||
|
import { getPriceCentsToDollars } from "@/services/price";
|
||||||
|
import { IMessage } from "@/api/resources/ChatMessages";
|
||||||
|
|
||||||
|
const returnUrl = `${window.location.protocol}//${
|
||||||
|
window.location.host
|
||||||
|
}${routes.client.chatsExpert()}`;
|
||||||
|
|
||||||
|
function ExpertChat() {
|
||||||
|
const api = useApi();
|
||||||
|
const dispatch = useDispatch();
|
||||||
|
const navigate = useNavigate();
|
||||||
|
const assistant = useSelector(selectors.selectCurrentAssistant);
|
||||||
|
const chatId = useSelector(selectors.selectCurrentChatId);
|
||||||
|
const userId = useSelector(selectors.selectUserId);
|
||||||
|
const [messageText, setMessageText] = useState("");
|
||||||
|
const [textareaRows, setTextareaRows] = useState(1);
|
||||||
|
// const [isLoadingLatestMessages, setIsLoadingLatestMessages] = useState(false);
|
||||||
|
const messagesEndRef = useRef<HTMLDivElement>(null);
|
||||||
|
const [isShowRefillCreditsModal, setIsShowRefillCreditsModal] =
|
||||||
|
useState(false);
|
||||||
|
const [isShowOutOfCreditsModal, setIsShowOutOfCreditsModal] = useState(false);
|
||||||
|
const [isShowRefillProductsModal, setIsShowRefillProductsModal] =
|
||||||
|
useState(false);
|
||||||
|
|
||||||
|
const {
|
||||||
|
isLoading,
|
||||||
|
isLoadingSelfMessage,
|
||||||
|
isLoadingAdvisorMessage,
|
||||||
|
messages,
|
||||||
|
isAvailableChatting,
|
||||||
|
messagesAfterEnd,
|
||||||
|
initialBalance,
|
||||||
|
sendMessage,
|
||||||
|
readMessage,
|
||||||
|
} = useChatSocket(userId, chatId);
|
||||||
|
|
||||||
|
// Payment
|
||||||
|
const { user: userFromStore } = useAuth();
|
||||||
|
const tokenFromStore = useSelector(selectors.selectToken);
|
||||||
|
const [paymentIntent, setPaymentIntent] = useState<ResponsePost | null>(null);
|
||||||
|
const [isLoadingPayment, setIsLoadingPayment] = useState(false);
|
||||||
|
const [isError, setIsError] = useState(false);
|
||||||
|
const [currentProduct, setCurrentProduct] = useState<IPaywallProduct | null>(
|
||||||
|
null
|
||||||
|
);
|
||||||
|
|
||||||
|
const isPayedFirstPurchase = useSelector(
|
||||||
|
selectors.selectIsPayedFirstPurchase
|
||||||
|
);
|
||||||
|
|
||||||
|
const checkIsPayedFirstPurchase = useCallback(async () => {
|
||||||
|
if (isPayedFirstPurchase) return;
|
||||||
|
const isPayed = await api.checkProductPurchased({
|
||||||
|
token: tokenFromStore,
|
||||||
|
productKey: "credits.100",
|
||||||
|
});
|
||||||
|
if (isPayed && "active" in isPayed && isPayed.active) {
|
||||||
|
dispatch(actions.chat.updateIsPayedFirstPurchase(true));
|
||||||
|
}
|
||||||
|
return isPayed;
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
|
}, [
|
||||||
|
api,
|
||||||
|
dispatch,
|
||||||
|
isPayedFirstPurchase,
|
||||||
|
tokenFromStore,
|
||||||
|
isAvailableChatting,
|
||||||
|
]);
|
||||||
|
|
||||||
|
const { data: isPayedFirstPurchaseResponse } = useApiCall<
|
||||||
|
Products.ResponseGet | undefined
|
||||||
|
>(checkIsPayedFirstPurchase);
|
||||||
|
|
||||||
|
const { products } = usePaywall({
|
||||||
|
placementKey: EPlacementKeys["aura.placement.chat"],
|
||||||
|
});
|
||||||
|
|
||||||
|
const scrollToBottom = () => {
|
||||||
|
setTimeout(() => {
|
||||||
|
messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
|
||||||
|
}, 100);
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!isLoading && !!messages.length) scrollToBottom();
|
||||||
|
}, [messages, isLoading]);
|
||||||
|
|
||||||
|
const handleChangeMessageText = (e: ChangeEvent<HTMLTextAreaElement>) => {
|
||||||
|
const { scrollHeight, clientHeight, value } = e.target;
|
||||||
|
if (
|
||||||
|
scrollHeight > clientHeight &&
|
||||||
|
textareaRows < 5 &&
|
||||||
|
value.length > messageText.length
|
||||||
|
) {
|
||||||
|
setTextareaRows((prev) => prev + 1);
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
scrollHeight === clientHeight &&
|
||||||
|
textareaRows > 1 &&
|
||||||
|
value.length < messageText.length
|
||||||
|
) {
|
||||||
|
setTextareaRows((prev) => prev - 1);
|
||||||
|
}
|
||||||
|
setMessageText(e.target.value);
|
||||||
|
};
|
||||||
|
|
||||||
|
const getIsSelfMessage = (role: string) => role === "user";
|
||||||
|
|
||||||
|
const deleteDataFromMessage = (messageText: string) => {
|
||||||
|
const splittedText = messageText?.split("#");
|
||||||
|
if (splittedText?.length > 2) {
|
||||||
|
return splittedText?.slice(2).join("#");
|
||||||
|
}
|
||||||
|
return messageText;
|
||||||
|
};
|
||||||
|
|
||||||
|
const endChat = () => {
|
||||||
|
navigate(routes.client.chatsCategories());
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleRefillModalClickButton = () => {
|
||||||
|
createPayment("credits.100");
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleOutOfCreditsModalClickButton = () => {
|
||||||
|
createPayment("credits.80");
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleRefillProductsModalClickButton = (productKey: string) => {
|
||||||
|
createPayment(productKey);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleSendMessage = (messageText: string) => {
|
||||||
|
if (!isAvailableChatting) {
|
||||||
|
showModals();
|
||||||
|
}
|
||||||
|
setMessageText("");
|
||||||
|
sendMessage(messageText);
|
||||||
|
};
|
||||||
|
|
||||||
|
const closeModals = useCallback(() => {
|
||||||
|
setIsShowRefillProductsModal(false);
|
||||||
|
setIsShowOutOfCreditsModal(false);
|
||||||
|
setIsShowRefillCreditsModal(false);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const createPayment = useCallback(
|
||||||
|
async (productKey: string) => {
|
||||||
|
try {
|
||||||
|
if (!userFromStore || !productKey.length) return;
|
||||||
|
const currentProduct =
|
||||||
|
products?.find((product) => product.key === productKey) || null;
|
||||||
|
if (!currentProduct) return;
|
||||||
|
setCurrentProduct(currentProduct);
|
||||||
|
setIsLoadingPayment(true);
|
||||||
|
const { _id, key } = currentProduct;
|
||||||
|
const paymentInfo = {
|
||||||
|
productId: _id,
|
||||||
|
key,
|
||||||
|
};
|
||||||
|
const paymentIntent = await createSinglePayment(
|
||||||
|
userFromStore,
|
||||||
|
paymentInfo,
|
||||||
|
tokenFromStore,
|
||||||
|
userFromStore.email,
|
||||||
|
userFromStore.profile.full_name,
|
||||||
|
userFromStore.profile.birthday,
|
||||||
|
returnUrl,
|
||||||
|
api
|
||||||
|
);
|
||||||
|
setPaymentIntent(paymentIntent);
|
||||||
|
if ("payment" in paymentIntent) {
|
||||||
|
if (paymentIntent.payment.status === "paid") return closeModals();
|
||||||
|
return setIsError(true);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
|
||||||
|
setIsError(true);
|
||||||
|
} finally {
|
||||||
|
setIsLoadingPayment(false);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[api, closeModals, products, tokenFromStore, userFromStore]
|
||||||
|
);
|
||||||
|
|
||||||
|
const showModals = useCallback(() => {
|
||||||
|
if (isPayedFirstPurchase) {
|
||||||
|
return setIsShowOutOfCreditsModal(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
isPayedFirstPurchase ||
|
||||||
|
!isPayedFirstPurchaseResponse ||
|
||||||
|
!("active" in isPayedFirstPurchaseResponse) ||
|
||||||
|
!isPayedFirstPurchaseResponse
|
||||||
|
) {
|
||||||
|
return setIsShowOutOfCreditsModal(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return setIsShowRefillCreditsModal(true);
|
||||||
|
}, [isPayedFirstPurchase, isPayedFirstPurchaseResponse]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (isAvailableChatting && !isLoading) {
|
||||||
|
closeModals();
|
||||||
|
}
|
||||||
|
}, [closeModals, isAvailableChatting, isLoading]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (initialBalance !== null && !isLoading && !initialBalance) {
|
||||||
|
showModals();
|
||||||
|
}
|
||||||
|
}, [initialBalance, isLoading, showModals]);
|
||||||
|
|
||||||
|
const isBlurMessage = (message: IMessage) => {
|
||||||
|
return (
|
||||||
|
!!messagesAfterEnd.find((item) => item.id === message.id) &&
|
||||||
|
message.role === "assistant"
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section className={`${styles.page} page`}>
|
||||||
|
{!isLoading &&
|
||||||
|
paymentIntent &&
|
||||||
|
"paymentIntent" in paymentIntent &&
|
||||||
|
!!tokenFromStore.length &&
|
||||||
|
currentProduct && (
|
||||||
|
<>
|
||||||
|
<Modal
|
||||||
|
open={!!paymentIntent}
|
||||||
|
onClose={() => setPaymentIntent(null)}
|
||||||
|
containerClassName={styles.modal}
|
||||||
|
>
|
||||||
|
<Title variant="h1" className={styles["modal-title"]}>
|
||||||
|
{getPriceCentsToDollars(currentProduct.price || 0)}$
|
||||||
|
</Title>
|
||||||
|
<PaymentForm
|
||||||
|
isLoadingPayment={isLoadingPayment}
|
||||||
|
stripePublicKey={paymentIntent.paymentIntent.data.public_key}
|
||||||
|
clientSecret={paymentIntent.paymentIntent.data.client_secret}
|
||||||
|
returnUrl={returnUrl}
|
||||||
|
/>
|
||||||
|
</Modal>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
{isLoading && (
|
||||||
|
<Loader color={LoaderColor.Red} className={styles.loader} />
|
||||||
|
)}
|
||||||
|
{!isLoading && (
|
||||||
|
<ChatHeader
|
||||||
|
name={assistant?.name || ""}
|
||||||
|
avatar={assistant?.image || ""}
|
||||||
|
classNameContainer={styles["header-container"]}
|
||||||
|
clickBackButton={endChat}
|
||||||
|
isTimerGoing={isAvailableChatting}
|
||||||
|
hasBackButton={false}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
{!isLoading && !!messages.length && (
|
||||||
|
<div className={styles["messages-container"]}>
|
||||||
|
{messages.map((message) => (
|
||||||
|
<Message
|
||||||
|
avatar={assistant?.image || ""}
|
||||||
|
text={deleteDataFromMessage(message.text)}
|
||||||
|
isVisible={deleteDataFromMessage(message.text) !== " HI"}
|
||||||
|
advisorName={assistant?.name || ""}
|
||||||
|
backgroundTextColor={
|
||||||
|
getIsSelfMessage(message.role) ? "#0080ff" : "#c9c9c9"
|
||||||
|
}
|
||||||
|
textColor={getIsSelfMessage(message.role) ? "#fff" : "#000"}
|
||||||
|
isSelf={getIsSelfMessage(message.role)}
|
||||||
|
key={message.id}
|
||||||
|
isRead={message.isRead}
|
||||||
|
readMessage={readMessage}
|
||||||
|
messageId={message.id}
|
||||||
|
isBlur={isBlurMessage(message)}
|
||||||
|
onClickBlur={() => showModals()}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
{isLoadingAdvisorMessage && !isLoadingSelfMessage && (
|
||||||
|
<Message
|
||||||
|
avatar={assistant?.image || ""}
|
||||||
|
text={<LoaderDots />}
|
||||||
|
isSelf={false}
|
||||||
|
backgroundTextColor={"#c9c9c9"}
|
||||||
|
textColor={"#000"}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
{/* <div className={styles["loader-container"]}>
|
||||||
|
{isLoadingLatestMessages && <Loader color={LoaderColor.Red} />}
|
||||||
|
</div> */}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{!messages.length && !isLoading && <StartInfo />}
|
||||||
|
|
||||||
|
<div ref={messagesEndRef} />
|
||||||
|
{!isLoading && (
|
||||||
|
<InputMessage
|
||||||
|
placeholder="Text message"
|
||||||
|
messageText={messageText}
|
||||||
|
textareaRows={textareaRows}
|
||||||
|
disabledTextArea={isLoadingAdvisorMessage || isLoadingSelfMessage}
|
||||||
|
disabledButton={!messageText.length}
|
||||||
|
classNameContainer={styles["input-container"]}
|
||||||
|
handleChangeMessageText={handleChangeMessageText}
|
||||||
|
isLoading={isLoadingSelfMessage}
|
||||||
|
submitForm={handleSendMessage}
|
||||||
|
description={`The cost of chat is ${assistant?.price} credits/min`}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
{!isLoading && (
|
||||||
|
<>
|
||||||
|
{isShowRefillCreditsModal && (
|
||||||
|
<BottomModal handleClose={() => setIsShowRefillCreditsModal(false)}>
|
||||||
|
<RefillCreditsModal
|
||||||
|
isError={isError}
|
||||||
|
isLoading={isLoadingPayment}
|
||||||
|
products={products}
|
||||||
|
handleClickButton={handleRefillModalClickButton}
|
||||||
|
/>
|
||||||
|
</BottomModal>
|
||||||
|
)}
|
||||||
|
{isShowOutOfCreditsModal && (
|
||||||
|
<BottomModal handleClose={() => setIsShowOutOfCreditsModal(false)}>
|
||||||
|
<OutOfCreditsModal
|
||||||
|
isError={isError}
|
||||||
|
isLoading={isLoadingPayment}
|
||||||
|
products={products}
|
||||||
|
handleClickButton={handleOutOfCreditsModalClickButton}
|
||||||
|
handleClickNotWant={endChat}
|
||||||
|
timerLeft={() => {
|
||||||
|
if (isLoadingPayment) return;
|
||||||
|
setIsShowOutOfCreditsModal(false);
|
||||||
|
setIsShowRefillProductsModal(true);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</BottomModal>
|
||||||
|
)}
|
||||||
|
{isShowRefillProductsModal && (
|
||||||
|
<BottomModal
|
||||||
|
handleClose={() => setIsShowRefillProductsModal(false)}
|
||||||
|
>
|
||||||
|
<RefillProductsModal
|
||||||
|
isError={isError}
|
||||||
|
isLoading={isLoadingPayment}
|
||||||
|
products={products}
|
||||||
|
handleClickButton={handleRefillProductsModalClickButton}
|
||||||
|
/>
|
||||||
|
</BottomModal>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ExpertChat;
|
||||||
61
src/components/ChatsPath/pages/ExpertChat/styles.module.scss
Normal file
61
src/components/ChatsPath/pages/ExpertChat/styles.module.scss
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
.page {
|
||||||
|
position: relative;
|
||||||
|
height: fit-content;
|
||||||
|
min-height: 100dvh;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-end;
|
||||||
|
background-color: #232322;
|
||||||
|
color: #fff;
|
||||||
|
padding: 64px 6px 86px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal {
|
||||||
|
max-height: calc(100dvh - 32px);
|
||||||
|
height: 100%;
|
||||||
|
top: auto;
|
||||||
|
bottom: 0;
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-container {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
max-width: 560px;
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-container {
|
||||||
|
position: fixed;
|
||||||
|
width: 100%;
|
||||||
|
bottom: 0;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
max-width: 560px;
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
.messages-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 16px;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 560px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-container {
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
}
|
||||||
@ -4,9 +4,21 @@ import { useNavigate } from "react-router-dom";
|
|||||||
import routes from "@/routes";
|
import routes from "@/routes";
|
||||||
import Button from "../../ui/Button";
|
import Button from "../../ui/Button";
|
||||||
import { images } from "../../data";
|
import { images } from "../../data";
|
||||||
|
import { whatEmotionAnswers } from "../../data/whatEmotionAnswers";
|
||||||
|
import { useSelector } from "react-redux";
|
||||||
|
import { selectors } from "@/store";
|
||||||
|
import { yourGoalAnswers } from "../../data/yourGoalAnswers";
|
||||||
|
|
||||||
|
const currentAreaOfImprovement: Record<string, string> = {
|
||||||
|
love_happiness: "Love happiness",
|
||||||
|
default: "Personal growth",
|
||||||
|
};
|
||||||
|
|
||||||
function PreferencesIntro() {
|
function PreferencesIntro() {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
const { whatEmotion, missingInLife, goal, yourGoal } = useSelector(
|
||||||
|
selectors.selectAnswers
|
||||||
|
);
|
||||||
|
|
||||||
const handleNext = () => {
|
const handleNext = () => {
|
||||||
navigate(routes.client.chatsQuizBelieveInSpirituality());
|
navigate(routes.client.chatsQuizBelieveInSpirituality());
|
||||||
@ -43,16 +55,26 @@ function PreferencesIntro() {
|
|||||||
<li className={styles.item}>
|
<li className={styles.item}>
|
||||||
<p className={styles["trait-name"]}>You are</p>
|
<p className={styles["trait-name"]}>You are</p>
|
||||||
<p className={styles["trait-value"]}>
|
<p className={styles["trait-value"]}>
|
||||||
<span>Confused about choices</span>
|
<span>
|
||||||
|
{whatEmotionAnswers.find(
|
||||||
|
(answer) => answer.value === whatEmotion
|
||||||
|
)?.name || "Unknown"}
|
||||||
|
</span>
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li className={styles.item}>
|
<li className={styles.item}>
|
||||||
<p className={styles["trait-name"]}>Goal to achieve</p>
|
<p className={styles["trait-name"]}>Goal to achieve</p>
|
||||||
<p className={styles["trait-value"]}>Get back with ex</p>
|
<p className={styles["trait-value"]}>
|
||||||
|
{yourGoalAnswers[goal].find((answer) => answer.value === yourGoal)
|
||||||
|
?.name || "Unknown"}
|
||||||
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li className={styles.item}>
|
<li className={styles.item}>
|
||||||
<p className={styles["trait-name"]}>Area of improvement</p>
|
<p className={styles["trait-name"]}>Area of improvement</p>
|
||||||
<p className={styles["trait-value"]}>Love happiness</p>
|
<p className={styles["trait-value"]}>
|
||||||
|
{currentAreaOfImprovement[missingInLife] ||
|
||||||
|
currentAreaOfImprovement.default}
|
||||||
|
</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,9 +1,8 @@
|
|||||||
.container {
|
.container {
|
||||||
max-width: 360px;
|
max-width: 360px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding-left: 16px;
|
padding: 16px;
|
||||||
padding-right: 16px;
|
padding-bottom: 96px;
|
||||||
padding-top: 16px;
|
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
@ -50,7 +49,7 @@
|
|||||||
position: fixed;
|
position: fixed;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
bottom: calc(0dvh + 30px);
|
bottom: calc(0dvh + 16px);
|
||||||
& > button {
|
& > button {
|
||||||
height: 50px;
|
height: 50px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import Title from "@/components/Title";
|
import Title from "@/components/Title";
|
||||||
import styles from "./styles.module.scss";
|
import styles from "./styles.module.scss";
|
||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
// import routes from "@/routes";
|
import routes from "@/routes";
|
||||||
import { useSelector } from "react-redux";
|
import { useSelector } from "react-redux";
|
||||||
import { selectors } from "@/store";
|
import { selectors } from "@/store";
|
||||||
import { CircularProgressbar } from "react-circular-progressbar";
|
import { CircularProgressbar } from "react-circular-progressbar";
|
||||||
@ -15,7 +15,7 @@ function Processing() {
|
|||||||
const [loadingProgress, setLoadingProgress] = useState(0);
|
const [loadingProgress, setLoadingProgress] = useState(0);
|
||||||
|
|
||||||
const handleNext = useCallback(() => {
|
const handleNext = useCallback(() => {
|
||||||
// navigate(routes.client.home());
|
navigate(routes.client.chatsCategories());
|
||||||
}, [navigate]);
|
}, [navigate]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@ -9,10 +9,36 @@ import { useSelector } from "react-redux";
|
|||||||
import { selectors } from "@/store";
|
import { selectors } from "@/store";
|
||||||
import { getZodiacSignByDate } from "@/services/zodiac-sign";
|
import { getZodiacSignByDate } from "@/services/zodiac-sign";
|
||||||
|
|
||||||
|
const currentGoal: Record<string, string> = {
|
||||||
|
about_ex: "Find out about my ex",
|
||||||
|
give_advice: "Advice for my Love life",
|
||||||
|
give_guidance: "Guidance on my future",
|
||||||
|
all: "Improve various life areas",
|
||||||
|
default: "Improve various life areas",
|
||||||
|
};
|
||||||
|
|
||||||
|
const currentRelationshipStatus: Record<string, string> = {
|
||||||
|
single: "Single",
|
||||||
|
relationship: "In a relationship",
|
||||||
|
married: "Married",
|
||||||
|
complicated: "Complicated",
|
||||||
|
other: "Unsure/Other",
|
||||||
|
default: "Unsure/Other",
|
||||||
|
};
|
||||||
|
|
||||||
|
const currentDescription: Record<string, string> = {
|
||||||
|
about_ex: "Finding out about your ex",
|
||||||
|
give_advice: "Getting advice for your love life",
|
||||||
|
give_guidance: "Getting guidance on your future",
|
||||||
|
all: "Exploring aspects of your life",
|
||||||
|
default: "Exploring aspects of your life",
|
||||||
|
};
|
||||||
|
|
||||||
function ProfileIntro() {
|
function ProfileIntro() {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const birthdate = useSelector(selectors.selectBirthdate);
|
const birthdate = useSelector(selectors.selectBirthdate);
|
||||||
const zodiac = getZodiacSignByDate(birthdate);
|
const zodiac = getZodiacSignByDate(birthdate);
|
||||||
|
const { goal, relationshipStatus } = useSelector(selectors.selectAnswers);
|
||||||
|
|
||||||
const handleNext = () => {
|
const handleNext = () => {
|
||||||
navigate(routes.client.chatsQuizSatisfiedWithLife());
|
navigate(routes.client.chatsQuizSatisfiedWithLife());
|
||||||
@ -49,24 +75,31 @@ function ProfileIntro() {
|
|||||||
<li className={styles.item}>
|
<li className={styles.item}>
|
||||||
<p className={styles["trait-name"]}>Zodiac sign</p>
|
<p className={styles["trait-name"]}>Zodiac sign</p>
|
||||||
<p className={styles["trait-value"]}>
|
<p className={styles["trait-value"]}>
|
||||||
<span>Capricorn</span>
|
<span>{zodiac}</span>
|
||||||
<ZodiacIconSVG zodiac={zodiac} />
|
<ZodiacIconSVG zodiac={zodiac} />
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li className={styles.item}>
|
<li className={styles.item}>
|
||||||
<p className={styles["trait-name"]}>Your goal</p>
|
<p className={styles["trait-name"]}>Your goal</p>
|
||||||
<p className={styles["trait-value"]}>Improve various life areas</p>
|
<p className={styles["trait-value"]}>
|
||||||
|
{currentGoal[goal] || currentGoal.default}
|
||||||
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li className={styles.item}>
|
<li className={styles.item}>
|
||||||
<p className={styles["trait-name"]}>Relationship status</p>
|
<p className={styles["trait-name"]}>Relationship status</p>
|
||||||
<p className={styles["trait-value"]}>Single</p>
|
<p className={styles["trait-value"]}>
|
||||||
|
{currentRelationshipStatus[relationshipStatus] ||
|
||||||
|
currentRelationshipStatus.default}
|
||||||
|
</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<p className={styles.text}>
|
<p className={styles.text}>
|
||||||
<strong>Exploring aspects of your life</strong> requires detailed
|
<strong>
|
||||||
answers to personal questions, so the next section aims to understand
|
{currentDescription[goal] || currentDescription.default}
|
||||||
your goal better.
|
</strong>{" "}
|
||||||
|
requires detailed answers to personal questions, so the next section
|
||||||
|
aims to understand your goal better.
|
||||||
</p>
|
</p>
|
||||||
<Button classNameContainer={styles.button} onClick={handleNext}>
|
<Button classNameContainer={styles.button} onClick={handleNext}>
|
||||||
Continue
|
Continue
|
||||||
|
|||||||
@ -46,11 +46,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.button {
|
.button {
|
||||||
|
position: sticky;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
position: fixed;
|
margin-top: 16px;
|
||||||
left: 50%;
|
bottom: calc(0dvh + 16px);
|
||||||
transform: translateX(-50%);
|
|
||||||
bottom: calc(0dvh + 30px);
|
|
||||||
& > button {
|
& > button {
|
||||||
height: 50px;
|
height: 50px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
|
|||||||
@ -4,9 +4,20 @@ import { useNavigate } from "react-router-dom";
|
|||||||
import routes from "@/routes";
|
import routes from "@/routes";
|
||||||
import Button from "../../ui/Button";
|
import Button from "../../ui/Button";
|
||||||
import { images } from "../../data";
|
import { images } from "../../data";
|
||||||
|
import { useSelector } from "react-redux";
|
||||||
|
import { selectors } from "@/store";
|
||||||
|
|
||||||
|
const currentGoal: Record<string, string> = {
|
||||||
|
about_ex: "You want to find out about your ex",
|
||||||
|
give_advice: "You want to get advice for your love life",
|
||||||
|
give_guidance: "You want to get guidance on your future",
|
||||||
|
all: "You want to explore all aspects of your journey",
|
||||||
|
default: "You want to explore all aspects of your journey",
|
||||||
|
};
|
||||||
|
|
||||||
function Recognize() {
|
function Recognize() {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
const { goal } = useSelector(selectors.selectAnswers);
|
||||||
|
|
||||||
const handleNext = () => {
|
const handleNext = () => {
|
||||||
navigate(routes.client.chatsQuizYourGoal());
|
navigate(routes.client.chatsQuizYourGoal());
|
||||||
@ -30,7 +41,7 @@ function Recognize() {
|
|||||||
<span className={styles["goal-text"]}>
|
<span className={styles["goal-text"]}>
|
||||||
<span>💖</span>
|
<span>💖</span>
|
||||||
{/* // add goal */}
|
{/* // add goal */}
|
||||||
<span>You want to find out about your ex</span>
|
<span>{currentGoal[goal] || currentGoal.default}</span>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<p className={styles.text}>
|
<p className={styles.text}>
|
||||||
|
|||||||
@ -6,53 +6,19 @@ import Button from "../../ui/Button";
|
|||||||
import AppStoreReviews from "../../components/AppStoreReviews";
|
import AppStoreReviews from "../../components/AppStoreReviews";
|
||||||
import Slider from "react-slick";
|
import Slider from "react-slick";
|
||||||
import { useRef, useState } from "react";
|
import { useRef, useState } from "react";
|
||||||
import { IReview } from "../../data";
|
|
||||||
import Review2 from "../../components/Review2";
|
import Review2 from "../../components/Review2";
|
||||||
|
import { useSelector } from "react-redux";
|
||||||
const reviews: IReview[] = [
|
import { selectors } from "@/store";
|
||||||
{
|
import { reviewsByGoal } from "../../data/reviews";
|
||||||
avatar: "Customer1.webp",
|
|
||||||
name: "Leslie, 30",
|
|
||||||
text: `"These readings have provided insights into my ex and helped me understand what went wrong. That was truly helpful!"`,
|
|
||||||
date: "01/08/2024",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
avatar: "Customer9.webp",
|
|
||||||
name: "Khaly, 24",
|
|
||||||
text: `"It was a fast and direct reading I felt she connected to my situation and the person I asked about. It felt honest and I would certainly be back or recommend to others."`,
|
|
||||||
date: "01/16/2024",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
avatar: "Customer3.webp",
|
|
||||||
name: "Numich, 32",
|
|
||||||
text: `"Guidance gave me confidence in next steps and reduced confusions. Helped me to look both ways with my decisions! Told me a lot that helped me trust my intuition and guts!"`,
|
|
||||||
date: "10/11/2023",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
avatar: "Customer4.webp",
|
|
||||||
name: "Heather Camille, 26",
|
|
||||||
text: `"I’ve been using Aura for a few months now, and have had amazing readings/guidance from a few different advisors."`,
|
|
||||||
date: "10/09/2023",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
avatar: "Customer5.webp",
|
|
||||||
name: "Emersyn, 21",
|
|
||||||
text: `"I’m happy with my experience in Aura. I like that there is important improvements from time to time, which really helps to use Aura."`,
|
|
||||||
date: "06/22/2023",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
avatar: "Customer6.webp",
|
|
||||||
name: "Rylee, 34",
|
|
||||||
text: `"Best reading I\`ve had. Thank you for helping understand what is going on in my life. I stand firmly on my feet, I met my soulmate, my love. I fell very inspired."`,
|
|
||||||
date: "10/14/2023",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
function Reviews() {
|
function Reviews() {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const slider = useRef<Slider>(null);
|
const slider = useRef<Slider>(null);
|
||||||
|
const goal = useSelector(selectors.selectAnswers)?.goal;
|
||||||
const [currentSlide, setCurrentSlide] = useState(0);
|
const [currentSlide, setCurrentSlide] = useState(0);
|
||||||
|
|
||||||
|
const reviews = reviewsByGoal[goal] || reviewsByGoal.about_ex;
|
||||||
|
|
||||||
const sliderSettings = {
|
const sliderSettings = {
|
||||||
dots: false,
|
dots: false,
|
||||||
infinite: false,
|
infinite: false,
|
||||||
@ -120,8 +86,8 @@ function Reviews() {
|
|||||||
</span>
|
</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
<p className={styles.description}>Reviews are from the Aura app</p>
|
||||||
<div className={styles.footer}>
|
<div className={styles.footer}>
|
||||||
<p>Reviews are from the Aura app</p>
|
|
||||||
<Button classNameContainer={styles.button} onClick={handleNext}>
|
<Button classNameContainer={styles.button} onClick={handleNext}>
|
||||||
Continue
|
Continue
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@ -49,20 +49,21 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.footer {
|
.footer {
|
||||||
position: fixed;
|
position: sticky;
|
||||||
left: 0;
|
left: 0;
|
||||||
bottom: calc(0dvh + 30px);
|
bottom: calc(0dvh + 30px);
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
margin-top: 48px;
|
||||||
|
}
|
||||||
|
|
||||||
& > p {
|
.description {
|
||||||
margin-bottom: 24px;
|
margin-top: 16px;
|
||||||
color: var(--typography-200-with-opacity-50);
|
color: var(--typography-200-with-opacity-50);
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
line-height: 1.35;
|
line-height: 1.35;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.carousel-buttons {
|
.carousel-buttons {
|
||||||
|
|||||||
80
src/components/ChatsPath/pages/ThankYou/index.tsx
Normal file
80
src/components/ChatsPath/pages/ThankYou/index.tsx
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
import Title from "@/components/Title";
|
||||||
|
import { images } from "../../data";
|
||||||
|
import styles from "./styles.module.scss";
|
||||||
|
import Button from "../../ui/Button";
|
||||||
|
import { useNavigate } from "react-router-dom";
|
||||||
|
import routes from "@/routes";
|
||||||
|
import { useSelector } from "react-redux";
|
||||||
|
import { selectors } from "@/store";
|
||||||
|
|
||||||
|
function ThankYou() {
|
||||||
|
const navigate = useNavigate();
|
||||||
|
const user = useSelector(selectors.selectUser);
|
||||||
|
const username = user?.profile?.full_name;
|
||||||
|
|
||||||
|
const handleNext = () => {
|
||||||
|
navigate(routes.client.chatsCategories());
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section className={styles.container}>
|
||||||
|
<img
|
||||||
|
className={styles.image}
|
||||||
|
src={images("big_check.webp")}
|
||||||
|
alt="big check"
|
||||||
|
/>
|
||||||
|
<Title className={styles.title} variant="h2">
|
||||||
|
Thank you{username?.length && ", "}
|
||||||
|
{username}!
|
||||||
|
</Title>
|
||||||
|
<Title className={styles.subtitle} variant="h3">
|
||||||
|
Your account has been successfully created.
|
||||||
|
</Title>
|
||||||
|
|
||||||
|
<div className={styles.summary}>
|
||||||
|
<div className={styles["indicator-base"]} />
|
||||||
|
<ul>
|
||||||
|
<div className={styles["marker-wrapper"]}>
|
||||||
|
<span className={styles.marker}>1</span>
|
||||||
|
<li>
|
||||||
|
<p className={styles["trait-name"]}>Quiz completed</p>
|
||||||
|
<p className={styles["trait-value"]}>
|
||||||
|
We've prepared a list of top psychics based on your responses
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
</div>
|
||||||
|
<div className={styles["marker-wrapper"]}>
|
||||||
|
<span className={styles.marker}>2</span>
|
||||||
|
<li>
|
||||||
|
<p className={styles["trait-name"]}>Choose a psychic</p>
|
||||||
|
<p className={styles["trait-value"]}>
|
||||||
|
Select one expert from the list we have matched for you to start
|
||||||
|
a chat
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
</div>
|
||||||
|
<div className={styles["marker-wrapper"]}>
|
||||||
|
<span className={styles.marker}>3</span>
|
||||||
|
<li>
|
||||||
|
<p className={styles["trait-name"]}>
|
||||||
|
Start your <strong>3 free sessions</strong> 🎁
|
||||||
|
</p>
|
||||||
|
<p className={styles["trait-value"]}>
|
||||||
|
Experience your 3 minutes with 3 different psychics for free.
|
||||||
|
Begin your journey!
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
</div>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className={styles.footer}>
|
||||||
|
<Button classNameContainer={styles.button} onClick={handleNext}>
|
||||||
|
Start free session
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ThankYou;
|
||||||
126
src/components/ChatsPath/pages/ThankYou/styles.module.scss
Normal file
126
src/components/ChatsPath/pages/ThankYou/styles.module.scss
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
.container {
|
||||||
|
max-width: 330px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
text-align: center;
|
||||||
|
margin: 20px auto 10px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.image {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
align-self: center;
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
color: var(--typography-100);
|
||||||
|
text-align: center;
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: 700;
|
||||||
|
line-height: 1.3;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.subtitle {
|
||||||
|
margin-top: 8px;
|
||||||
|
color: var(--primary-100);
|
||||||
|
text-align: center;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.35;
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary {
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
& > .indicator-base {
|
||||||
|
position: absolute;
|
||||||
|
width: 32px;
|
||||||
|
height: 118%;
|
||||||
|
margin-left: 6px;
|
||||||
|
margin-right: 24px;
|
||||||
|
margin-top: -10px;
|
||||||
|
padding: 10px 4px;
|
||||||
|
border-radius: 100px;
|
||||||
|
background: linear-gradient(180deg, rgba(69, 104, 220, 0.16), transparent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.marker-wrapper {
|
||||||
|
display: flex;
|
||||||
|
margin-top: 20px;
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:first-child > .marker::after {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .marker {
|
||||||
|
display: grid;
|
||||||
|
justify-items: center;
|
||||||
|
align-items: center;
|
||||||
|
width: 20px;
|
||||||
|
min-width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--typography-100);
|
||||||
|
margin-right: 30px;
|
||||||
|
margin-left: 12px;
|
||||||
|
margin-top: 2px;
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
position: absolute;
|
||||||
|
content: "";
|
||||||
|
opacity: 0.24;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
background-image: var(--gradient-tranquil);
|
||||||
|
border-radius: 50%;
|
||||||
|
z-index: -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& .trait-name {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 700;
|
||||||
|
line-height: 1.35;
|
||||||
|
|
||||||
|
& > strong {
|
||||||
|
background: var(--gradient-tranquil);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& .trait-value {
|
||||||
|
margin-top: 6px;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
line-height: 1.35;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
position: fixed;
|
||||||
|
bottom: calc(0dvh + 20px);
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
|
||||||
|
& > .button {
|
||||||
|
& > button {
|
||||||
|
height: 50px;
|
||||||
|
width: 330px;
|
||||||
|
font-weight: 600;
|
||||||
|
padding: 10px 50px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -4,6 +4,7 @@ export interface IButtonProps {
|
|||||||
children?: React.ReactNode;
|
children?: React.ReactNode;
|
||||||
classNameContainer?: string;
|
classNameContainer?: string;
|
||||||
disabled?: boolean;
|
disabled?: boolean;
|
||||||
|
type?: "button" | "submit" | "reset";
|
||||||
onClick?: () => void;
|
onClick?: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -11,11 +12,12 @@ function Button({
|
|||||||
children = "Get started",
|
children = "Get started",
|
||||||
classNameContainer = "",
|
classNameContainer = "",
|
||||||
disabled = false,
|
disabled = false,
|
||||||
|
type = "button",
|
||||||
onClick,
|
onClick,
|
||||||
}: IButtonProps) {
|
}: IButtonProps) {
|
||||||
return (
|
return (
|
||||||
<div className={`${styles["button-wrapper"]} ${classNameContainer}`}>
|
<div className={`${styles["button-wrapper"]} ${classNameContainer}`}>
|
||||||
<button type="button" disabled={disabled} onClick={onClick}>
|
<button type={type} disabled={disabled} onClick={onClick}>
|
||||||
<span className={styles["button-label"]}>{children}</span>
|
<span className={styles["button-label"]}>{children}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -27,7 +27,8 @@
|
|||||||
transition: all 0.15s ease-in-out 0ms;
|
transition: all 0.15s ease-in-out 0ms;
|
||||||
|
|
||||||
&:disabled {
|
&:disabled {
|
||||||
opacity: 0.5;
|
opacity: 1;
|
||||||
|
filter: brightness(60%);
|
||||||
}
|
}
|
||||||
|
|
||||||
&:active {
|
&:active {
|
||||||
|
|||||||
31
src/components/ChatsPath/ui/Timer/index.tsx
Normal file
31
src/components/ChatsPath/ui/Timer/index.tsx
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import { useEffect } from "react";
|
||||||
|
import styles from "./styles.module.scss";
|
||||||
|
import { sleep } from "@/services/date";
|
||||||
|
|
||||||
|
interface ITimerProps {
|
||||||
|
seconds: number;
|
||||||
|
onChangeSeconds: (seconds: number) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
function Timer({ seconds, onChangeSeconds }: ITimerProps) {
|
||||||
|
useEffect(() => {
|
||||||
|
(async () => {
|
||||||
|
await sleep(1000);
|
||||||
|
if (seconds > 0) {
|
||||||
|
onChangeSeconds(seconds - 1);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}, [onChangeSeconds, seconds]);
|
||||||
|
|
||||||
|
const formatTime = (seconds: number) => {
|
||||||
|
const minutes = Math.floor(seconds / 60);
|
||||||
|
const remainingSeconds = seconds % 60;
|
||||||
|
return `${minutes.toString().padStart(2, "0")} : ${remainingSeconds
|
||||||
|
.toString()
|
||||||
|
.padStart(2, "0")}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
return <div className={styles.container}>{formatTime(seconds)}</div>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Timer;
|
||||||
11
src/components/ChatsPath/ui/Timer/styles.module.scss
Normal file
11
src/components/ChatsPath/ui/Timer/styles.module.scss
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
.container {
|
||||||
|
background-color: #5b4d6d;
|
||||||
|
color: #f4a261;
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 8px 16px;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
text-align: center;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
19
src/components/ChatsPath/ui/ToggleSwitch/index.tsx
Normal file
19
src/components/ChatsPath/ui/ToggleSwitch/index.tsx
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import styles from "./styles.module.scss";
|
||||||
|
|
||||||
|
interface IToggleSwitchProps {
|
||||||
|
isOn: boolean;
|
||||||
|
onToggle: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ToggleSwitch = ({ isOn, onToggle }: IToggleSwitchProps) => {
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className={`${styles["toggle-switch"]} ${isOn ? styles.on : ""}`}
|
||||||
|
onClick={onToggle}
|
||||||
|
>
|
||||||
|
<div className={styles["toggle-handle"]}></div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ToggleSwitch;
|
||||||
28
src/components/ChatsPath/ui/ToggleSwitch/styles.module.scss
Normal file
28
src/components/ChatsPath/ui/ToggleSwitch/styles.module.scss
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
.toggle-switch {
|
||||||
|
width: 50px;
|
||||||
|
height: 26px;
|
||||||
|
background-color: var(--typography-400);
|
||||||
|
border-radius: 25px;
|
||||||
|
cursor: pointer;
|
||||||
|
position: relative;
|
||||||
|
transition: background-color 0.3s;
|
||||||
|
|
||||||
|
&.on {
|
||||||
|
background-color: var(--primary-600);
|
||||||
|
|
||||||
|
& > .toggle-handle {
|
||||||
|
left: 27px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.toggle-handle {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
background-color: #fff;
|
||||||
|
border-radius: 50%;
|
||||||
|
position: absolute;
|
||||||
|
top: 3px;
|
||||||
|
left: 3px;
|
||||||
|
transition: left 0.3s;
|
||||||
|
}
|
||||||
@ -5,7 +5,12 @@ import { useCallback, useEffect, useMemo, useState } from "react";
|
|||||||
import { EPaymentMethod, paymentMethods } from "@/data/paymentMethods";
|
import { EPaymentMethod, paymentMethods } from "@/data/paymentMethods";
|
||||||
import { Elements } from "@stripe/react-stripe-js";
|
import { Elements } from "@stripe/react-stripe-js";
|
||||||
import CheckoutForm from "@/components/PaymentPage/methods/CheckoutForm";
|
import CheckoutForm from "@/components/PaymentPage/methods/CheckoutForm";
|
||||||
import { AvailablePaymentMethods, Stripe, loadStripe } from "@stripe/stripe-js";
|
import {
|
||||||
|
AvailablePaymentMethods,
|
||||||
|
Stripe,
|
||||||
|
StripeElementLocale,
|
||||||
|
loadStripe,
|
||||||
|
} from "@stripe/stripe-js";
|
||||||
import { useSelector } from "react-redux";
|
import { useSelector } from "react-redux";
|
||||||
import { selectors } from "@/store";
|
import { selectors } from "@/store";
|
||||||
import Loader from "@/components/Loader";
|
import Loader from "@/components/Loader";
|
||||||
@ -17,7 +22,7 @@ import ExpressCheckoutStripe from "@/components/PaymentPage/methods/ExpressCheck
|
|||||||
import routes from "@/routes";
|
import routes from "@/routes";
|
||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
import { useTranslations } from "@/hooks/translations";
|
import { useTranslations } from "@/hooks/translations";
|
||||||
import { addCurrency, ELocalesPlacement } from "@/locales";
|
import { addCurrency, ELocalesPlacement, language } from "@/locales";
|
||||||
|
|
||||||
interface IPaymentModalProps {
|
interface IPaymentModalProps {
|
||||||
activeProduct?: IPaywallProduct;
|
activeProduct?: IPaywallProduct;
|
||||||
@ -176,7 +181,13 @@ function PaymentModal({
|
|||||||
<div className={styles["payment-method-container"]}>
|
<div className={styles["payment-method-container"]}>
|
||||||
{stripePromise && clientSecret && (
|
{stripePromise && clientSecret && (
|
||||||
<>
|
<>
|
||||||
<Elements stripe={stripePromise} options={{ clientSecret }}>
|
<Elements
|
||||||
|
stripe={stripePromise}
|
||||||
|
options={{
|
||||||
|
clientSecret,
|
||||||
|
locale: language as StripeElementLocale | undefined,
|
||||||
|
}}
|
||||||
|
>
|
||||||
<ExpressCheckoutStripe
|
<ExpressCheckoutStripe
|
||||||
clientSecret={clientSecret}
|
clientSecret={clientSecret}
|
||||||
returnUrl={returnUrl}
|
returnUrl={returnUrl}
|
||||||
@ -191,7 +202,13 @@ function PaymentModal({
|
|||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
</Elements>
|
</Elements>
|
||||||
<Elements stripe={stripePromise} options={{ clientSecret }}>
|
<Elements
|
||||||
|
stripe={stripePromise}
|
||||||
|
options={{
|
||||||
|
clientSecret,
|
||||||
|
locale: language as StripeElementLocale | undefined,
|
||||||
|
}}
|
||||||
|
>
|
||||||
<CheckoutForm
|
<CheckoutForm
|
||||||
confirmType={paymentType}
|
confirmType={paymentType}
|
||||||
subscriptionReceiptId={paymentIntentId}
|
subscriptionReceiptId={paymentIntentId}
|
||||||
|
|||||||
@ -1,11 +1,14 @@
|
|||||||
import { Elements } from '@stripe/react-stripe-js';
|
import { Elements } from "@stripe/react-stripe-js";
|
||||||
import CheckoutForm, { TConfirmType } from '@/components/PaymentPage/methods/CheckoutForm';
|
import CheckoutForm, {
|
||||||
import Modal from '@/components/Modal';
|
TConfirmType,
|
||||||
import { Stripe } from '@stripe/stripe-js';
|
} from "@/components/PaymentPage/methods/CheckoutForm";
|
||||||
import { Dispatch, SetStateAction } from 'react';
|
import Modal from "@/components/Modal";
|
||||||
import styles from './styles.module.scss';
|
import { Stripe, StripeElementLocale } from "@stripe/stripe-js";
|
||||||
|
import { Dispatch, SetStateAction } from "react";
|
||||||
|
import styles from "./styles.module.scss";
|
||||||
|
|
||||||
import './style.scss';
|
import "./style.scss";
|
||||||
|
import { language } from "@/locales";
|
||||||
|
|
||||||
interface IPaymentCardModalProps {
|
interface IPaymentCardModalProps {
|
||||||
clientSecret?: string;
|
clientSecret?: string;
|
||||||
@ -29,8 +32,19 @@ export default function PaymentCardModal({
|
|||||||
removeNoScroll,
|
removeNoScroll,
|
||||||
}: IPaymentCardModalProps) {
|
}: IPaymentCardModalProps) {
|
||||||
return (
|
return (
|
||||||
<Modal open={isOpen} onClose={() => setIsOpen(false)} removeNoScroll={removeNoScroll} containerClassName={styles["modal-container"]}>
|
<Modal
|
||||||
<Elements stripe={stripePromise} options={{clientSecret}}>
|
open={isOpen}
|
||||||
|
onClose={() => setIsOpen(false)}
|
||||||
|
removeNoScroll={removeNoScroll}
|
||||||
|
containerClassName={styles["modal-container"]}
|
||||||
|
>
|
||||||
|
<Elements
|
||||||
|
stripe={stripePromise}
|
||||||
|
options={{
|
||||||
|
clientSecret,
|
||||||
|
locale: language as StripeElementLocale | undefined,
|
||||||
|
}}
|
||||||
|
>
|
||||||
<CheckoutForm
|
<CheckoutForm
|
||||||
confirmType={paymentType}
|
confirmType={paymentType}
|
||||||
subscriptionReceiptId={paymentIntentId}
|
subscriptionReceiptId={paymentIntentId}
|
||||||
@ -38,5 +52,5 @@ export default function PaymentCardModal({
|
|||||||
/>
|
/>
|
||||||
</Elements>
|
</Elements>
|
||||||
</Modal>
|
</Modal>
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,7 +14,7 @@ import {
|
|||||||
useRef,
|
useRef,
|
||||||
useState,
|
useState,
|
||||||
} from "react";
|
} from "react";
|
||||||
import { loadStripe, Stripe } from "@stripe/stripe-js";
|
import { loadStripe, Stripe, StripeElementLocale } from "@stripe/stripe-js";
|
||||||
import { usePaywall } from "@/hooks/paywall/usePaywall";
|
import { usePaywall } from "@/hooks/paywall/usePaywall";
|
||||||
import { useMakePayment } from "@/hooks/payment/useMakePayment";
|
import { useMakePayment } from "@/hooks/payment/useMakePayment";
|
||||||
import { getFormattedPrice } from "@/utils/price.utils";
|
import { getFormattedPrice } from "@/utils/price.utils";
|
||||||
@ -26,7 +26,7 @@ import SecurityPayments from "@/components/pages/TrialPayment/components/Securit
|
|||||||
import PaymentCardModal from "@/components/PaymentModalNew/PaymentCardModal";
|
import PaymentCardModal from "@/components/PaymentModalNew/PaymentCardModal";
|
||||||
import CreditCardIcon from "@/components/PaymentModalNew/PaymentCardModal/CreditCardIcon";
|
import CreditCardIcon from "@/components/PaymentModalNew/PaymentCardModal/CreditCardIcon";
|
||||||
import { useTranslations } from "@/hooks/translations";
|
import { useTranslations } from "@/hooks/translations";
|
||||||
import { addCurrency, ELocalesPlacement } from "@/locales";
|
import { addCurrency, ELocalesPlacement, language } from "@/locales";
|
||||||
import { selectors } from "@/store";
|
import { selectors } from "@/store";
|
||||||
import { useSelector } from "react-redux";
|
import { useSelector } from "react-redux";
|
||||||
|
|
||||||
@ -145,7 +145,7 @@ export default function PaymentModalNew({
|
|||||||
"/payment.total_due",
|
"/payment.total_due",
|
||||||
{
|
{
|
||||||
trialPrice: addCurrency(
|
trialPrice: addCurrency(
|
||||||
getFormattedPrice(activeProduct.trialPrice),
|
getFormattedPrice(activeProduct.trialPrice || 0),
|
||||||
currency
|
currency
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
@ -164,7 +164,13 @@ export default function PaymentModalNew({
|
|||||||
<div>Credit / Debit Card</div>
|
<div>Credit / Debit Card</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<Elements stripe={stripePromise} options={{ clientSecret }}>
|
<Elements
|
||||||
|
stripe={stripePromise}
|
||||||
|
options={{
|
||||||
|
clientSecret,
|
||||||
|
locale: language as StripeElementLocale | undefined,
|
||||||
|
}}
|
||||||
|
>
|
||||||
<ExpressCheckoutStripe
|
<ExpressCheckoutStripe
|
||||||
clientSecret={clientSecret!}
|
clientSecret={clientSecret!}
|
||||||
returnUrl={returnUrl}
|
returnUrl={returnUrl}
|
||||||
|
|||||||
@ -8,9 +8,22 @@ const isValidEmail = (email: string) => {
|
|||||||
return re.test(String(email).toLowerCase().trim());
|
return re.test(String(email).toLowerCase().trim());
|
||||||
};
|
};
|
||||||
|
|
||||||
function EmailInput(props: FormField<string>): JSX.Element {
|
interface IEmailInputProps {
|
||||||
const { name, value, placeholder, inputClassName, onValid, onInvalid } =
|
inputContainerClassName?: string;
|
||||||
props;
|
placeholderClassName?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
function EmailInput(props: FormField<string> & IEmailInputProps): JSX.Element {
|
||||||
|
const {
|
||||||
|
name,
|
||||||
|
value,
|
||||||
|
placeholder,
|
||||||
|
inputClassName,
|
||||||
|
inputContainerClassName = "",
|
||||||
|
placeholderClassName = "",
|
||||||
|
onValid,
|
||||||
|
onInvalid,
|
||||||
|
} = props;
|
||||||
const [email, setEmail] = useState(value);
|
const [email, setEmail] = useState(value);
|
||||||
|
|
||||||
const handleChangeEmail = (event: React.ChangeEvent<HTMLInputElement>) => {
|
const handleChangeEmail = (event: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
@ -32,7 +45,7 @@ function EmailInput(props: FormField<string>): JSX.Element {
|
|||||||
}, [email, onInvalid, onValid]);
|
}, [email, onInvalid, onValid]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles["input-container"]}>
|
<div className={`${styles["input-container"]} ${inputContainerClassName}`}>
|
||||||
<input
|
<input
|
||||||
className={inputClassName}
|
className={inputClassName}
|
||||||
type="email"
|
type="email"
|
||||||
@ -42,7 +55,11 @@ function EmailInput(props: FormField<string>): JSX.Element {
|
|||||||
onChange={handleChangeEmail}
|
onChange={handleChangeEmail}
|
||||||
placeholder=" "
|
placeholder=" "
|
||||||
/>
|
/>
|
||||||
<span className={styles["input__placeholder"]}>{placeholder}</span>
|
<span
|
||||||
|
className={`${styles["input__placeholder"]} ${placeholderClassName}`}
|
||||||
|
>
|
||||||
|
{placeholder}
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -35,8 +35,8 @@ function PaymentTable({
|
|||||||
|
|
||||||
const getPrice = useCallback(
|
const getPrice = useCallback(
|
||||||
(product: IPaywallProduct) => {
|
(product: IPaywallProduct) => {
|
||||||
if (product.trialPrice % 100 === 0) {
|
if ((product.trialPrice || 0) % 100 === 0) {
|
||||||
return addCurrency(product.trialPrice / 100, currency);
|
return addCurrency((product.trialPrice || 0) / 100, currency);
|
||||||
}
|
}
|
||||||
return addCurrency(
|
return addCurrency(
|
||||||
((product.trialPrice || 0) / 100).toFixed(2),
|
((product.trialPrice || 0) / 100).toFixed(2),
|
||||||
|
|||||||
@ -55,7 +55,7 @@ function MarketingTrialPayment() {
|
|||||||
<div className={styles["total-today"]}>
|
<div className={styles["total-today"]}>
|
||||||
<p className={styles.description}>Total today:</p>
|
<p className={styles.description}>Total today:</p>
|
||||||
<p className={styles.value}>
|
<p className={styles.value}>
|
||||||
${(products[0]?.trialPrice / 100).toFixed(2) || 0}
|
${((products[0]?.trialPrice || 0) / 100).toFixed(2) || 0}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.line} />
|
<div className={styles.line} />
|
||||||
@ -81,7 +81,7 @@ function MarketingTrialPayment() {
|
|||||||
<p className={styles["text-description"]}>
|
<p className={styles["text-description"]}>
|
||||||
You will be charged only{" "}
|
You will be charged only{" "}
|
||||||
<b>
|
<b>
|
||||||
${(products[0]?.trialPrice / 100).toFixed(2) || 0} for your{" "}
|
${((products[0]?.trialPrice || 0) / 100).toFixed(2) || 0} for your{" "}
|
||||||
{activeProduct?.trialDuration}-day trial.
|
{activeProduct?.trialDuration}-day trial.
|
||||||
</b>{" "}
|
</b>{" "}
|
||||||
Subscription <b>renews automatically</b> until cancelled. You{" "}
|
Subscription <b>renews automatically</b> until cancelled. You{" "}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user