This commit is contained in:
Daniil Chemerkin 2024-11-20 13:21:04 +00:00
parent 65b36707a1
commit f1a5b30650
124 changed files with 8105 additions and 1905 deletions

View File

@ -60,7 +60,7 @@
max-width: 560px;
padding: 0 32px;
}
.splash-screen img {
/* .splash-screen img {
width: 100%;
animation-name: loading;
animation-duration: 3s;
@ -75,6 +75,103 @@
transform: scale(1);
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>
</head>
@ -220,7 +317,12 @@
<!-- End Google Tag Manager (noscript) -->
<div id="root">
<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>
<script type="module" src="/src/main.ts"></script>

141
package-lock.json generated
View File

@ -37,6 +37,7 @@
"react-slick": "^0.30.2",
"sass": "^1.77.6",
"slick-carousel": "^1.8.1",
"socket.io-client": "^4.8.1",
"unique-names-generator": "^4.7.1",
"yandex-metrica-ab-react": "^1.6.1"
},
@ -1509,6 +1510,11 @@
"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": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/@stripe/react-stripe-js/-/react-stripe-js-2.3.1.tgz",
@ -2547,7 +2553,6 @@
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"devOptional": true,
"dependencies": {
"ms": "2.1.2"
},
@ -2723,6 +2728,26 @@
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"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": {
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz",
@ -4036,8 +4061,7 @@
"node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"devOptional": true
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"node_modules/nan": {
"version": "2.20.0",
@ -4950,6 +4974,32 @@
"dev": true,
"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": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
@ -5380,6 +5430,34 @@
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"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": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
@ -6332,6 +6410,11 @@
"integrity": "sha512-FtzjZTJTLFN9A0mcJk7dXgYHFlGVPXW/EJooSVbe2dHU5hAi5rFk0ODimB7pHeHoDIUin5zE1NDtU2eY6olwlA==",
"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": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/@stripe/react-stripe-js/-/react-stripe-js-2.3.1.tgz",
@ -7012,7 +7095,6 @@
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"devOptional": true,
"requires": {
"ms": "2.1.2"
}
@ -7144,6 +7226,23 @@
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"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": {
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz",
@ -8126,8 +8225,7 @@
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"devOptional": true
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"nan": {
"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": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
@ -9028,6 +9146,17 @@
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"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": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",

View File

@ -44,6 +44,7 @@
"react-slick": "^0.30.2",
"sass": "^1.77.6",
"slick-carousel": "^1.8.1",
"socket.io-client": "^4.8.1",
"unique-names-generator": "^4.7.1",
"yandex-metrica-ab-react": "^1.6.1"
},

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1014 B

BIN
public/chats/big_check.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

@ -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": {
"title": "Find your happiness with highly-personalized predictions.",
"point1": "rated by real users",
"point2": "93.4% Accuracy",
"point3": "20m users choice",
"point4": "4.8 satisfaction sco",
"text": "Understand your self and improve relationships with astrology"
"title": "Finden Sie Ihr Glück mit hochgradig personalisierten Vorhersagen.",
"point1": "bewertet von echten Nutzern",
"point2": "93,4% Genauigkeit",
"point3": "20 Millionen Benutzer bevorzugen es",
"point4": "4,8 Zufriedenheitswert",
"text": "Verstehen Sie sich selbst und verbessern Sie Beziehungen durch Astrologie"
},
"/gender": {
"title": "Whats your gender?",
"description": "In Palmistry, everyone is a blend of masculine and feminine, so it helps to know yours."
"title": "Was ist Ihr Geschlecht?",
"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": {
"title": "Whats your date of birth?",
"text": "Your birth date reveals your core personality traits, needs and desires."
"title": "Was ist Ihr Geburtsdatum?",
"text": "Ihr Geburtsdatum enthüllt Ihre grundlegenden Persönlichkeitsmerkmale, Bedürfnisse und Wünsche."
},
"/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": {
"title": "What aspects of your life do you wish to gain insight into through palmistry?",
"answer1": "Love & Relationships",
"answer2": "Health & Vitality",
"answer3": "Career & Destiny"
"title": "In welche Lebensbereiche möchten Sie durch Handlesen Einblicke gewinnen?",
"answer1": "Liebe & Beziehungen",
"answer2": "Gesundheit & Vitalität",
"answer3": "Karriere & Schicksal"
},
"/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",
"answer2": "In a relationship"
"answer2": "In einer Beziehung"
},
"/element-resonates": {
"title": "Which element resonates with you most?",
"answer1": "Water",
"answer2": "Fire",
"answer3": "Air",
"answer4": "Earth"
"title": "Welches Element spricht Sie am meisten an?",
"answer1": "Wasser",
"answer2": "Feuer",
"answer3": "Luft",
"answer4": "Erde"
},
"/favorite-color": {
"title": "Which color do you like the most?",
"answer1": "Blue",
"answer2": "Green",
"title": "Welche Farbe mögen Sie am liebsten?",
"answer1": "Blau",
"answer2": "Grün",
"answer3": "Orange",
"answer4": "Violet",
"answer5": "Red",
"answer6": "Yellow"
"answer4": "Violett",
"answer5": "Rot",
"answer6": "Gelb"
},
"/head-or-heart": {
"title": "Do you make decisions with your head or your heart?",
"answer1": "Heart",
"answer2": "Head",
"answer3": "Both"
"title": "Treffen Sie Entscheidungen mit Ihrem Kopf oder Ihrem Herzen?",
"answer1": "Herz",
"answer2": "Kopf",
"answer3": "Beides"
},
"/relate-following": {
"title": "Do you relate to the following:",
"question1": "I find solace and comfort in spending time alone.",
"question2": "I value and enjoy my own company.",
"question3": "I prefer socializing in groups rather than spending time alone.",
"question4": "Loneliness is something I actively try to avoid.",
"question5": "I enjoy activities that I can do independently.",
"strongly_agree": "Strongly Agree",
"strongly_disagree": "Strongly Disagree"
"title": "Können Sie sich mit Folgendem identifizieren:",
"question1": "Ich finde in der Einsamkeit Trost und Geborgenheit.",
"question2": "Ich schätze und genieße meine eigene Gesellschaft.",
"question3": "Ich ziehe es vor, in Gruppen zu sozialisieren, anstatt Zeit allein zu verbringen.",
"question4": "Einsamkeit ist etwas, das ich aktiv zu vermeiden versuche.",
"question5": "Ich genieße Aktivitäten, die ich unabhängig durchführen kann.",
"strongly_agree": "Stimme voll zu",
"strongly_disagree": "Stimme überhaupt nicht zu"
},
"/let-scan": {
"title": "Let`s scan your palms",
"text": "Follow the on-screen instructions, so we can analyze your palm lines and reveal your future, and the secrets of your destiny!"
"title": "Lassen Sie uns Ihre Handflächen scannen",
"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": {
"title": "Take your palm picture as instructed",
"button": "Take a picture now"
"title": "Machen Sie Ihr Handflächenfoto gemäß den Anweisungen",
"button": "Jetzt ein Foto machen"
},
"/email": {
"title": "Enter your email to get your advanced Palmistry reading with AURA",
"not_share": "We dont share any personal information.",
"title": "Geben Sie Ihre E-Mail-Adresse ein, um Ihre fortgeschrittene Handlesung mit AURA zu erhalten",
"not_share": "Wir geben keine persönlichen Informationen weiter.",
"placeholder_email": "Ihre E-Mail",
"placeholder_name": "Ihr Name"
},
"went_wrong": "Something went wrong.",
"app_number_one": {
"text": "The <color> app trusted by over 25 million people.",
"color": "#1 Astrology"
"text": "Die <color> App, der über 25 Millionen Menschen vertrauen.",
"color": "#1 Astrologie"
},
"/trial-payment": {
"palm_is_ready": {
"title": "Your Palm Reading <color>",
"title_color": "Is Ready",
"description": "“Ive just received your palm scan results. Lets discuss!”",
"text1": "<color> 6 years in palmistry readings and spiritual guidance.",
"title": "Ihre Handlesung <color>",
"title_color": "ist bereit",
"description": "„Ich habe gerade Ihre Ergebnisse des Handscans erhalten. Lassen Sie uns darüber sprechen!“",
"text1": "<color> 6 Jahre Erfahrung in Handlesungen und spiritueller Beratung.",
"text1_color": "Akho",
"text2": "Choose from 80+ palm readers and astrologers."
"text2": "Wählen Sie aus über 80 Handlesern und Astrologen."
},
"joined_today": {
"text1": "Unlimited chats with a palm reader",
"text2": "<count> people joined today"
"text1": "Unbegrenzte Chats mit einem Handleser",
"text2": "<count> Personen haben sich heute angeschlossen"
},
"get_personal_prediction": "Get personal prediction",
"get_personal_prediction": "Persönliche Vorhersage erhalten",
"how_work": {
"title": "How does AURA work?",
"point1_title": "Send us your palm scan",
"point1_text": "We analyze your palm lines to get hints about your future",
"point2_title": "Your palm reading is generated",
"point2_text": "One of our professional palm readers puts together a report filled with hints about your future",
"point3_title": "Start your trial to receive your prediction",
"point3_text": "Once youre a AURA member, well send over your prediction report so you can begin living a better life.",
"point4_title": "Talk with a palm reading specialist anytime",
"point4_text": "Get ongoing support by discussing your readings, personal horoscopes, and compatibilities with our expert team."
"title": "Wie funktioniert AURA?",
"point1_title": "Senden Sie uns Ihren Handscan",
"point1_text": "Wir analysieren Ihre Handlinien, um Hinweise auf Ihre Zukunft zu erhalten",
"point2_title": "Ihre Handlesung wird erstellt",
"point2_text": "Einer unserer professionellen Handleser erstellt einen Bericht voller Hinweise auf Ihre Zukunft",
"point3_title": "Starten Sie Ihre Probezeit, um Ihre Vorhersage zu erhalten",
"point3_text": "Sobald Sie AURA-Mitglied sind, senden wir Ihnen Ihren Vorhersagebericht, damit Sie ein besseres Leben beginnen können.",
"point4_title": "Sprechen Sie jederzeit mit einem Handlese-Spezialisten",
"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": {
"title": "100% Money-back Guarantee",
"text": "If you dont notice any progress after using the app for at least a week, we are ready to make a complete refund within 14 days."
"title": "100% Geld-zurück-Garantie",
"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": {
"title": "Whats included?",
"point1": "<bold> palm readings",
"point1_bold": "Unlimited",
"point2": "<bold> with professional astrologers",
"point2_bold": "1:1 live chats",
"point3": "<bold> readings",
"point3_bold": "Daily compatibility",
"point4": "Cosmic relationship tips",
"point5": "Daily horoscopes"
"title": "Was ist enthalten?",
"point1": "<bold> Handlesungen",
"point1_bold": "Unbegrenzt",
"point2": "<bold> mit professionellen Astrologen",
"point2_bold": "1:1 Live-Chats",
"point3": "<bold> Lesungen",
"point3_bold": "Tägliche Kompatibilität",
"point4": "Kosmische Beziehungstipps",
"point5": "Tägliche Horoskope"
},
"palms_say_about": {
"title": "What do your palms say about you?",
"point1": "<color> shows your attitude to love and the quality of love",
"point1_color": "Love line",
"point2": "A long thumb indicates good fortune",
"point3": "<color> reflects your in telligence and mentality",
"point3_color": "Head line",
"point4": "A long index finger indicates a natural leader",
"point5": "<color> defines the quality of your life and what you will achieve",
"point5_color": "Life line",
"point6": "A short middle finger reveals a free spirit",
"point7": "<color> represents your material achievement and career goals",
"point7_color": "Fate line",
"point8": "A long ring finger reveals that a person tends to take risks",
"point9": "A short little finger indicates the person's lack of self-confidence"
"title": "Was sagen Ihre Handflächen über Sie aus?",
"point1": "<color> zeigt Ihre Einstellung zur Liebe und die Qualität der Liebe",
"point1_color": "Liebeslinie",
"point2": "Ein langer Daumen weist auf Glück hin",
"point3": "<color> spiegelt Ihre Intelligenz und Mentalität wider",
"point3_color": "Kopflinie",
"point4": "Ein langer Zeigefinger weist auf eine natürliche Führungspersönlichkeit hin",
"point5": "<color> definiert die Qualität Ihres Lebens und was Sie erreichen werden",
"point5_color": "Lebenslinie",
"point6": "Ein kurzer Mittelfinger offenbart einen freien Geist",
"point7": "<color> repräsentiert Ihren materiellen Erfolg und Ihre Karriereziele",
"point7_color": "Schicksalslinie",
"point8": "Ein langer Ringfinger zeigt, dass eine Person Risiken eingeht",
"point9": "Ein kurzer kleiner Finger weist auf mangelndes Selbstbewusstsein hin"
},
"discover_more": "Discover More",
"why_love": "Why does everyone <color> ?",
"why_love_color": "love AURA",
"discover_more": "Mehr entdecken",
"why_love": "Warum liebt jeder <color> ?",
"why_love_color": "AURA",
"reviews": {
"username1": "Rebecca Bauman",
"tagline1": "\"Its changed my life!\"",
"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!",
"tagline1": "\"Es hat mein Leben verändert!\"",
"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",
"tagline2": "\"After years of seeking, Ive finally found a true love.\"",
"text2": "I was hesitant about whether it was really worth trying, but now I have no regrets and I'm enjoying my new relationships!",
"tagline2": "\"Nach Jahren der Suche habe ich endlich die wahre Liebe gefunden.\"",
"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",
"tagline3": "\"Ive found a job I really enjoy.\"",
"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!"
"tagline3": "\"Ich habe einen Job gefunden, den ich wirklich mag.\"",
"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!",
"as_seen_in": "<color> As Seen in",
"success_story": "Werden Sie eine AURA Erfolgsgeschichte!",
"as_seen_in": "<color> Bekannt aus",
"footer": {
"text1": "Questions? Were here to help",
"text2": "Customer Support",
"text3": "Help Center"
"text1": "Fragen? Wir sind hier, um zu helfen",
"text2": "Kundensupport",
"text3": "Hilfe-Center"
}
},
"/payment": {
"will_be_charged_trial_info": "<trialPrice> for your <trialDuration>-day trial",
"will_be_charged_email_reminder": "email you a reminder",
"will_be_charged": "You will be charged only <trialInfo>. Then <fullPrice> <trialPrice> per week. Save <save> every week. Well <emailReminder> before your trial ends.",
"will_be_charged_trial_info": "<trialPrice> für Ihre <trialDuration>-tägige Probezeit",
"will_be_charged_email_reminder": "wir senden Ihnen eine Erinnerung per E-Mail",
"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": {
"personalized_offer": "Personalized offer reserved",
"title": "Start your <trialDuration>-day trial",
"total_today": "Total today",
"personalized_offer": "Personalisierte Angebot reserviert",
"title": "Starten Sie Ihre <trialDuration>-tägige Probezeit",
"total_today": "Heutige Gesamtsumme",
"code_applied_bold": "AURA24",
"code_applied": "Code <bold> applied!"
"code_applied": "Code <bold> angewandt!"
},
"guarantees": {
"no_commitment": "No commitment. Cancel anytime.",
"30_day_money_back": "30-Day Money-Back Guarantee"
"no_commitment": "Keine Verpflichtung. Jederzeit kündbar.",
"30_day_money_back": "30-Tage-Geld-zurück-Garantie"
},
"get_personal_prediction": "Get personal prediction",
"total_due": "Total due today: <trialPrice>",
"app_number_one_color": "25 million people.",
"app_number_one": "The #1 Astrology app trusted by over <color>"
}
}
"get_personal_prediction": "Persönliche Vorhersage erhalten",
"total_due": "Heute fällig: <trialPrice>",
"app_number_one_color": "25 Millionen Menschen.",
"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"
}

View File

@ -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": {
"title": "Find your happiness with highly-personalized predictions.",
"point1": "rated by real users",
"point2": "93.4% Accuracy",
"point3": "20m users choice",
"point4": "4.8 satisfaction sco",
"text": "Understand your self and improve relationships with astrology"
"title": "Finden Sie Ihr Glück mit hochgradig personalisierten Vorhersagen.",
"point1": "Bewertet von echten Nutzern",
"point2": "93,4% Genauigkeit",
"point3": "Wahl von 20 Mio. Nutzern",
"point4": "4,8 Zufriedenheitswert",
"text": "Verstehen Sie sich selbst und verbessern Sie Beziehungen mit Astrologie"
},
"/gender": {
"title": "Whats your gender?",
"description": "In Palmistry, everyone is a blend of masculine and feminine, so it helps to know yours."
"title": "Was ist Ihr Geschlecht?",
"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": {
"title": "Whats your date of birth?",
"text": "Your birth date reveals your core personality traits, needs and desires."
"title": "Wann ist Ihr Geburtsdatum?",
"text": "Ihr Geburtsdatum offenbart Ihre grundlegenden Persönlichkeitsmerkmale, Bedürfnisse und Wünsche."
},
"/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": {
"title": "What aspects of your life do you wish to gain insight into through palmistry?",
"answer1": "Love & Relationships",
"answer2": "Health & Vitality",
"answer3": "Career & Destiny"
"title": "In welche Lebensbereiche möchten Sie durch Handlesen Einblicke gewinnen?",
"answer1": "Liebe & Beziehungen",
"answer2": "Gesundheit & Vitalität",
"answer3": "Karriere & Schicksal"
},
"/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",
"answer2": "In a relationship"
"answer2": "In einer Beziehung"
},
"/element-resonates": {
"title": "Which element resonates with you most?",
"answer1": "Water",
"answer2": "Fire",
"answer3": "Air",
"answer4": "Earth"
"title": "Welches Element spricht Sie am meisten an?",
"answer1": "Wasser",
"answer2": "Feuer",
"answer3": "Luft",
"answer4": "Erde"
},
"/favorite-color": {
"title": "Which color do you like the most?",
"answer1": "Blue",
"answer2": "Green",
"title": "Welche Farbe gefällt Ihnen am meisten?",
"answer1": "Blau",
"answer2": "Grün",
"answer3": "Orange",
"answer4": "Violet",
"answer5": "Red",
"answer6": "Yellow"
"answer4": "Violett",
"answer5": "Rot",
"answer6": "Gelb"
},
"/head-or-heart": {
"title": "Do you make decisions with your head or your heart?",
"answer1": "Heart",
"answer2": "Head",
"answer3": "Both"
"title": "Treffen Sie Entscheidungen mit dem Kopf oder dem Herzen?",
"answer1": "Herz",
"answer2": "Kopf",
"answer3": "Beides"
},
"/relate-following": {
"title": "Do you relate to the following:",
"question1": "I find solace and comfort in spending time alone.",
"question2": "I value and enjoy my own company.",
"question3": "I prefer socializing in groups rather than spending time alone.",
"question4": "Loneliness is something I actively try to avoid.",
"question5": "I enjoy activities that I can do independently.",
"strongly_agree": "Strongly Agree",
"strongly_disagree": "Strongly Disagree"
"title": "Können Sie sich mit Folgendem identifizieren:",
"question1": "Ich finde Trost und Geborgenheit darin, Zeit allein zu verbringen.",
"question2": "Ich schätze und genieße meine eigene Gesellschaft.",
"question3": "Ich ziehe es vor, in Gruppen zu sozialisieren, anstatt allein Zeit zu verbringen.",
"question4": "Einsamkeit ist etwas, das ich aktiv zu vermeiden versuche.",
"question5": "Ich genieße Aktivitäten, die ich selbstständig machen kann.",
"strongly_agree": "Stimme voll zu",
"strongly_disagree": "Stimme überhaupt nicht zu"
},
"/let-scan": {
"title": "Let`s scan your palms",
"text": "Follow the on-screen instructions, so we can analyze your palm lines and reveal your future, and the secrets of your destiny!"
"title": "Lassen Sie uns Ihre Handflächen scannen",
"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": {
"title": "Take your palm picture as instructed",
"button": "Take a picture now"
"title": "Machen Sie Ihr Handflächenbild wie angegeben",
"button": "Jetzt ein Bild machen"
},
"/email": {
"title": "Enter your email to get your advanced Palmistry reading with AURA",
"not_share": "We dont share any personal information.",
"placeholder_email": "Deine E-Mail-Adresse",
"placeholder_name": "Dein Name"
"title": "Geben Sie Ihre E-Mail-Adresse ein, um Ihre erweiterte Handlesung mit AURA zu erhalten",
"not_share": "Wir teilen keine persönlichen Informationen.",
"placeholder_email": "Ihre E-Mail",
"placeholder_name": "Ihr Name"
},
"went_wrong": "Something went wrong.",
"app_number_one": {
"text": "The <color> app trusted by over 25 million people.",
"color": "#1 Astrology"
"text": "Die <color> App, der über 25 Millionen Menschen vertrauen.",
"color": "#1 Astrologie"
},
"/trial-payment": {
"palm_is_ready": {
"title": "Your Palm Reading <color>",
"title_color": "Is Ready",
"description": "“Ive just received your palm scan results. Lets discuss!”",
"text1": "<color> 6 years in palmistry readings and spiritual guidance.",
"title": "Ihre Handlesung <color>",
"title_color": "Ist bereit",
"description": "„Ich habe gerade Ihre Handscan-Ergebnisse erhalten. Lassen Sie uns darüber sprechen!“",
"text1": "<color> 6 Jahre Erfahrung in Handlesung und spiritueller Führung.",
"text1_color": "Akho",
"text2": "Choose from 80+ palm readers and astrologers."
"text2": "Wählen Sie aus über 80 Handlesern und Astrologen."
},
"joined_today": {
"text1": "Unlimited chats with a palm reader",
"text2": "<count> people joined today"
"text1": "Unbegrenzte Chats mit einem Handleser",
"text2": "<count> Personen sind heute beigetreten"
},
"get_personal_prediction": "Get personal prediction",
"get_personal_prediction": "Persönliche Vorhersage erhalten",
"how_work": {
"title": "How does AURA work?",
"point1_title": "Send us your palm scan",
"point1_text": "We analyze your palm lines to get hints about your future",
"point2_title": "Your palm reading is generated",
"point2_text": "One of our professional palm readers puts together a report filled with hints about your future",
"point3_title": "Start your trial to receive your prediction",
"point3_text": "Once youre a AURA member, well send over your prediction report so you can begin living a better life.",
"point4_title": "Talk with a palm reading specialist anytime",
"point4_text": "Get ongoing support by discussing your readings, personal horoscopes, and compatibilities with our expert team."
"title": "Wie funktioniert AURA?",
"point1_title": "Senden Sie uns Ihren Handscan",
"point1_text": "Wir analysieren Ihre Handlinien, um Hinweise auf Ihre Zukunft zu erhalten.",
"point2_title": "Ihre Handlesung wird erstellt",
"point2_text": "Einer unserer professionellen Handleser erstellt einen Bericht mit Hinweisen auf Ihre Zukunft.",
"point3_title": "Starten Sie Ihre Testphase, um Ihre Vorhersage zu erhalten",
"point3_text": "Sobald Sie AURA-Mitglied sind, senden wir Ihnen Ihren Vorhersagebericht zu, damit Sie ein besseres Leben beginnen können.",
"point4_title": "Sprechen Sie jederzeit mit einem Handlespesialisten",
"point4_text": "Erhalten Sie laufende Unterstützung, indem Sie Ihre Lesungen, persönlichen Horoskope und Kompatibilitäten mit unserem Expertenteam besprechen."
},
"money_back_guarantee": {
"title": "100% Money-back Guarantee",
"text": "If you dont notice any progress after using the app for at least a week, we are ready to make a complete refund within 14 days."
"title": "100% Geld-zurück-Garantie",
"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": {
"title": "Whats included?",
"point1": "<bold> palm readings",
"point1_bold": "Unlimited",
"point2": "<bold> with professional astrologers",
"point2_bold": "1:1 live chats",
"point3": "<bold> readings",
"point3_bold": "Daily compatibility",
"point4": "Cosmic relationship tips",
"point5": "Daily horoscopes"
"title": "Was ist enthalten?",
"point1": "<bold> Handlesungen",
"point1_bold": "Unbegrenzte",
"point2": "<bold> mit professionellen Astrologen",
"point2_bold": "1:1 Live-Chats",
"point3": "<bold> Lesungen",
"point3_bold": "Tägliche Kompatibilität",
"point4": "Kosmische Beziehungstipps",
"point5": "Tägliche Horoskope"
},
"palms_say_about": {
"title": "What do your palms say about you?",
"point1": "<color> shows your attitude to love and the quality of love",
"point1_color": "Love line",
"point2": "A long thumb indicates good fortune",
"point3": "<color> reflects your in telligence and mentality",
"point3_color": "Head line",
"point4": "A long index finger indicates a natural leader",
"point5": "<color> defines the quality of your life and what you will achieve",
"point5_color": "Life line",
"point6": "A short middle finger reveals a free spirit",
"point7": "<color> represents your material achievement and career goals",
"point7_color": "Fate line",
"point8": "A long ring finger reveals that a person tends to take risks",
"point9": "A short little finger indicates the person's lack of self-confidence"
"title": "Was sagen Ihre Handflächen über Sie?",
"point1": "<color> zeigt Ihre Einstellung zur Liebe und die Qualität der Liebe",
"point1_color": "Liebeslinie",
"point2": "Ein langer Daumen zeigt Wohlstand an",
"point3": "<color> widerspiegelt Ihre Intelligenz und Ihren Verstand",
"point3_color": "Kopflinie",
"point4": "Ein langer Zeigefinger deutet auf eine natürliche Führungspersönlichkeit hin",
"point5": "<color> bestimmt die Qualität Ihres Lebens und was Sie erreichen werden",
"point5_color": "Lebenslinie",
"point6": "Ein kurzer Mittelfinger offenbart einen Freigeist",
"point7": "<color> steht für Ihre materiellen Errungenschaften und Karriereziele",
"point7_color": "Schicksalslinie",
"point8": "Ein langer Ringfinger zeigt, dass eine Person risikofreudig ist",
"point9": "Ein kurzer kleiner Finger weist auf mangelndes Selbstvertrauen der Person hin"
},
"discover_more": "Discover More",
"why_love": "Why does everyone <color> ?",
"why_love_color": "love AURA",
"discover_more": "Mehr entdecken",
"why_love": "Warum lieben alle <color> ?",
"why_love_color": "AURA",
"reviews": {
"username1": "Rebecca Bauman",
"tagline1": "\"Its changed my life!\"",
"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!",
"tagline1": "\"Es hat mein Leben verändert!\"",
"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",
"tagline2": "\"After years of seeking, Ive finally found a true love.\"",
"text2": "I was hesitant about whether it was really worth trying, but now I have no regrets and I'm enjoying my new relationships!",
"tagline2": "\"Nach jahrelanger Suche habe ich endlich die wahre Liebe gefunden.\"",
"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",
"tagline3": "\"Ive found a job I really enjoy.\"",
"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!"
"tagline3": "\"Ich habe einen Job gefunden, den ich wirklich genieße.\"",
"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!",
"as_seen_in": "<color> As Seen in",
"success_story": "Werden Sie eine AURA Erfolgsgeschichte!",
"as_seen_in": "<color> Wie gesehen in",
"footer": {
"text1": "Questions? Were here to help",
"text2": "Customer Support",
"text3": "Help Center"
"text1": "Fragen? Wir sind hier, um zu helfen",
"text2": "Kundensupport",
"text3": "Hilfezentrum"
}
},
"/payment": {
"will_be_charged_trial_info": "<trialPrice> for your <trialDuration>-day trial",
"will_be_charged_email_reminder": "email you a reminder",
"will_be_charged": "You will be charged only <trialInfo>. Then <fullPrice> <trialPrice> per week. Save <save> every week. Well <emailReminder> before your trial ends.",
"will_be_charged_trial_info": "<trialPrice> für Ihre <trialDuration>-Tage-Testphase",
"will_be_charged_email_reminder": "senden Ihnen eine Erinnerungs-E-Mail",
"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": {
"personalized_offer": "Personalized offer reserved",
"title": "Start your <trialDuration>-day trial",
"total_today": "Total today",
"personalized_offer": "Personalisierte Reserveangebot",
"title": "Starten Sie Ihre <trialDuration>-Tage-Testphase",
"total_today": "Total heute",
"code_applied_bold": "AURA24",
"code_applied": "Code <bold> applied!"
"code_applied": "Code <bold> angewendet!"
},
"guarantees": {
"no_commitment": "No commitment. Cancel anytime.",
"30_day_money_back": "30-Day Money-Back Guarantee"
"no_commitment": "Keine Verpflichtung. Jederzeit kündbar.",
"30_day_money_back": "30-Tage-Geld-zurück-Garantie"
},
"get_personal_prediction": "Get personal prediction",
"total_due": "Total due today: <trialPrice>",
"app_number_one_color": "25 million people.",
"app_number_one": "The #1 Astrology app trusted by over <color>"
}
}
"get_personal_prediction": "Persönliche Vorhersage erhalten",
"total_due": "Heute fällig: <trialPrice>",
"app_number_one_color": "25 Millionen Menschen.",
"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"
}

View File

@ -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 lachat.\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": {
"title": "Find your happiness with highly-personalized predictions.",
"point1": "rated by real users",
"point2": "93.4% Accuracy",
"point3": "20m users choice",
"point4": "4.8 satisfaction sco",
"text": "Understand your self and improve relationships with astrology"
"title": "Trouvez votre bonheur avec des prédictions hautement personnalisées.",
"point1": "approuvé par de vrais utilisateurs",
"point2": "93,4% de précision",
"point3": "Choix de 20 millions d'utilisateurs",
"point4": "Note de satisfaction de 4,8",
"text": "Comprenez-vous et améliorez vos relations grâce à l'astrologie"
},
"/gender": {
"title": "Whats your gender?",
"description": "In Palmistry, everyone is a blend of masculine and feminine, so it helps to know yours."
"title": "Quel est votre genre ?",
"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": {
"title": "Whats your date of birth?",
"text": "Your birth date reveals your core personality traits, needs and desires."
"title": "Quelle est votre date de naissance ?",
"text": "Votre date de naissance révèle vos traits de personnalité fondamentaux, vos besoins et vos désirs."
},
"/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": {
"title": "What aspects of your life do you wish to gain insight into through palmistry?",
"answer1": "Love & Relationships",
"answer2": "Health & Vitality",
"answer3": "Career & Destiny"
"title": "Quels aspects de votre vie souhaitez-vous explorer grâce à la chiromancie ?",
"answer1": "Amour et Relations",
"answer2": "Santé et Vitalité",
"answer3": "Carrière et Destin"
},
"/relationship-status": {
"title": "So we can get to know you better, please tell us your relationship status",
"answer1": "Single",
"answer2": "In a relationship"
"title": "Pour mieux vous connaître, merci de nous indiquer votre statut sentimental",
"answer1": "Célibataire",
"answer2": "En couple"
},
"/element-resonates": {
"title": "Which element resonates with you most?",
"answer1": "Water",
"answer2": "Fire",
"title": "Quel élément vous correspond le mieux ?",
"answer1": "Eau",
"answer2": "Feu",
"answer3": "Air",
"answer4": "Earth"
"answer4": "Terre"
},
"/favorite-color": {
"title": "Which color do you like the most?",
"answer1": "Blue",
"answer2": "Green",
"title": "Quelle couleur préférez-vous ?",
"answer1": "Bleu",
"answer2": "Vert",
"answer3": "Orange",
"answer4": "Violet",
"answer5": "Red",
"answer6": "Yellow"
"answer5": "Rouge",
"answer6": "Jaune"
},
"/head-or-heart": {
"title": "Do you make decisions with your head or your heart?",
"answer1": "Heart",
"answer2": "Head",
"answer3": "Both"
"title": "Prenez-vous vos décisions avec votre tête ou votre cœur ?",
"answer1": "Cœur",
"answer2": "Tête",
"answer3": "Les deux"
},
"/relate-following": {
"title": "Do you relate to the following:",
"question1": "I find solace and comfort in spending time alone.",
"question2": "I value and enjoy my own company.",
"question3": "I prefer socializing in groups rather than spending time alone.",
"question4": "Loneliness is something I actively try to avoid.",
"question5": "I enjoy activities that I can do independently.",
"strongly_agree": "Strongly Agree",
"strongly_disagree": "Strongly Disagree"
"title": "Vous reconnaissez-vous dans les affirmations suivantes :",
"question1": "Je trouve du réconfort et de la sérénité en passant du temps seul(e).",
"question2": "J'apprécie et j'aime ma propre compagnie.",
"question3": "Je préfère socialiser en groupe plutôt que de passer du temps seul(e).",
"question4": "La solitude est quelque chose que j'essaie d'éviter activement.",
"question5": "J'aime pratiquer des activités que je peux faire de manière indépendante.",
"strongly_agree": "Tout à fait d'accord",
"strongly_disagree": "Pas du tout d'accord"
},
"/let-scan": {
"title": "Let`s scan your palms",
"text": "Follow the on-screen instructions, so we can analyze your palm lines and reveal your future, and the secrets of your destiny!"
"title": "Scannons vos paumes",
"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": {
"title": "Take your palm picture as instructed",
"button": "Take a picture now"
"title": "Prenez la photo de votre paume selon les instructions",
"button": "Prendre une photo maintenant"
},
"/email": {
"title": "Enter your email to get your advanced Palmistry reading with AURA",
"not_share": "We dont share any personal information.",
"placeholder_email": "Votre e-mail",
"placeholder_name": "Votre nom"
"title": "Entrez votre email pour obtenir votre lecture de chiromancie avancée avec AURA",
"not_share": "Nous ne partageons aucune information personnelle.",
"placeholder_email": "Votre email",
"placeholder_name": "Votre prénom"
},
"went_wrong": "Something went wrong.",
"app_number_one": {
"text": "The <color> app trusted by over 25 million people.",
"color": "#1 Astrology"
"text": "L'application <color> de confiance pour plus de 25 millions de personnes.",
"color": "#1 en Astrologie"
},
"/trial-payment": {
"palm_is_ready": {
"title": "Your Palm Reading <color>",
"title_color": "Is Ready",
"description": "“Ive just received your palm scan results. Lets discuss!”",
"text1": "<color> 6 years in palmistry readings and spiritual guidance.",
"title": "Votre lecture de paume <color>",
"title_color": "Est prête",
"description": "“Je viens de recevoir les résultats de votre scan de paume. Discutons-en !”",
"text1": "<color> 6 ans d'expérience en lectures de chiromancie et en guidance spirituelle.",
"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": {
"text1": "Unlimited chats with a palm reader",
"text2": "<count> people joined today"
"text1": "Chats illimités avec un lecteur de paume",
"text2": "<count> personnes se sont inscrites aujourd'hui"
},
"get_personal_prediction": "Get personal prediction",
"get_personal_prediction": "Obtenez une prédiction personnelle",
"how_work": {
"title": "How does AURA work?",
"point1_title": "Send us your palm scan",
"point1_text": "We analyze your palm lines to get hints about your future",
"point2_title": "Your palm reading is generated",
"point2_text": "One of our professional palm readers puts together a report filled with hints about your future",
"point3_title": "Start your trial to receive your prediction",
"point3_text": "Once youre a AURA member, well send over your prediction report so you can begin living a better life.",
"point4_title": "Talk with a palm reading specialist anytime",
"point4_text": "Get ongoing support by discussing your readings, personal horoscopes, and compatibilities with our expert team."
"title": "Comment fonctionne AURA ?",
"point1_title": "Envoyez-nous votre scan de paume",
"point1_text": "Nous analysons les lignes de vos paumes pour obtenir des indices sur votre avenir",
"point2_title": "Votre lecture de paume est générée",
"point2_text": "L'un de nos lecteurs de paume professionnels vous rédige un rapport rempli d'indices sur votre avenir",
"point3_title": "Commencez votre essai pour recevoir votre prédiction",
"point3_text": "Une fois membre d'AURA, nous vous enverrons votre rapport de prédiction pour que vous puissiez commencer à vivre mieux.",
"point4_title": "Discutez avec un spécialiste en lecture de paume à tout moment",
"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": {
"title": "100% Money-back Guarantee",
"text": "If you dont notice any progress after using the app for at least a week, we are ready to make a complete refund within 14 days."
"title": "Garantie de remboursement à 100%",
"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": {
"title": "Whats included?",
"point1": "<bold> palm readings",
"point1_bold": "Unlimited",
"point2": "<bold> with professional astrologers",
"point2_bold": "1:1 live chats",
"point3": "<bold> readings",
"point3_bold": "Daily compatibility",
"point4": "Cosmic relationship tips",
"point5": "Daily horoscopes"
"title": "Qu'est-ce qui est inclus ?",
"point1": "<bold> lectures de paume",
"point1_bold": "Illimitées",
"point2": "<bold> avec des astrologues professionnels",
"point2_bold": "Chats en direct 1:1",
"point3": "<bold> lectures",
"point3_bold": "Compatibilité quotidienne",
"point4": "Conseils pour les relations cosmiques",
"point5": "Horoscopes quotidiens"
},
"palms_say_about": {
"title": "What do your palms say about you?",
"point1": "<color> shows your attitude to love and the quality of love",
"point1_color": "Love line",
"point2": "A long thumb indicates good fortune",
"point3": "<color> reflects your in telligence and mentality",
"point3_color": "Head line",
"point4": "A long index finger indicates a natural leader",
"point5": "<color> defines the quality of your life and what you will achieve",
"point5_color": "Life line",
"point6": "A short middle finger reveals a free spirit",
"point7": "<color> represents your material achievement and career goals",
"point7_color": "Fate line",
"point8": "A long ring finger reveals that a person tends to take risks",
"point9": "A short little finger indicates the person's lack of self-confidence"
"title": "Que disent vos paumes de vous ?",
"point1": "<color> montre votre attitude envers l'amour et la qualité de l'amour",
"point1_color": "Ligne de cœur",
"point2": "Un pouce long indique une bonne fortune",
"point3": "<color> reflète votre intelligence et votre mentalité",
"point3_color": "Ligne de tête",
"point4": "Un index long montre un leader naturel",
"point5": "<color> définit la qualité de votre vie et ce que vous accomplirez",
"point5_color": "Ligne de vie",
"point6": "Un majeur court révèle un esprit libre",
"point7": "<color> représente vos accomplissements matériels et objectifs de carrière",
"point7_color": "Ligne de destinée",
"point8": "Un annulaire long révèle une tendance à prendre des risques",
"point9": "Un petit doigt court indique un manque de confiance en soi"
},
"discover_more": "Discover More",
"why_love": "Why does everyone <color> ?",
"why_love_color": "love AURA",
"discover_more": "Découvrez plus",
"why_love": "Pourquoi tout le monde <color> ?",
"why_love_color": "aime AURA",
"reviews": {
"username1": "Rebecca Bauman",
"tagline1": "\"Its changed my life!\"",
"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!",
"tagline1": "\"Cela a changé ma vie !\"",
"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",
"tagline2": "\"After years of seeking, Ive finally found a true love.\"",
"text2": "I was hesitant about whether it was really worth trying, but now I have no regrets and I'm enjoying my new relationships!",
"tagline2": "\"Après des années de recherche, j'ai enfin trouvé un véritable amour.\"",
"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",
"tagline3": "\"Ive found a job I really enjoy.\"",
"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!"
"tagline3": "\"J'ai trouvé un travail qui me plaît vraiment.\"",
"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!",
"as_seen_in": "<color> As Seen in",
"success_story": "Devenez une success story d'AURA !",
"as_seen_in": "<color> Vu dans",
"footer": {
"text1": "Questions? Were here to help",
"text2": "Customer Support",
"text3": "Help Center"
"text1": "Des questions ? Nous sommes là pour vous aider",
"text2": "Support Client",
"text3": "Centre d'aide"
}
},
"/payment": {
"will_be_charged_trial_info": "<trialPrice> for your <trialDuration>-day trial",
"will_be_charged_email_reminder": "email you a reminder",
"will_be_charged": "You will be charged only <trialInfo>. Then <fullPrice> <trialPrice> per week. Save <save> every week. Well <emailReminder> before your trial ends.",
"will_be_charged_trial_info": "<trialPrice> pour votre essai de <trialDuration> jours",
"will_be_charged_email_reminder": "un rappel par email",
"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": {
"personalized_offer": "Personalized offer reserved",
"title": "Start your <trialDuration>-day trial",
"total_today": "Total today",
"personalized_offer": "Offre personnalisée réservée",
"title": "Commencez votre essai de <trialDuration> jours",
"total_today": "Total aujourd'hui",
"code_applied_bold": "AURA24",
"code_applied": "Code <bold> applied!"
"code_applied": "Code <bold> appliqué !"
},
"guarantees": {
"no_commitment": "No commitment. Cancel anytime.",
"30_day_money_back": "30-Day Money-Back Guarantee"
"no_commitment": "Pas d'engagement. Annulez à tout moment.",
"30_day_money_back": "Garantie de remboursement de 30 jours"
},
"get_personal_prediction": "Get personal prediction",
"total_due": "Total due today: <trialPrice>",
"app_number_one_color": "25 million people.",
"app_number_one": "The #1 Astrology app trusted by over <color>"
}
}
"get_personal_prediction": "Obtenez une prédiction personnelle",
"total_due": "Total dû aujourd'hui : <trialPrice>",
"app_number_one_color": "25 millions de personnes.",
"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"
}

View File

@ -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": {
"title": "Find your happiness with highly-personalized predictions.",
"point1": "rated by real users",
"point2": "93.4% Accuracy",
"point3": "20m users choice",
"point4": "4.8 satisfaction sco",
"text": "Understand your self and improve relationships with astrology"
"title": "Trouvez votre bonheur avec des prévisions hautement personnalisées.",
"point1": "évalué par de vrais utilisateurs",
"point2": "Précision de 93,4 %",
"point3": "Choisi par 20 millions d'utilisateurs",
"point4": "4,8 de score de satisfaction",
"text": "Comprenez-vous et améliorez vos relations grâce à l'astrologie"
},
"/gender": {
"title": "Whats your gender?",
"description": "In Palmistry, everyone is a blend of masculine and feminine, so it helps to know yours."
"title": "Quel est votre genre ?",
"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": {
"title": "Whats your date of birth?",
"text": "Your birth date reveals your core personality traits, needs and desires."
"title": "Quelle est votre date de naissance ?",
"text": "Votre date de naissance révèle vos traits de personnalité fondamentaux, vos besoins et vos désirs."
},
"/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": {
"title": "What aspects of your life do you wish to gain insight into through palmistry?",
"answer1": "Love & Relationships",
"answer2": "Health & Vitality",
"answer3": "Career & Destiny"
"title": "Quels aspects de votre vie souhaitez-vous explorer grâce à la chiromancie ?",
"answer1": "Amour & Relations",
"answer2": "Santé & Vitalité",
"answer3": "Carrière & Destin"
},
"/relationship-status": {
"title": "So we can get to know you better, please tell us your relationship status",
"answer1": "Single",
"answer2": "In a relationship"
"title": "Pour mieux vous connaître, veuillez nous indiquer votre statut relationnel",
"answer1": "Célibataire",
"answer2": "En couple"
},
"/element-resonates": {
"title": "Which element resonates with you most?",
"answer1": "Water",
"answer2": "Fire",
"title": "Quel élément résonne le plus en vous ?",
"answer1": "Eau",
"answer2": "Feu",
"answer3": "Air",
"answer4": "Earth"
"answer4": "Terre"
},
"/favorite-color": {
"title": "Which color do you like the most?",
"answer1": "Blue",
"answer2": "Green",
"title": "Quelle couleur préférez-vous ?",
"answer1": "Bleu",
"answer2": "Vert",
"answer3": "Orange",
"answer4": "Violet",
"answer5": "Red",
"answer6": "Yellow"
"answer5": "Rouge",
"answer6": "Jaune"
},
"/head-or-heart": {
"title": "Do you make decisions with your head or your heart?",
"answer1": "Heart",
"answer2": "Head",
"answer3": "Both"
"title": "Prenez-vous vos décisions avec votre tête ou votre cœur ?",
"answer1": "Cœur",
"answer2": "Tête",
"answer3": "Les deux"
},
"/relate-following": {
"title": "Do you relate to the following:",
"question1": "I find solace and comfort in spending time alone.",
"question2": "I value and enjoy my own company.",
"question3": "I prefer socializing in groups rather than spending time alone.",
"question4": "Loneliness is something I actively try to avoid.",
"question5": "I enjoy activities that I can do independently.",
"strongly_agree": "Strongly Agree",
"strongly_disagree": "Strongly Disagree"
"title": "Vous identifiez-vous aux affirmations suivantes :",
"question1": "Je trouve du réconfort et de la consolation à passer du temps seul.",
"question2": "J'apprécie et j'aime ma propre compagnie.",
"question3": "Je préfère socialiser en groupe plutôt que de passer du temps seul.",
"question4": "La solitude est quelque chose que j'essaie d'éviter activement.",
"question5": "J'apprécie les activités que je peux faire de manière indépendante.",
"strongly_agree": "Tout à fait d'accord",
"strongly_disagree": "Pas du tout d'accord"
},
"/let-scan": {
"title": "Let`s scan your palms",
"text": "Follow the on-screen instructions, so we can analyze your palm lines and reveal your future, and the secrets of your destiny!"
"title": "Scannons vos paumes",
"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": {
"title": "Take your palm picture as instructed",
"button": "Take a picture now"
"title": "Prenez la photo de votre paume comme indiqué",
"button": "Prenez une photo maintenant"
},
"/email": {
"title": "Enter your email to get your advanced Palmistry reading with AURA",
"not_share": "We dont share any personal information.",
"placeholder_email": "Votre e-mail",
"title": "Entrez votre email pour obtenir votre lecture avancée de chiromancie avec AURA",
"not_share": "Nous ne partageons aucune information personnelle.",
"placeholder_email": "Votre email",
"placeholder_name": "Votre nom"
},
"went_wrong": "Something went wrong.",
"app_number_one": {
"text": "The <color> app trusted by over 25 million people.",
"color": "#1 Astrology"
"text": "L'application <color> de confiance pour plus de 25 millions de personnes.",
"color": "#1 en astrologie"
},
"/trial-payment": {
"palm_is_ready": {
"title": "Your Palm Reading <color>",
"title_color": "Is Ready",
"description": "“Ive just received your palm scan results. Lets discuss!”",
"text1": "<color> 6 years in palmistry readings and spiritual guidance.",
"title": "Votre lecture de paume <color>",
"title_color": "est prête",
"description": "“Je viens de recevoir les résultats de votre scan de paume. Discutons-en !”",
"text1": "<color> 6 ans d'expérience en lecture de paume et guidance spirituelle.",
"text1_color": "Akho",
"text2": "Choose from 80+ palm readers and astrologers."
"text2": "Choisissez parmi plus de 80 lecteurs de paume et astrologues."
},
"joined_today": {
"text1": "Unlimited chats with a palm reader",
"text2": "<count> people joined today"
"text1": "Chats illimités avec un lecteur de paume",
"text2": "<count> personnes ont rejoint aujourd'hui"
},
"get_personal_prediction": "Get personal prediction",
"get_personal_prediction": "Obtenez votre prédiction personnelle",
"how_work": {
"title": "How does AURA work?",
"point1_title": "Send us your palm scan",
"point1_text": "We analyze your palm lines to get hints about your future",
"point2_title": "Your palm reading is generated",
"point2_text": "One of our professional palm readers puts together a report filled with hints about your future",
"point3_title": "Start your trial to receive your prediction",
"point3_text": "Once youre a AURA member, well send over your prediction report so you can begin living a better life.",
"point4_title": "Talk with a palm reading specialist anytime",
"point4_text": "Get ongoing support by discussing your readings, personal horoscopes, and compatibilities with our expert team."
"title": "Comment fonctionne AURA ?",
"point1_title": "Envoyez-nous votre scan de paume",
"point1_text": "Nous analysons les lignes de votre paume pour obtenir des indices sur votre futur",
"point2_title": "Votre lecture de paume est générée",
"point2_text": "L'un de nos lecteurs de paume professionnels réalise un rapport rempli d'indices sur votre avenir",
"point3_title": "Commencez votre essai pour recevoir votre prédiction",
"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": "Discutez avec un spécialiste de la lecture de paume à tout moment",
"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": {
"title": "100% Money-back Guarantee",
"text": "If you dont notice any progress after using the app for at least a week, we are ready to make a complete refund within 14 days."
"title": "Garantie de remboursement à 100 %",
"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": {
"title": "Whats included?",
"point1": "<bold> palm readings",
"point1_bold": "Unlimited",
"point2": "<bold> with professional astrologers",
"point2_bold": "1:1 live chats",
"point3": "<bold> readings",
"point3_bold": "Daily compatibility",
"point4": "Cosmic relationship tips",
"point5": "Daily horoscopes"
"title": "Qu'est-ce qui est inclus ?",
"point1": "<bold> lectures de paume",
"point1_bold": "Illimitées",
"point2": "<bold> avec des astrologues professionnels",
"point2_bold": "Chats en direct 1:1",
"point3": "<bold> lectures ",
"point3_bold": "Compatibilité quotidienne",
"point4": "Conseils de relation cosmique",
"point5": "Horoscopes quotidiens"
},
"palms_say_about": {
"title": "What do your palms say about you?",
"point1": "<color> shows your attitude to love and the quality of love",
"point1_color": "Love line",
"point2": "A long thumb indicates good fortune",
"point3": "<color> reflects your in telligence and mentality",
"point3_color": "Head line",
"point4": "A long index finger indicates a natural leader",
"point5": "<color> defines the quality of your life and what you will achieve",
"point5_color": "Life line",
"point6": "A short middle finger reveals a free spirit",
"point7": "<color> represents your material achievement and career goals",
"point7_color": "Fate line",
"point8": "A long ring finger reveals that a person tends to take risks",
"point9": "A short little finger indicates the person's lack of self-confidence"
"title": "Que disent vos paumes sur vous ?",
"point1": "<color> montre votre attitude envers l'amour et la qualité de l'amour",
"point1_color": "Ligne de cœur",
"point2": "Un pouce long indique une bonne fortune",
"point3": "<color> reflète votre intelligence et votre mentalité",
"point3_color": "Ligne de tête",
"point4": "Un index long indique un leader naturel",
"point5": "<color> définit la qualité de votre vie et ce que vous allez accomplir",
"point5_color": "Ligne de vie",
"point6": "Un majeur court révèle un esprit libre",
"point7": "<color> représente vos réalisations matérielles et vos objectifs de carrière",
"point7_color": "Ligne de destinée",
"point8": "Un annulaire long révèle qu'une personne a tendance à prendre des risques",
"point9": "Un petit doigt court indique un manque de confiance en soi"
},
"discover_more": "Discover More",
"why_love": "Why does everyone <color> ?",
"why_love_color": "love AURA",
"discover_more": "Découvrez plus",
"why_love": "Pourquoi tout le monde <color> ?",
"why_love_color": "aime AURA",
"reviews": {
"username1": "Rebecca Bauman",
"tagline1": "\"Its changed my life!\"",
"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!",
"tagline1": "\"Cela a changé ma vie !\"",
"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",
"tagline2": "\"After years of seeking, Ive finally found a true love.\"",
"text2": "I was hesitant about whether it was really worth trying, but now I have no regrets and I'm enjoying my new relationships!",
"tagline2": "\"Après des années de recherche, j'ai enfin trouvé un véritable amour.\"",
"text2": "J'hésitais à essayer, mais maintenant je ne regrette rien et je savoure mes nouvelles relations !",
"username3": "Amanda Holmes",
"tagline3": "\"Ive found a job I really enjoy.\"",
"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!"
"tagline3": "\"J'ai trouvé un emploi que j'aime vraiment.\"",
"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!",
"as_seen_in": "<color> As Seen in",
"success_story": "Devenez une Success Story d'AURA !",
"as_seen_in": "<color> Vu dans",
"footer": {
"text1": "Questions? Were here to help",
"text2": "Customer Support",
"text3": "Help Center"
"text1": "Des questions ? Nous sommes là pour vous aider",
"text2": "Service client",
"text3": "Centre d'aide"
}
},
"/payment": {
"will_be_charged_trial_info": "<trialPrice> for your <trialDuration>-day trial",
"will_be_charged_email_reminder": "email you a reminder",
"will_be_charged": "You will be charged only <trialInfo>. Then <fullPrice> <trialPrice> per week. Save <save> every week. Well <emailReminder> before your trial ends.",
"will_be_charged_trial_info": "<trialPrice> pour votre essai de <trialDuration> jours",
"will_be_charged_email_reminder": "vous envoyer un rappel par email",
"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": {
"personalized_offer": "Personalized offer reserved",
"title": "Start your <trialDuration>-day trial",
"total_today": "Total today",
"personalized_offer": "Offre personnalisée réservée",
"title": "Commencez votre essai de <trialDuration> jours",
"total_today": "Total aujourd'hui",
"code_applied_bold": "AURA24",
"code_applied": "Code <bold> applied!"
"code_applied": "Code <bold> appliqué !"
},
"guarantees": {
"no_commitment": "No commitment. Cancel anytime.",
"30_day_money_back": "30-Day Money-Back Guarantee"
"no_commitment": "Pas d'engagement. Annulez à tout moment.",
"30_day_money_back": "Garantie de remboursement de 30 jours"
},
"get_personal_prediction": "Get personal prediction",
"total_due": "Total due today: <trialPrice>",
"app_number_one_color": "25 million people.",
"app_number_one": "The #1 Astrology app trusted by over <color>"
}
}
"get_personal_prediction": "Obtenez votre prédiction personnelle",
"total_due": "Montant dû aujourd'hui : <trialPrice>",
"app_number_one_color": "25 millions de personnes.",
"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"
}

View File

@ -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": {
"title": "Find your happiness with highly-personalized predictions.",
"point1": "rated by real users",
"point2": "93.4% Accuracy",
"point3": "20m users choice",
"point4": "4.8 satisfaction sco",
"text": "Understand your self and improve relationships with astrology"
"title": "Encontre sua felicidade com previsões altamente personalizadas.",
"point1": "avaliado por usuários reais",
"point2": "93,4% de precisão",
"point3": "Escolha de 20 milhões de usuárias",
"point4": "4,8 de pontuação de satisfação",
"text": "Compreenda-se melhor e melhore seus relacionamentos com a astrologia"
},
"/gender": {
"title": "Whats your gender?",
"description": "In Palmistry, everyone is a blend of masculine and feminine, so it helps to know yours."
"title": "Qual é o seu gênero?",
"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": {
"title": "Whats your date of birth?",
"text": "Your birth date reveals your core personality traits, needs and desires."
"title": "Qual é a sua data de nascimento?",
"text": "Sua data de nascimento revela seus traços de personalidade fundamentais, necessidades e desejos."
},
"/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": {
"title": "What aspects of your life do you wish to gain insight into through palmistry?",
"answer1": "Love & Relationships",
"answer2": "Health & Vitality",
"answer3": "Career & Destiny"
"title": "Quais aspectos da sua vida você deseja explorar através da quiromancia?",
"answer1": "Amor & Relacionamentos",
"answer2": "Saúde & Vitalidade",
"answer3": "Carreira & Destino"
},
"/relationship-status": {
"title": "So we can get to know you better, please tell us your relationship status",
"answer1": "Single",
"answer2": "In a relationship"
"title": "Para que possamos conhecê-la melhor, por favor nos diga seu status de relacionamento",
"answer1": "Solteira",
"answer2": "Em um relacionamento"
},
"/element-resonates": {
"title": "Which element resonates with you most?",
"answer1": "Water",
"answer2": "Fire",
"answer3": "Air",
"answer4": "Earth"
"title": "Com qual elemento você mais se identifica?",
"answer1": "Água",
"answer2": "Fogo",
"answer3": "Ar",
"answer4": "Terra"
},
"/favorite-color": {
"title": "Which color do you like the most?",
"answer1": "Blue",
"answer2": "Green",
"answer3": "Orange",
"answer4": "Violet",
"answer5": "Red",
"answer6": "Yellow"
"title": "Qual é a sua cor preferida?",
"answer1": "Azul",
"answer2": "Verde",
"answer3": "Laranja",
"answer4": "Violeta",
"answer5": "Vermelho",
"answer6": "Amarelo"
},
"/head-or-heart": {
"title": "Do you make decisions with your head or your heart?",
"answer1": "Heart",
"answer2": "Head",
"answer3": "Both"
"title": "Você toma decisões com a cabeça ou com o coração?",
"answer1": "Coração",
"answer2": "Cabeça",
"answer3": "Ambos"
},
"/relate-following": {
"title": "Do you relate to the following:",
"question1": "I find solace and comfort in spending time alone.",
"question2": "I value and enjoy my own company.",
"question3": "I prefer socializing in groups rather than spending time alone.",
"question4": "Loneliness is something I actively try to avoid.",
"question5": "I enjoy activities that I can do independently.",
"strongly_agree": "Strongly Agree",
"strongly_disagree": "Strongly Disagree"
"title": "Você se identifica com o seguinte:",
"question1": "Encontro conforto e alívio em passar tempo sozinha.",
"question2": "Valorizo e aprecio minha própria companhia.",
"question3": "Prefiro socializar em grupos do que passar tempo sozinha.",
"question4": "A solidão é algo que tento evitar ativamente.",
"question5": "Gosto de atividades que posso fazer de forma independente.",
"strongly_agree": "Concordo Plenamente",
"strongly_disagree": "Discordo Completamente"
},
"/let-scan": {
"title": "Let`s scan your palms",
"text": "Follow the on-screen instructions, so we can analyze your palm lines and reveal your future, and the secrets of your destiny!"
"title": "Vamos escanear suas palmas",
"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": {
"title": "Take your palm picture as instructed",
"button": "Take a picture now"
"title": "Tire a foto da sua palma conforme instruído",
"button": "Tirar foto agora"
},
"/email": {
"title": "Enter your email to get your advanced Palmistry reading with AURA",
"not_share": "We dont share any personal information.",
"placeholder_email": "Seu email",
"title": "Digite seu e-mail para receber sua leitura avançada de Quiromancia com a AURA",
"not_share": "Não compartilhamos nenhuma informação pessoal.",
"placeholder_email": "Seu e-mail",
"placeholder_name": "Seu nome"
},
"went_wrong": "Something went wrong.",
"app_number_one": {
"text": "The <color> app trusted by over 25 million people.",
"color": "#1 Astrology"
"text": "O app <color> confiado por mais de 25 milhões de pessoas.",
"color": "#1 em Astrologia"
},
"/trial-payment": {
"palm_is_ready": {
"title": "Your Palm Reading <color>",
"title_color": "Is Ready",
"description": "“Ive just received your palm scan results. Lets discuss!”",
"text1": "<color> 6 years in palmistry readings and spiritual guidance.",
"title": "Sua Leitura de Palma <color>",
"title_color": "Está Pronta",
"description": "“Acabei de receber os resultados do seu escaneamento da palma. Vamos conversar!”",
"text1": "<color> 6 anos em leituras de quiromancia e orientação espiritual.",
"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": {
"text1": "Unlimited chats with a palm reader",
"text2": "<count> people joined today"
"text1": "Converse ilimitadamente com um leiturista de palmas",
"text2": "<count> pessoas se juntaram hoje"
},
"get_personal_prediction": "Get personal prediction",
"get_personal_prediction": "Receba sua previsão pessoal",
"how_work": {
"title": "How does AURA work?",
"point1_title": "Send us your palm scan",
"point1_text": "We analyze your palm lines to get hints about your future",
"point2_title": "Your palm reading is generated",
"point2_text": "One of our professional palm readers puts together a report filled with hints about your future",
"point3_title": "Start your trial to receive your prediction",
"point3_text": "Once youre a AURA member, well send over your prediction report so you can begin living a better life.",
"point4_title": "Talk with a palm reading specialist anytime",
"point4_text": "Get ongoing support by discussing your readings, personal horoscopes, and compatibilities with our expert team."
"title": "Como funciona a AURA?",
"point1_title": "Envie-nos seu escaneamento da palma",
"point1_text": "Analisamos suas linhas da palma para obter pistas sobre seu futuro",
"point2_title": "Sua leitura de palma é gerada",
"point2_text": "Um de nossos leituristas de palmas profissionais elabora um relatório com pistas sobre seu futuro",
"point3_title": "Inicie seu teste para receber sua previsão",
"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": "Converse com uma especialista em leitura de palmas a qualquer momento",
"point4_text": "Obtenha suporte contínuo discutindo suas leituras, horóscopos pessoais, e compatibilidades com nossa equipe de especialistas."
},
"money_back_guarantee": {
"title": "100% Money-back Guarantee",
"text": "If you dont notice any progress after using the app for at least a week, we are ready to make a complete refund within 14 days."
"title": "Garantia de Devolução do Dinheiro 100%",
"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": {
"title": "Whats included?",
"point1": "<bold> palm readings",
"point1_bold": "Unlimited",
"point2": "<bold> with professional astrologers",
"point2_bold": "1:1 live chats",
"point3": "<bold> readings",
"point3_bold": "Daily compatibility",
"point4": "Cosmic relationship tips",
"point5": "Daily horoscopes"
"title": "O que está incluído?",
"point1": "<bold> leituras de palma",
"point1_bold": "Ilimitadas",
"point2": "<bold> com astrólogos profissionais",
"point2_bold": "Chats ao vivo 1:1",
"point3": "<bold> leituras",
"point3_bold": "Compatibilidade diária",
"point4": "Dicas de relacionamento cósmico",
"point5": "Horóscopos diários"
},
"palms_say_about": {
"title": "What do your palms say about you?",
"point1": "<color> shows your attitude to love and the quality of love",
"point1_color": "Love line",
"point2": "A long thumb indicates good fortune",
"point3": "<color> reflects your in telligence and mentality",
"point3_color": "Head line",
"point4": "A long index finger indicates a natural leader",
"point5": "<color> defines the quality of your life and what you will achieve",
"point5_color": "Life line",
"point6": "A short middle finger reveals a free spirit",
"point7": "<color> represents your material achievement and career goals",
"point7_color": "Fate line",
"point8": "A long ring finger reveals that a person tends to take risks",
"point9": "A short little finger indicates the person's lack of self-confidence"
"title": "O que suas palmas dizem sobre você?",
"point1": "<color> mostra sua atitude em relação ao amor e a qualidade do amor",
"point1_color": "Linha do amor",
"point2": "Um polegar longo indica boa sorte",
"point3": "<color> reflete sua inteligência e mentalidade",
"point3_color": "Linha da cabeça",
"point4": "Um dedo indicador longo indica uma líder nata",
"point5": "<color> define a qualidade da sua vida e o que você vai alcançar",
"point5_color": "Linha da vida",
"point6": "Um dedo médio curto revela um espírito livre",
"point7": "<color> representa sua realização material e metas de carreira",
"point7_color": "Linha do destino",
"point8": "Um dedo anelar longo revela que a pessoa tende a assumir riscos",
"point9": "Um dedo mindinho curto indica falta de autoconfiança da pessoa"
},
"discover_more": "Discover More",
"why_love": "Why does everyone <color> ?",
"why_love_color": "love AURA",
"discover_more": "Descubra Mais",
"why_love": "Por que todas <color> ?",
"why_love_color": "amam AURA",
"reviews": {
"username1": "Rebecca Bauman",
"tagline1": "\"Its changed my life!\"",
"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!",
"tagline1": "\"Isso mudou minha vida!\"",
"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",
"tagline2": "\"After years of seeking, Ive finally found a true love.\"",
"text2": "I was hesitant about whether it was really worth trying, but now I have no regrets and I'm enjoying my new relationships!",
"tagline2": "\"Após anos de busca, finalmente encontrei um verdadeiro amor.\"",
"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",
"tagline3": "\"Ive found a job I really enjoy.\"",
"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!"
"tagline3": "\"Encontrei um trabalho de que realmente gosto.\"",
"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!",
"as_seen_in": "<color> As Seen in",
"success_story": "Torne-se uma História de Sucesso da AURA!",
"as_seen_in": "<color> Como Visto em",
"footer": {
"text1": "Questions? Were here to help",
"text2": "Customer Support",
"text3": "Help Center"
"text1": "Dúvidas? Estamos aqui para ajudar",
"text2": "Suporte ao Cliente",
"text3": "Centro de Ajuda"
}
},
"/payment": {
"will_be_charged_trial_info": "<trialPrice> for your <trialDuration>-day trial",
"will_be_charged_email_reminder": "email you a reminder",
"will_be_charged": "You will be charged only <trialInfo>. Then <fullPrice> <trialPrice> per week. Save <save> every week. Well <emailReminder> before your trial ends.",
"will_be_charged_trial_info": "<trialPrice> para o seu teste de <trialDuration> dias",
"will_be_charged_email_reminder": "enviaremos um lembrete por e-mail",
"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": {
"personalized_offer": "Personalized offer reserved",
"title": "Start your <trialDuration>-day trial",
"total_today": "Total today",
"personalized_offer": "Oferta personalizada reservada",
"title": "Inicie seu teste de <trialDuration> dias",
"total_today": "Total hoje",
"code_applied_bold": "AURA24",
"code_applied": "Code <bold> applied!"
"code_applied": "Código <bold> aplicado!"
},
"guarantees": {
"no_commitment": "No commitment. Cancel anytime.",
"30_day_money_back": "30-Day Money-Back Guarantee"
"no_commitment": "Sem compromisso. Cancele a qualquer momento.",
"30_day_money_back": "Garantia de Devolução do Dinheiro em 30 Dias"
},
"get_personal_prediction": "Get personal prediction",
"total_due": "Total due today: <trialPrice>",
"app_number_one_color": "25 million people.",
"app_number_one": "The #1 Astrology app trusted by over <color>"
}
}
"get_personal_prediction": "Receber previsão pessoal",
"total_due": "Total devido hoje: <trialPrice>",
"app_number_one_color": "25 milhões de pessoas.",
"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"
}

View File

@ -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": {
"title": "Find your happiness with highly-personalized predictions.",
"point1": "rated by real users",
"point2": "93.4% Accuracy",
"point3": "20m users choice",
"point4": "4.8 satisfaction sco",
"text": "Understand your self and improve relationships with astrology"
"title": "Encontre sua felicidade com previsões altamente personalizadas.",
"point1": "avaliado por usuários reais",
"point2": "93,4% de Precisão",
"point3": "Escolha de 20 milhões de usuários",
"point4": "4,8 de índice de satisfação",
"text": "Entenda a si mesmo e melhore os relacionamentos com a astrologia"
},
"/gender": {
"title": "Whats your gender?",
"description": "In Palmistry, everyone is a blend of masculine and feminine, so it helps to know yours."
"title": "Qual é o seu gênero?",
"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": {
"title": "Whats your date of birth?",
"text": "Your birth date reveals your core personality traits, needs and desires."
"title": "Qual é a sua data de nascimento?",
"text": "Sua data de nascimento revela seus traços de personalidade fundamentais, necessidades e desejos."
},
"/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": {
"title": "What aspects of your life do you wish to gain insight into through palmistry?",
"answer1": "Love & Relationships",
"answer2": "Health & Vitality",
"answer3": "Career & Destiny"
"title": "Sobre quais aspectos da sua vida você deseja obter insights através da quiromancia?",
"answer1": "Amor e Relacionamentos",
"answer2": "Saúde e Vitalidade",
"answer3": "Carreira e Destino"
},
"/relationship-status": {
"title": "So we can get to know you better, please tell us your relationship status",
"answer1": "Single",
"answer2": "In a relationship"
"title": "Para que possamos conhecê-lo melhor, por favor, nos diga seu status de relacionamento",
"answer1": "Solteiro",
"answer2": "Em um relacionamento"
},
"/element-resonates": {
"title": "Which element resonates with you most?",
"answer1": "Water",
"answer2": "Fire",
"answer3": "Air",
"answer4": "Earth"
"title": "Com qual elemento você mais se identifica?",
"answer1": "Água",
"answer2": "Fogo",
"answer3": "Ar",
"answer4": "Terra"
},
"/favorite-color": {
"title": "Which color do you like the most?",
"answer1": "Blue",
"answer2": "Green",
"answer3": "Orange",
"answer4": "Violet",
"answer5": "Red",
"answer6": "Yellow"
"title": "Qual cor você mais gosta?",
"answer1": "Azul",
"answer2": "Verde",
"answer3": "Laranja",
"answer4": "Violeta",
"answer5": "Vermelho",
"answer6": "Amarelo"
},
"/head-or-heart": {
"title": "Do you make decisions with your head or your heart?",
"answer1": "Heart",
"answer2": "Head",
"answer3": "Both"
"title": "Você toma decisões com a cabeça ou com o coração?",
"answer1": "Coração",
"answer2": "Cabeça",
"answer3": "Ambos"
},
"/relate-following": {
"title": "Do you relate to the following:",
"question1": "I find solace and comfort in spending time alone.",
"question2": "I value and enjoy my own company.",
"question3": "I prefer socializing in groups rather than spending time alone.",
"question4": "Loneliness is something I actively try to avoid.",
"question5": "I enjoy activities that I can do independently.",
"strongly_agree": "Strongly Agree",
"strongly_disagree": "Strongly Disagree"
"title": "Você se identifica com o seguinte:",
"question1": "Encontro consolo e conforto em passar tempo sozinho.",
"question2": "Valorizo e aprecio minha própria companhia.",
"question3": "Prefiro socializar em grupos do que passar tempo sozinho.",
"question4": "Solidão é algo que eu evito ativamente.",
"question5": "Gosto de atividades que posso fazer de forma independente.",
"strongly_agree": "Concordo Plenamente",
"strongly_disagree": "Discordo Completamente"
},
"/let-scan": {
"title": "Let`s scan your palms",
"text": "Follow the on-screen instructions, so we can analyze your palm lines and reveal your future, and the secrets of your destiny!"
"title": "Vamos escanear suas palmas",
"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": {
"title": "Take your palm picture as instructed",
"button": "Take a picture now"
"title": "Tire a foto da sua palma conforme as instruções",
"button": "Tirar a foto agora"
},
"/email": {
"title": "Enter your email to get your advanced Palmistry reading with AURA",
"not_share": "We dont share any personal information.",
"placeholder_email": "Seu email",
"title": "Digite seu e-mail para receber sua leitura avançada de Quiromancia com a AURA",
"not_share": "Não compartilhamos nenhuma informação pessoal.",
"placeholder_email": "Seu e-mail",
"placeholder_name": "Seu nome"
},
"went_wrong": "Something went wrong.",
"app_number_one": {
"text": "The <color> app trusted by over 25 million people.",
"color": "#1 Astrology"
"text": "O aplicativo <color> confiado por mais de 25 milhões de pessoas.",
"color": "#1 em Astrologia"
},
"/trial-payment": {
"palm_is_ready": {
"title": "Your Palm Reading <color>",
"title_color": "Is Ready",
"description": "“Ive just received your palm scan results. Lets discuss!”",
"text1": "<color> 6 years in palmistry readings and spiritual guidance.",
"title": "Sua Leitura de Palma <color>",
"title_color": "Está Pronta",
"description": "“Acabei de receber os resultados do seu escaneamento de palma. Vamos discutir!”",
"text1": "<color> 6 anos em leituras de quiromancia e orientação espiritual.",
"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": {
"text1": "Unlimited chats with a palm reader",
"text2": "<count> people joined today"
"text1": "Chats ilimitados com um leitor de palma",
"text2": "<count> pessoas se juntaram hoje"
},
"get_personal_prediction": "Get personal prediction",
"get_personal_prediction": "Obter previsão pessoal",
"how_work": {
"title": "How does AURA work?",
"point1_title": "Send us your palm scan",
"point1_text": "We analyze your palm lines to get hints about your future",
"point2_title": "Your palm reading is generated",
"point2_text": "One of our professional palm readers puts together a report filled with hints about your future",
"point3_title": "Start your trial to receive your prediction",
"point3_text": "Once youre a AURA member, well send over your prediction report so you can begin living a better life.",
"point4_title": "Talk with a palm reading specialist anytime",
"point4_text": "Get ongoing support by discussing your readings, personal horoscopes, and compatibilities with our expert team."
"title": "Como funciona a AURA?",
"point1_title": "Envie-nos seu escaneamento de palma",
"point1_text": "Analisamos as linhas da sua palma para obter dicas sobre seu futuro",
"point2_title": "Sua leitura de palma é gerada",
"point2_text": "Um de nossos leitores profissionais de palma prepara um relatório cheio de dicas sobre seu futuro",
"point3_title": "Inicie sua avaliação para receber sua previsão",
"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": "Converse com um especialista em leitura de palma a qualquer momento",
"point4_text": "Obtenha suporte contínuo discutindo suas leituras, horóscopos pessoais e compatibilidades com nossa equipe de especialistas."
},
"money_back_guarantee": {
"title": "100% Money-back Guarantee",
"text": "If you dont notice any progress after using the app for at least a week, we are ready to make a complete refund within 14 days."
"title": "Garantia de Devolução de Dinheiro 100%",
"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": {
"title": "Whats included?",
"point1": "<bold> palm readings",
"point1_bold": "Unlimited",
"point2": "<bold> with professional astrologers",
"point2_bold": "1:1 live chats",
"point3": "<bold> readings",
"point3_bold": "Daily compatibility",
"point4": "Cosmic relationship tips",
"point5": "Daily horoscopes"
"title": "O que está incluído?",
"point1": "<bold> leituras de palma",
"point1_bold": "Ilimitadas",
"point2": "<bold> com astrólogos profissionais",
"point2_bold": "Chats ao vivo 1:1",
"point3": "<bold> leituras",
"point3_bold": "Compatibilidade diária",
"point4": "Dicas de relacionamento cósmico",
"point5": "Horóscopos diários"
},
"palms_say_about": {
"title": "What do your palms say about you?",
"point1": "<color> shows your attitude to love and the quality of love",
"point1_color": "Love line",
"point2": "A long thumb indicates good fortune",
"point3": "<color> reflects your in telligence and mentality",
"point3_color": "Head line",
"point4": "A long index finger indicates a natural leader",
"point5": "<color> defines the quality of your life and what you will achieve",
"point5_color": "Life line",
"point6": "A short middle finger reveals a free spirit",
"point7": "<color> represents your material achievement and career goals",
"point7_color": "Fate line",
"point8": "A long ring finger reveals that a person tends to take risks",
"point9": "A short little finger indicates the person's lack of self-confidence"
"title": "O que suas palmas dizem sobre você?",
"point1": "<color> mostra sua atitude em relação ao amor e à qualidade do amor",
"point1_color": "Linha do amor",
"point2": "Um polegar longo indica boa sorte",
"point3": "<color> reflete sua inteligência e mentalidade",
"point3_color": "Linha da cabeça",
"point4": "Um dedo indicador longo indica um líder nato",
"point5": "<color> define a qualidade de sua vida e o que você vai alcançar",
"point5_color": "Linha da vida",
"point6": "Um dedo médio curto revela um espírito livre",
"point7": "<color> representa seu sucesso material e objetivos de carreira",
"point7_color": "Linha do destino",
"point8": "Um dedo anelar longo revela que essa pessoa tende a correr riscos",
"point9": "Um dedo mínimo curto indica falta de autoconfiança da pessoa"
},
"discover_more": "Discover More",
"why_love": "Why does everyone <color> ?",
"why_love_color": "love AURA",
"discover_more": "Descubra Mais",
"why_love": "Por que todos <color> ?",
"why_love_color": "amam a AURA",
"reviews": {
"username1": "Rebecca Bauman",
"tagline1": "\"Its changed my life!\"",
"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!",
"tagline1": "\"Mudou minha vida!\"",
"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",
"tagline2": "\"After years of seeking, Ive finally found a true love.\"",
"text2": "I was hesitant about whether it was really worth trying, but now I have no regrets and I'm enjoying my new relationships!",
"tagline2": "\"Depois de anos procurando, finalmente encontrei um verdadeiro amor.\"",
"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",
"tagline3": "\"Ive found a job I really enjoy.\"",
"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!"
"tagline3": "\"Encontrei um trabalho que realmente aprecio.\"",
"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!",
"as_seen_in": "<color> As Seen in",
"success_story": "Torne-se uma História de Sucesso da AURA!",
"as_seen_in": "<color> Como Visto em",
"footer": {
"text1": "Questions? Were here to help",
"text2": "Customer Support",
"text3": "Help Center"
"text1": "Dúvidas? Estamos aqui para ajudar",
"text2": "Suporte ao Cliente",
"text3": "Central de Ajuda"
}
},
"/payment": {
"will_be_charged_trial_info": "<trialPrice> for your <trialDuration>-day trial",
"will_be_charged_email_reminder": "email you a reminder",
"will_be_charged": "You will be charged only <trialInfo>. Then <fullPrice> <trialPrice> per week. Save <save> every week. Well <emailReminder> before your trial ends.",
"will_be_charged_trial_info": "<trialPrice> pelo seu teste de <trialDuration> dias",
"will_be_charged_email_reminder": "enviaremos um lembrete por e-mail",
"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": {
"personalized_offer": "Personalized offer reserved",
"title": "Start your <trialDuration>-day trial",
"total_today": "Total today",
"personalized_offer": "Oferta personalizada reservada",
"title": "Inicie seu teste de <trialDuration> dias",
"total_today": "Total hoje",
"code_applied_bold": "AURA24",
"code_applied": "Code <bold> applied!"
"code_applied": "Código <bold> aplicado!"
},
"guarantees": {
"no_commitment": "No commitment. Cancel anytime.",
"30_day_money_back": "30-Day Money-Back Guarantee"
"no_commitment": "Sem compromisso. Cancele a qualquer momento.",
"30_day_money_back": "Garantia de devolução de dinheiro em 30 dias"
},
"get_personal_prediction": "Get personal prediction",
"total_due": "Total due today: <trialPrice>",
"app_number_one_color": "25 million people.",
"app_number_one": "The #1 Astrology app trusted by over <color>"
}
}
"get_personal_prediction": "Obter previsão pessoal",
"total_due": "Total devido hoje: <trialPrice>",
"app_number_one_color": "25 milhões de pessoas.",
"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"
}

View File

@ -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": {
"title": "Find your happiness with highly-personalized predictions.",
"point1": "rated by real users",
"point2": "93.4% Accuracy",
"point3": "20m users choice",
"point4": "4.8 satisfaction sco",
"text": "Understand your self and improve relationships with astrology"
"title": "Encontre a sua felicidade com previsões altamente personalizadas.",
"point1": "avaliado por utilizadores reais",
"point2": "93,4% de Precisão",
"point3": "Escolha de 20 milhões de utilizadores",
"point4": "Pontuação de satisfação de 4,8",
"text": "Compreenda-se a si mesma e melhore relações com a astrologia"
},
"/gender": {
"title": "Whats your gender?",
"description": "In Palmistry, everyone is a blend of masculine and feminine, so it helps to know yours."
"title": "Qual é o seu género?",
"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": {
"title": "Whats your date of birth?",
"text": "Your birth date reveals your core personality traits, needs and desires."
"title": "Qual é a sua data de nascimento?",
"text": "A sua data de nascimento revela os seus traços principais de personalidade, necessidades e desejos."
},
"/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": {
"title": "What aspects of your life do you wish to gain insight into through palmistry?",
"answer1": "Love & Relationships",
"answer2": "Health & Vitality",
"answer3": "Career & Destiny"
"title": "Que aspectos da sua vida gostaria de explorar através da quiromancia?",
"answer1": "Amor & Relacionamentos",
"answer2": "Saúde & Vitalidade",
"answer3": "Carreira & Destino"
},
"/relationship-status": {
"title": "So we can get to know you better, please tell us your relationship status",
"answer1": "Single",
"answer2": "In a relationship"
"title": "Para a conhecermos melhor, por favor indique o seu estado civil",
"answer1": "Solteira",
"answer2": "Num relacionamento"
},
"/element-resonates": {
"title": "Which element resonates with you most?",
"answer1": "Water",
"answer2": "Fire",
"answer3": "Air",
"answer4": "Earth"
"title": "Com qual elemento se identifica mais?",
"answer1": "Água",
"answer2": "Fogo",
"answer3": "Ar",
"answer4": "Terra"
},
"/favorite-color": {
"title": "Which color do you like the most?",
"answer1": "Blue",
"answer2": "Green",
"answer3": "Orange",
"answer4": "Violet",
"answer5": "Red",
"answer6": "Yellow"
"title": "Qual a cor que mais lhe agrada?",
"answer1": "Azul",
"answer2": "Verde",
"answer3": "Laranja",
"answer4": "Violeta",
"answer5": "Vermelho",
"answer6": "Amarelo"
},
"/head-or-heart": {
"title": "Do you make decisions with your head or your heart?",
"answer1": "Heart",
"answer2": "Head",
"answer3": "Both"
"title": "Toma decisões com a cabeça ou com o coração?",
"answer1": "Coração",
"answer2": "Cabeça",
"answer3": "Ambos"
},
"/relate-following": {
"title": "Do you relate to the following:",
"question1": "I find solace and comfort in spending time alone.",
"question2": "I value and enjoy my own company.",
"question3": "I prefer socializing in groups rather than spending time alone.",
"question4": "Loneliness is something I actively try to avoid.",
"question5": "I enjoy activities that I can do independently.",
"strongly_agree": "Strongly Agree",
"strongly_disagree": "Strongly Disagree"
"title": "Identifica-se com o seguinte:",
"question1": "Encontro consolo e conforto em passar tempo sozinha.",
"question2": "Valorizo e gosto da minha própria companhia.",
"question3": "Prefiro socializar em grupo do que passar tempo sozinha.",
"question4": "A solidão é algo que evito ativamente.",
"question5": "Gosto de atividades que posso fazer de forma independente.",
"strongly_agree": "Concordo Plenamente",
"strongly_disagree": "Discordo Plenamente"
},
"/let-scan": {
"title": "Let`s scan your palms",
"text": "Follow the on-screen instructions, so we can analyze your palm lines and reveal your future, and the secrets of your destiny!"
"title": "Vamos digitalizar as suas palmas",
"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": {
"title": "Take your palm picture as instructed",
"button": "Take a picture now"
"title": "Tire a foto da sua palma conforme instruído",
"button": "Tirar foto agora"
},
"/email": {
"title": "Enter your email to get your advanced Palmistry reading with AURA",
"not_share": "We dont share any personal information.",
"placeholder_email": "O teu email",
"placeholder_name": "O teu nome"
"title": "Introduza o seu email para obter a sua leitura avançada de Quiromancia com a AURA",
"not_share": "Não partilhamos qualquer informação pessoal.",
"placeholder_email": "O seu email",
"placeholder_name": "O seu nome"
},
"went_wrong": "Something went wrong.",
"app_number_one": {
"text": "The <color> app trusted by over 25 million people.",
"color": "#1 Astrology"
"text": "A app de <color> confiada por mais de 25 milhões de pessoas.",
"color": "#1 Astrologia"
},
"/trial-payment": {
"palm_is_ready": {
"title": "Your Palm Reading <color>",
"title_color": "Is Ready",
"description": "“Ive just received your palm scan results. Lets discuss!”",
"text1": "<color> 6 years in palmistry readings and spiritual guidance.",
"title": "A sua Leitura de Palma <color>",
"title_color": "Está Pronta",
"description": "“Acabei de receber os resultados da sua digitalização. Vamos discutir!”",
"text1": "<color> 6 anos em leituras de quiromancia e orientação espiritual.",
"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": {
"text1": "Unlimited chats with a palm reader",
"text2": "<count> people joined today"
"text1": "Conversas ilimitadas com um leitor de palmas",
"text2": "<count> pessoas juntaram-se hoje"
},
"get_personal_prediction": "Get personal prediction",
"get_personal_prediction": "Obter previsão pessoal",
"how_work": {
"title": "How does AURA work?",
"point1_title": "Send us your palm scan",
"point1_text": "We analyze your palm lines to get hints about your future",
"point2_title": "Your palm reading is generated",
"point2_text": "One of our professional palm readers puts together a report filled with hints about your future",
"point3_title": "Start your trial to receive your prediction",
"point3_text": "Once youre a AURA member, well send over your prediction report so you can begin living a better life.",
"point4_title": "Talk with a palm reading specialist anytime",
"point4_text": "Get ongoing support by discussing your readings, personal horoscopes, and compatibilities with our expert team."
"title": "Como funciona a AURA?",
"point1_title": "Envie-nos a sua digitalização da palma",
"point1_text": "Analisamos as suas linhas da palma para obter dicas sobre o seu futuro",
"point2_title": "A sua leitura de palma é gerada",
"point2_text": "Um dos nossos leitores de palmas profissionais elabora um relatório cheio de dicas sobre o seu futuro",
"point3_title": "Inicie o seu teste para receber a sua previsão",
"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": "Converse com um especialista em leitura de palmas a qualquer momento",
"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": {
"title": "100% Money-back Guarantee",
"text": "If you dont notice any progress after using the app for at least a week, we are ready to make a complete refund within 14 days."
"title": "Garantia de Reembolso de 100%",
"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": {
"title": "Whats included?",
"point1": "<bold> palm readings",
"point1_bold": "Unlimited",
"point2": "<bold> with professional astrologers",
"point2_bold": "1:1 live chats",
"point3": "<bold> readings",
"point3_bold": "Daily compatibility",
"point4": "Cosmic relationship tips",
"point5": "Daily horoscopes"
"title": "O que está incluído?",
"point1": "<bold> leituras de palmas",
"point1_bold": "Ilimitadas",
"point2": "<bold> com astrólogos profissionais",
"point2_bold": "Conversas ao vivo 1:1",
"point3": "<bold> leituras",
"point3_bold": "Compatibilidade diária",
"point4": "Dicas cósmicas para relacionamentos",
"point5": "Horóscopos diários"
},
"palms_say_about": {
"title": "What do your palms say about you?",
"point1": "<color> shows your attitude to love and the quality of love",
"point1_color": "Love line",
"point2": "A long thumb indicates good fortune",
"point3": "<color> reflects your in telligence and mentality",
"point3_color": "Head line",
"point4": "A long index finger indicates a natural leader",
"point5": "<color> defines the quality of your life and what you will achieve",
"point5_color": "Life line",
"point6": "A short middle finger reveals a free spirit",
"point7": "<color> represents your material achievement and career goals",
"point7_color": "Fate line",
"point8": "A long ring finger reveals that a person tends to take risks",
"point9": "A short little finger indicates the person's lack of self-confidence"
"title": "O que dizem as suas palmas sobre si?",
"point1": "<color> mostra a sua atitude em relação ao amor e a qualidade do amor",
"point1_color": "Linha do amor",
"point2": "Um polegar longo indica boa sorte",
"point3": "<color> reflete a sua inteligência e mentalidade",
"point3_color": "Linha da cabeça",
"point4": "Um dedo indicador longo indica um líder nato",
"point5": "<color> define a qualidade da sua vida e o que irá alcançar",
"point5_color": "Linha da vida",
"point6": "Um dedo médio curto revela um espírito livre",
"point7": "<color> representa a sua realização material e objetivos de carreira",
"point7_color": "Linha do destino",
"point8": "Um dedo anelar longo revela que uma pessoa tende a correr riscos",
"point9": "Um dedo mindinho curto indica falta de autoconfiança da pessoa"
},
"discover_more": "Discover More",
"why_love": "Why does everyone <color> ?",
"why_love_color": "love AURA",
"discover_more": "Descubra Mais",
"why_love": "Por que todos <color> ?",
"why_love_color": "adoram a AURA",
"reviews": {
"username1": "Rebecca Bauman",
"tagline1": "\"Its changed my life!\"",
"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!",
"tagline1": "\"Mudou a minha vida!\"",
"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",
"tagline2": "\"After years of seeking, Ive finally found a true love.\"",
"text2": "I was hesitant about whether it was really worth trying, but now I have no regrets and I'm enjoying my new relationships!",
"tagline2": "\"Após anos à procura, finalmente encontrei um verdadeiro amor.\"",
"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",
"tagline3": "\"Ive found a job I really enjoy.\"",
"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!"
"tagline3": "\"Encontrei um emprego que realmente gosto.\"",
"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!",
"as_seen_in": "<color> As Seen in",
"success_story": "Torne-se uma História de Sucesso da AURA!",
"as_seen_in": "<color> Como visto em",
"footer": {
"text1": "Questions? Were here to help",
"text2": "Customer Support",
"text3": "Help Center"
"text1": "Questões? Estamos aqui para ajudar",
"text2": "Apoio ao Cliente",
"text3": "Centro de Ajuda"
}
},
"/payment": {
"will_be_charged_trial_info": "<trialPrice> for your <trialDuration>-day trial",
"will_be_charged_email_reminder": "email you a reminder",
"will_be_charged": "You will be charged only <trialInfo>. Then <fullPrice> <trialPrice> per week. Save <save> every week. Well <emailReminder> before your trial ends.",
"will_be_charged_trial_info": "<trialPrice> para o seu teste de <trialDuration> dias",
"will_be_charged_email_reminder": "enviamos-lhe um lembrete por email",
"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": {
"personalized_offer": "Personalized offer reserved",
"title": "Start your <trialDuration>-day trial",
"total_today": "Total today",
"personalized_offer": "Oferta personalizada reservada",
"title": "Inicie o seu teste de <trialDuration> dias",
"total_today": "Total hoje",
"code_applied_bold": "AURA24",
"code_applied": "Code <bold> applied!"
"code_applied": "Código <bold> aplicado!"
},
"guarantees": {
"no_commitment": "No commitment. Cancel anytime.",
"30_day_money_back": "30-Day Money-Back Guarantee"
"no_commitment": "Sem compromisso. Cancele a qualquer momento.",
"30_day_money_back": "Garantia de Reembolso de 30 Dias"
},
"get_personal_prediction": "Get personal prediction",
"total_due": "Total due today: <trialPrice>",
"app_number_one_color": "25 million people.",
"app_number_one": "The #1 Astrology app trusted by over <color>"
}
}
"get_personal_prediction": "Obter previsão pessoal",
"total_due": "Total devido hoje: <trialPrice>",
"app_number_one_color": "25 milhões de pessoas.",
"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"
}

View File

@ -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": {
"title": "Find your happiness with highly-personalized predictions.",
"point1": "rated by real users",
"point2": "93.4% Accuracy",
"point3": "20m users choice",
"point4": "4.8 satisfaction sco",
"text": "Understand your self and improve relationships with astrology"
"title": "Encontre a sua felicidade com previsões altamente personalizadas.",
"point1": "avaliado por utilizadores reais",
"point2": "93,4% de precisão",
"point3": "Escolha de 20 milhões de utilizadores",
"point4": "4,8 de satisfação",
"text": "Compreenda-se a si mesmo e melhore as suas relações com a astrologia"
},
"/gender": {
"title": "Whats your gender?",
"description": "In Palmistry, everyone is a blend of masculine and feminine, so it helps to know yours."
"title": "Qual é o seu género?",
"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": {
"title": "Whats your date of birth?",
"text": "Your birth date reveals your core personality traits, needs and desires."
"title": "Qual é a sua data de nascimento?",
"text": "A sua data de nascimento revela os seus traços principais de personalidade, necessidades e desejos."
},
"/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": {
"title": "What aspects of your life do you wish to gain insight into through palmistry?",
"answer1": "Love & Relationships",
"answer2": "Health & Vitality",
"answer3": "Career & Destiny"
"title": "Que aspetos da sua vida gostaria de compreender melhor através da quiromancia?",
"answer1": "Amor e Relações",
"answer2": "Saúde e Vitalidade",
"answer3": "Carreira e Destino"
},
"/relationship-status": {
"title": "So we can get to know you better, please tell us your relationship status",
"answer1": "Single",
"answer2": "In a relationship"
"title": "Para o conhecermos melhor, diga-nos o seu estado civil",
"answer1": "Solteiro",
"answer2": "Numa relação"
},
"/element-resonates": {
"title": "Which element resonates with you most?",
"answer1": "Water",
"answer2": "Fire",
"answer3": "Air",
"answer4": "Earth"
"title": "Com qual elemento se identifica mais?",
"answer1": "Água",
"answer2": "Fogo",
"answer3": "Ar",
"answer4": "Terra"
},
"/favorite-color": {
"title": "Which color do you like the most?",
"answer1": "Blue",
"answer2": "Green",
"answer3": "Orange",
"answer4": "Violet",
"answer5": "Red",
"answer6": "Yellow"
"title": "Qual é a sua cor favorita?",
"answer1": "Azul",
"answer2": "Verde",
"answer3": "Laranja",
"answer4": "Violeta",
"answer5": "Vermelho",
"answer6": "Amarelo"
},
"/head-or-heart": {
"title": "Do you make decisions with your head or your heart?",
"answer1": "Heart",
"answer2": "Head",
"answer3": "Both"
"title": "Toma decisões com a cabeça ou o coração?",
"answer1": "Coração",
"answer2": "Cabeça",
"answer3": "Ambos"
},
"/relate-following": {
"title": "Do you relate to the following:",
"question1": "I find solace and comfort in spending time alone.",
"question2": "I value and enjoy my own company.",
"question3": "I prefer socializing in groups rather than spending time alone.",
"question4": "Loneliness is something I actively try to avoid.",
"question5": "I enjoy activities that I can do independently.",
"strongly_agree": "Strongly Agree",
"strongly_disagree": "Strongly Disagree"
"title": "Identifica-se com o seguinte:",
"question1": "Encontro consolo e conforto em passar tempo sozinho.",
"question2": "Valorizo e gosto da minha própria companhia.",
"question3": "Prefiro socializar em grupo do que passar tempo sozinho.",
"question4": "A solidão é algo que evito ativamente.",
"question5": "Gosto de atividades que posso fazer de forma independente.",
"strongly_agree": "Concordo plenamente",
"strongly_disagree": "Discordo plenamente"
},
"/let-scan": {
"title": "Let`s scan your palms",
"text": "Follow the on-screen instructions, so we can analyze your palm lines and reveal your future, and the secrets of your destiny!"
"title": "Vamos digitalizar as suas palmas",
"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": {
"title": "Take your palm picture as instructed",
"button": "Take a picture now"
"title": "Tire a fotografia da sua palma conforme instruído",
"button": "Tirar foto agora"
},
"/email": {
"title": "Enter your email to get your advanced Palmistry reading with AURA",
"not_share": "We dont share any personal information.",
"placeholder_email": "O teu email",
"placeholder_name": "O teu nome"
"title": "Insira o seu email para obter a sua leitura avançada de Quiromancia com a AURA",
"not_share": "Não partilhamos qualquer informação pessoal.",
"placeholder_email": "O seu email",
"placeholder_name": "O seu nome"
},
"went_wrong": "Something went wrong.",
"app_number_one": {
"text": "The <color> app trusted by over 25 million people.",
"color": "#1 Astrology"
"text": "A aplicação <color> confiada por mais de 25 milhões de pessoas.",
"color": "#1 Astrologia"
},
"/trial-payment": {
"palm_is_ready": {
"title": "Your Palm Reading <color>",
"title_color": "Is Ready",
"description": "“Ive just received your palm scan results. Lets discuss!”",
"text1": "<color> 6 years in palmistry readings and spiritual guidance.",
"title": "A Sua Leitura de Quiromancia <color>",
"title_color": "Está Pronta",
"description": "“Acabei de receber os resultados da sua digitalização da palma da mão. Vamos conversar!”",
"text1": "<color> 6 anos em leituras de quiromancia e orientação espiritual.",
"text1_color": "Akho",
"text2": "Choose from 80+ palm readers and astrologers."
"text2": "Escolha entre mais de 80 leitores palmares e astrólogos."
},
"joined_today": {
"text1": "Unlimited chats with a palm reader",
"text2": "<count> people joined today"
"text1": "Conversas ilimitadas com um leitor de quiromancia",
"text2": "<count> pessoas juntaram-se hoje"
},
"get_personal_prediction": "Get personal prediction",
"get_personal_prediction": "Obtenha uma previsão pessoal",
"how_work": {
"title": "How does AURA work?",
"point1_title": "Send us your palm scan",
"point1_text": "We analyze your palm lines to get hints about your future",
"point2_title": "Your palm reading is generated",
"point2_text": "One of our professional palm readers puts together a report filled with hints about your future",
"point3_title": "Start your trial to receive your prediction",
"point3_text": "Once youre a AURA member, well send over your prediction report so you can begin living a better life.",
"point4_title": "Talk with a palm reading specialist anytime",
"point4_text": "Get ongoing support by discussing your readings, personal horoscopes, and compatibilities with our expert team."
"title": "Como funciona a AURA?",
"point1_title": "Envie-nos a sua digitalização da palma",
"point1_text": "Analisamos as suas linhas palmares para obter pistas sobre o seu futuro",
"point2_title": "A sua leitura da palma é gerada",
"point2_text": "Um dos nossos leitores palmares profissionais prepara um relatório repleto de pistas sobre o seu futuro",
"point3_title": "Inicie o seu teste para receber a sua previsão",
"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": "Converse com um especialista em leitura de quiromancia a qualquer momento",
"point4_text": "Obtenha apoio contínuo discutindo as suas leituras, horóscopos pessoais e compatibilidades com a nossa equipa de especialistas."
},
"money_back_guarantee": {
"title": "100% Money-back Guarantee",
"text": "If you dont notice any progress after using the app for at least a week, we are ready to make a complete refund within 14 days."
"title": "Garantia de Devolução de 100%",
"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": {
"title": "Whats included?",
"point1": "<bold> palm readings",
"point1_bold": "Unlimited",
"point2": "<bold> with professional astrologers",
"point2_bold": "1:1 live chats",
"point3": "<bold> readings",
"point3_bold": "Daily compatibility",
"point4": "Cosmic relationship tips",
"point5": "Daily horoscopes"
"title": "O que está incluído?",
"point1": "<bold> leituras palmares",
"point1_bold": "Ilimitadas",
"point2": "<bold> com astrólogos profissionais",
"point2_bold": "Conversas ao vivo 1:1",
"point3": "<bold> leituras",
"point3_bold": "Compatibilidade diária",
"point4": "Dicas de relacionamento cósmico",
"point5": "Horóscopos diários"
},
"palms_say_about": {
"title": "What do your palms say about you?",
"point1": "<color> shows your attitude to love and the quality of love",
"point1_color": "Love line",
"point2": "A long thumb indicates good fortune",
"point3": "<color> reflects your in telligence and mentality",
"point3_color": "Head line",
"point4": "A long index finger indicates a natural leader",
"point5": "<color> defines the quality of your life and what you will achieve",
"point5_color": "Life line",
"point6": "A short middle finger reveals a free spirit",
"point7": "<color> represents your material achievement and career goals",
"point7_color": "Fate line",
"point8": "A long ring finger reveals that a person tends to take risks",
"point9": "A short little finger indicates the person's lack of self-confidence"
"title": "O que dizem as suas palmas sobre si?",
"point1": "<color> mostra a sua atitude em relação ao amor e a qualidade do amor",
"point1_color": "Linha do Amor",
"point2": "Um polegar longo indica boa fortuna",
"point3": "<color> reflete a sua inteligência e mentalidade",
"point3_color": "Linha da Cabeça",
"point4": "Um dedo indicador longo indica um líder natural",
"point5": "<color> define a qualidade da sua vida e o que você alcançará",
"point5_color": "Linha da Vida",
"point6": "Um dedo médio curto revela um espírito livre",
"point7": "<color> representa a sua realização material e objetivos de carreira",
"point7_color": "Linha do Destino",
"point8": "Um dedo anelar longo revela que a pessoa tende a correr riscos",
"point9": "Um dedo mínimo curto indica a falta de autoconfiança da pessoa"
},
"discover_more": "Discover More",
"why_love": "Why does everyone <color> ?",
"why_love_color": "love AURA",
"discover_more": "Descubra Mais",
"why_love": "Por que todos <color> ?",
"why_love_color": "adoram a AURA",
"reviews": {
"username1": "Rebecca Bauman",
"tagline1": "\"Its changed my life!\"",
"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!",
"tagline1": "\"Mudou a minha vida!\"",
"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",
"tagline2": "\"After years of seeking, Ive finally found a true love.\"",
"text2": "I was hesitant about whether it was really worth trying, but now I have no regrets and I'm enjoying my new relationships!",
"tagline2": "\"Após anos de procura, finalmente encontrei um verdadeiro amor.\"",
"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",
"tagline3": "\"Ive found a job I really enjoy.\"",
"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!"
"tagline3": "\"Encontrei um trabalho de que realmente gosto.\"",
"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!",
"as_seen_in": "<color> As Seen in",
"success_story": "Torne-se uma História de Sucesso da AURA!",
"as_seen_in": "<color> Como Visto em",
"footer": {
"text1": "Questions? Were here to help",
"text2": "Customer Support",
"text3": "Help Center"
"text1": "Tem perguntas? Estamos aqui para ajudar",
"text2": "Apoio ao Cliente",
"text3": "Centro de Ajuda"
}
},
"/payment": {
"will_be_charged_trial_info": "<trialPrice> for your <trialDuration>-day trial",
"will_be_charged_email_reminder": "email you a reminder",
"will_be_charged": "You will be charged only <trialInfo>. Then <fullPrice> <trialPrice> per week. Save <save> every week. Well <emailReminder> before your trial ends.",
"will_be_charged_trial_info": "<trialPrice> pelo seu teste de <trialDuration> dias",
"will_be_charged_email_reminder": "enviar-lhe-emos um lembrete para o email",
"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": {
"personalized_offer": "Personalized offer reserved",
"title": "Start your <trialDuration>-day trial",
"total_today": "Total today",
"personalized_offer": "Oferta personalizada reservada",
"title": "Comece o seu teste de <trialDuration> dias",
"total_today": "Total hoje",
"code_applied_bold": "AURA24",
"code_applied": "Code <bold> applied!"
"code_applied": "Código <bold> aplicado!"
},
"guarantees": {
"no_commitment": "No commitment. Cancel anytime.",
"30_day_money_back": "30-Day Money-Back Guarantee"
"no_commitment": "Sem compromisso. Cancele a qualquer momento.",
"30_day_money_back": "Garantia de Devolução de Dinheiro em 30 dias"
},
"get_personal_prediction": "Get personal prediction",
"total_due": "Total due today: <trialPrice>",
"app_number_one_color": "25 million people.",
"app_number_one": "The #1 Astrology app trusted by over <color>"
}
}
"get_personal_prediction": "Obter previsão pessoal",
"total_due": "Total a pagar hoje: <trialPrice>",
"app_number_one_color": "25 milhões de pessoas.",
"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"
}

View File

@ -34,7 +34,10 @@ import {
Locale,
Session,
Login,
Password
Password,
ChatsCategories,
ChatMessages,
CreateChat
} from './resources'
const api = {
@ -96,7 +99,11 @@ const api = {
getLocale: createMethod<undefined, Locale.ResponseGet>(Locale.createRequest),
// Session
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

View 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) });
};

View 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() });
};

View 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) });
};

View File

@ -16,7 +16,8 @@ export enum EPlacementKeys {
"aura.placement.email.marketing" = "aura.placement.email.marketing",
"aura.placement.secret.discount" = "aura.placement.secret.discount",
"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 {
@ -53,9 +54,9 @@ export interface IPaywallProduct {
isFreeTrial: boolean;
isTrial: boolean;
price: number;
trialDuration: number;
trialPrice: number;
trialPriceId: string;
trialDuration: number | null;
trialPrice: number | null;
trialPriceId: string | null;
currency?: string;
}

View File

@ -137,7 +137,8 @@ export enum ESourceAuthorization {
"aura.chat" = "aura.chat",
"aura.moons" = "aura.moons",
"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 {

View File

@ -33,3 +33,6 @@ export * as Locale from "./Locale";
export * as Session from "./Session";
export * as Login from "./Login";
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

View File

@ -2,4 +2,5 @@
color: #d3d3d3;
margin-top: 30px;
font-size: 10px;
text-transform: uppercase;
}

View File

@ -12,10 +12,10 @@
box-shadow: 0 4px 4px rgba(0, 0, 0, 0.25);
border-radius: 16px;
&:hover {
transform: scale(1.03);
background-color: rgba(#8e8cf0, 0.2);
}
// &:hover {
// transform: scale(1.03);
// background-color: rgba(#8e8cf0, 0.2);
// }
&:active {
transform: scale(1.1);

View 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;

View 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);
}

View 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;

View File

@ -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;
}
}
}
}
}
}

View 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;

View 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;
}
}
}

View 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;

View File

@ -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;
}

View 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;

View File

@ -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;
}

View File

@ -18,7 +18,7 @@ function DrawerMenu({ open, toggleDrawer }: IDrawerMenuProps) {
onClose={toggleDrawer(false)}
>
<div className={styles.close}>
<span className={styles["close-wrapper"]}>
<span className={styles["close-wrapper"]} onClick={toggleDrawer(false)}>
<svg
aria-hidden="true"
width="16px"

View File

@ -7,6 +7,7 @@ import Burger from "../../ui/Burger";
interface IHeaderProps {
isBackButtonVisible?: boolean;
isBurgerVisible?: boolean;
isLogoVisible?: boolean;
className?: string;
classNameTitle?: string;
onBack?: () => void;
@ -17,6 +18,7 @@ function Header({
classNameTitle = "",
isBackButtonVisible = true,
isBurgerVisible = true,
isLogoVisible = true,
onBurger,
onBack,
}: IHeaderProps) {
@ -32,9 +34,11 @@ function Header({
onClick={handleBack}
/>
)}
<Title className={`${styles.title} ${classNameTitle}`} variant="h2">
AURA
</Title>
{isLogoVisible && (
<Title className={`${styles.title} ${classNameTitle}`} variant="h2">
AURA
</Title>
)}
{isBurgerVisible && (
<Burger onClick={onBurger} className={styles.burger} />
)}

View File

@ -5,6 +5,7 @@
flex-grow: 0;
flex-shrink: 0;
width: 100%;
min-height: 45px;
position: relative;
align-self: center;
padding: 17px 25px 0;

View File

@ -27,7 +27,11 @@ function InputAnswerModal({
aria-describedby="modal-modal-description"
>
<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"]}>
<svg
xmlns="http://www.w3.org/2000/svg"

View 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",
},
];

View 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"
},
]

View 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: `"Ive 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: `"Im 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: `"Ive 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: `"Im 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: `"Ive 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: `"Im 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: `"Ive 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: `"Im 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",
},
]
};

View 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",
},
]

View 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 well 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",
},
],
}

View File

@ -6,6 +6,8 @@ import Button from "../../ui/Button";
import AnimateMessages, {
IAnimateMessage,
} from "../../components/AnimateMessages";
import { useSelector } from "react-redux";
import { selectors } from "@/store";
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() {
const navigate = useNavigate();
const { gender } = useSelector(selectors.selectQuestionnaire);
const { whatEmotion } = useSelector(selectors.selectAnswers);
const handleNext = () => {
navigate(routes.client.chatsQuizWhatYouWant());
@ -49,10 +62,11 @@ function AnswerHub() {
Get answers to every question that bothers you
</Title>
<p className={styles.text}>
Our experts already helped <strong>10 million men</strong> with their
personal questions, and look forward to{" "}
Our experts already helped{" "}
<strong>10 million {gender === "female" ? "women" : "men"}</strong> with
their personal questions, and look forward to{" "}
<span className={styles.purple}>
guiding you towards confident choices
{currentDescription[whatEmotion] || currentDescription.default}
</span>
</p>
<Button classNameContainer={styles.button} onClick={handleNext}>

View File

@ -38,7 +38,7 @@ function Date() {
value={birthdate}
onValid={handleValid}
onInvalid={() => setIsDisabled(true)}
inputClassName="date-picker-input"
inputClassName={styles["date-picker-input"]}
/>
<Button

View File

@ -9,3 +9,8 @@
.title {
margin-top: 24px;
}
.date-picker-input > h3 {
margin-left: 0;
text-align: center;
}

View File

@ -1,9 +1,9 @@
import Answers from "@/components/ChatsPath/components/Answers";
import { IAnswer } from "../../../data";
import { useNavigate } from "react-router-dom";
import routes from "@/routes";
import styles from "./styles.module.scss";
import { useUpdateStep } from "@/components/ChatsPath/hooks/useUpdateStep";
import { goalAnswers } from "@/components/ChatsPath/data/goalAnswers";
function Goal() {
useUpdateStep(2);
@ -13,36 +13,12 @@ function Goal() {
navigate(routes.client.chatsGoalSetup());
};
const answers: IAnswer[] = [
{
id: 1,
value: "about_ex",
name: "💖 Find out about my ex",
questionId: "goal",
const answers = goalAnswers.map((answer) => {
return {
...answer,
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 (
<>

View File

@ -3,6 +3,7 @@ import { useUpdateStep } from "@/components/ChatsPath/hooks/useUpdateStep";
import routes from "@/routes";
import { IAnswer } from "@/components/ChatsPath/data";
import Answers from "@/components/ChatsPath/components/Answers";
import { missingInLifeAnswers } from "@/components/ChatsPath/data/missingInLifeAnswers";
function MissingInLife() {
useUpdateStep(9);
@ -12,50 +13,12 @@ function MissingInLife() {
navigate(routes.client.chatsRecognize());
};
const answers: IAnswer[] = [
{
id: 1,
value: "love_happiness",
name: "Love happiness",
questionId: "missingInLife",
const answers: IAnswer[] = missingInLifeAnswers.map((answer) => {
return {
...answer,
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 (
<>

View File

@ -29,8 +29,8 @@
line-height: 24px !important;
background-color: transparent !important;
background-clip: padding-box !important;
padding-left: 15px !important;
padding-right: 15px !important;
padding-left: 24px !important;
padding-right: 24px !important;
border: 1px solid var(--secondary-100) !important;
border-radius: 25px !important;
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out !important;

View File

@ -1,8 +1,8 @@
import Answers from "@/components/ChatsPath/components/Answers";
import { IAnswer } from "../../../data";
import { useNavigate } from "react-router-dom";
import routes from "@/routes";
import { useUpdateStep } from "@/components/ChatsPath/hooks/useUpdateStep";
import { whatEmotionAnswers } from "@/components/ChatsPath/data/whatEmotionAnswers";
function WhatEmotion() {
useUpdateStep(7);
@ -12,43 +12,12 @@ function WhatEmotion() {
navigate(routes.client.chatsAnswerHub());
};
const answers: IAnswer[] = [
{
id: 1,
value: "confused_about_choices",
name: "Confused about choices",
questionId: "whatEmotion",
const answers = whatEmotionAnswers.map((answer) => {
return {
...answer,
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 (
<>

View File

@ -5,13 +5,15 @@ import { IAnswer } from "@/components/ChatsPath/data";
import Answers from "@/components/ChatsPath/components/Answers";
import InputAnswerModal from "@/components/ChatsPath/components/InputAnswerModal";
import { useState } from "react";
import { useDispatch } from "react-redux";
import { actions } from "@/store";
import { useDispatch, useSelector } from "react-redux";
import { actions, selectors } from "@/store";
import { yourGoalAnswers } from "@/components/ChatsPath/data/yourGoalAnswers";
function YourGoal() {
useUpdateStep(10);
const navigate = useNavigate();
const dispatch = useDispatch();
const { goal } = useSelector(selectors.selectAnswers);
const [answer, setAnswer] = useState("");
@ -24,43 +26,12 @@ function YourGoal() {
navigate(routes.client.chatsQuizSomethingWorrying());
};
const answers: IAnswer[] = [
{
id: 1,
value: "back_together",
name: "Find out if well 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 answers: IAnswer[] = yourGoalAnswers[goal]?.map((answer) => {
return {
...answer,
onClick: answer.value === "other" ? handleOpen : handleNext,
};
});
const handleChangeAnswer = (event: React.ChangeEvent<HTMLInputElement>) => {
setAnswer(event.target.value);

View 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;

View 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%);
}

View 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;

View 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;
}
}

View 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;

View File

@ -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);
}
}
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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;

View File

@ -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;
}

View File

@ -0,0 +1,9 @@
import styles from "./styles.module.css"
function LoaderDots() {
return (
<div className={styles.container} />
)
}
export default LoaderDots

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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;
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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;

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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;

View File

@ -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;
}
}
}

View 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;

View 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%);
}

View File

@ -4,9 +4,21 @@ import { useNavigate } from "react-router-dom";
import routes from "@/routes";
import Button from "../../ui/Button";
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() {
const navigate = useNavigate();
const { whatEmotion, missingInLife, goal, yourGoal } = useSelector(
selectors.selectAnswers
);
const handleNext = () => {
navigate(routes.client.chatsQuizBelieveInSpirituality());
@ -43,16 +55,26 @@ function PreferencesIntro() {
<li className={styles.item}>
<p className={styles["trait-name"]}>You are</p>
<p className={styles["trait-value"]}>
<span>Confused about choices</span>
<span>
{whatEmotionAnswers.find(
(answer) => answer.value === whatEmotion
)?.name || "Unknown"}
</span>
</p>
</li>
<li className={styles.item}>
<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 className={styles.item}>
<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>
</ul>
</div>

View File

@ -1,9 +1,8 @@
.container {
max-width: 360px;
width: 100%;
padding-left: 16px;
padding-right: 16px;
padding-top: 16px;
padding: 16px;
padding-bottom: 96px;
margin: 0 auto;
text-align: left;
}
@ -50,7 +49,7 @@
position: fixed;
left: 50%;
transform: translateX(-50%);
bottom: calc(0dvh + 30px);
bottom: calc(0dvh + 16px);
& > button {
height: 50px;
font-weight: 600;

View File

@ -1,7 +1,7 @@
import Title from "@/components/Title";
import styles from "./styles.module.scss";
import { useNavigate } from "react-router-dom";
// import routes from "@/routes";
import routes from "@/routes";
import { useSelector } from "react-redux";
import { selectors } from "@/store";
import { CircularProgressbar } from "react-circular-progressbar";
@ -15,7 +15,7 @@ function Processing() {
const [loadingProgress, setLoadingProgress] = useState(0);
const handleNext = useCallback(() => {
// navigate(routes.client.home());
navigate(routes.client.chatsCategories());
}, [navigate]);
useEffect(() => {

View File

@ -9,10 +9,36 @@ import { useSelector } from "react-redux";
import { selectors } from "@/store";
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() {
const navigate = useNavigate();
const birthdate = useSelector(selectors.selectBirthdate);
const zodiac = getZodiacSignByDate(birthdate);
const { goal, relationshipStatus } = useSelector(selectors.selectAnswers);
const handleNext = () => {
navigate(routes.client.chatsQuizSatisfiedWithLife());
@ -49,24 +75,31 @@ function ProfileIntro() {
<li className={styles.item}>
<p className={styles["trait-name"]}>Zodiac sign</p>
<p className={styles["trait-value"]}>
<span>Capricorn</span>
<span>{zodiac}</span>
<ZodiacIconSVG zodiac={zodiac} />
</p>
</li>
<li className={styles.item}>
<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 className={styles.item}>
<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>
</ul>
</div>
<p className={styles.text}>
<strong>Exploring aspects of your life</strong> requires detailed
answers to personal questions, so the next section aims to understand
your goal better.
<strong>
{currentDescription[goal] || currentDescription.default}
</strong>{" "}
requires detailed answers to personal questions, so the next section
aims to understand your goal better.
</p>
<Button classNameContainer={styles.button} onClick={handleNext}>
Continue

View File

@ -46,11 +46,11 @@
}
.button {
position: sticky;
margin: 0;
position: fixed;
left: 50%;
transform: translateX(-50%);
bottom: calc(0dvh + 30px);
margin-top: 16px;
bottom: calc(0dvh + 16px);
& > button {
height: 50px;
font-weight: 600;

View File

@ -4,9 +4,20 @@ import { useNavigate } from "react-router-dom";
import routes from "@/routes";
import Button from "../../ui/Button";
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() {
const navigate = useNavigate();
const { goal } = useSelector(selectors.selectAnswers);
const handleNext = () => {
navigate(routes.client.chatsQuizYourGoal());
@ -30,7 +41,7 @@ function Recognize() {
<span className={styles["goal-text"]}>
<span>💖</span>
{/* // add goal */}
<span>You want to find out about your ex</span>
<span>{currentGoal[goal] || currentGoal.default}</span>
</span>
</div>
<p className={styles.text}>

View File

@ -6,53 +6,19 @@ import Button from "../../ui/Button";
import AppStoreReviews from "../../components/AppStoreReviews";
import Slider from "react-slick";
import { useRef, useState } from "react";
import { IReview } from "../../data";
import Review2 from "../../components/Review2";
const reviews: IReview[] = [
{
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: `"Ive 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: `"Im 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",
},
];
import { useSelector } from "react-redux";
import { selectors } from "@/store";
import { reviewsByGoal } from "../../data/reviews";
function Reviews() {
const navigate = useNavigate();
const slider = useRef<Slider>(null);
const goal = useSelector(selectors.selectAnswers)?.goal;
const [currentSlide, setCurrentSlide] = useState(0);
const reviews = reviewsByGoal[goal] || reviewsByGoal.about_ex;
const sliderSettings = {
dots: false,
infinite: false,
@ -120,8 +86,8 @@ function Reviews() {
</span>
</button>
</div>
<p className={styles.description}>Reviews are from the Aura app</p>
<div className={styles.footer}>
<p>Reviews are from the Aura app</p>
<Button classNameContainer={styles.button} onClick={handleNext}>
Continue
</Button>

View File

@ -49,20 +49,21 @@
}
.footer {
position: fixed;
position: sticky;
left: 0;
bottom: calc(0dvh + 30px);
display: flex;
flex-direction: column;
width: 100%;
margin-top: 48px;
}
& > p {
margin-bottom: 24px;
color: var(--typography-200-with-opacity-50);
text-align: center;
font-size: 14px;
line-height: 1.35;
}
.description {
margin-top: 16px;
color: var(--typography-200-with-opacity-50);
text-align: center;
font-size: 14px;
line-height: 1.35;
}
.carousel-buttons {

View 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;

View 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;
}
}
}

View File

@ -4,6 +4,7 @@ export interface IButtonProps {
children?: React.ReactNode;
classNameContainer?: string;
disabled?: boolean;
type?: "button" | "submit" | "reset";
onClick?: () => void;
}
@ -11,11 +12,12 @@ function Button({
children = "Get started",
classNameContainer = "",
disabled = false,
type = "button",
onClick,
}: IButtonProps) {
return (
<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>
</button>
</div>

View File

@ -27,7 +27,8 @@
transition: all 0.15s ease-in-out 0ms;
&:disabled {
opacity: 0.5;
opacity: 1;
filter: brightness(60%);
}
&:active {

View 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;

View 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;
}

View 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;

View 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;
}

View File

@ -5,7 +5,12 @@ import { useCallback, useEffect, useMemo, useState } from "react";
import { EPaymentMethod, paymentMethods } from "@/data/paymentMethods";
import { Elements } from "@stripe/react-stripe-js";
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 { selectors } from "@/store";
import Loader from "@/components/Loader";
@ -17,7 +22,7 @@ import ExpressCheckoutStripe from "@/components/PaymentPage/methods/ExpressCheck
import routes from "@/routes";
import { useNavigate } from "react-router-dom";
import { useTranslations } from "@/hooks/translations";
import { addCurrency, ELocalesPlacement } from "@/locales";
import { addCurrency, ELocalesPlacement, language } from "@/locales";
interface IPaymentModalProps {
activeProduct?: IPaywallProduct;
@ -176,7 +181,13 @@ function PaymentModal({
<div className={styles["payment-method-container"]}>
{stripePromise && clientSecret && (
<>
<Elements stripe={stripePromise} options={{ clientSecret }}>
<Elements
stripe={stripePromise}
options={{
clientSecret,
locale: language as StripeElementLocale | undefined,
}}
>
<ExpressCheckoutStripe
clientSecret={clientSecret}
returnUrl={returnUrl}
@ -191,7 +202,13 @@ function PaymentModal({
}
/>
</Elements>
<Elements stripe={stripePromise} options={{ clientSecret }}>
<Elements
stripe={stripePromise}
options={{
clientSecret,
locale: language as StripeElementLocale | undefined,
}}
>
<CheckoutForm
confirmType={paymentType}
subscriptionReceiptId={paymentIntentId}

View File

@ -1,11 +1,14 @@
import { Elements } from '@stripe/react-stripe-js';
import CheckoutForm, { TConfirmType } from '@/components/PaymentPage/methods/CheckoutForm';
import Modal from '@/components/Modal';
import { Stripe } from '@stripe/stripe-js';
import { Dispatch, SetStateAction } from 'react';
import styles from './styles.module.scss';
import { Elements } from "@stripe/react-stripe-js";
import CheckoutForm, {
TConfirmType,
} from "@/components/PaymentPage/methods/CheckoutForm";
import Modal from "@/components/Modal";
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 {
clientSecret?: string;
@ -29,8 +32,19 @@ export default function PaymentCardModal({
removeNoScroll,
}: IPaymentCardModalProps) {
return (
<Modal open={isOpen} onClose={() => setIsOpen(false)} removeNoScroll={removeNoScroll} containerClassName={styles["modal-container"]}>
<Elements stripe={stripePromise} options={{clientSecret}}>
<Modal
open={isOpen}
onClose={() => setIsOpen(false)}
removeNoScroll={removeNoScroll}
containerClassName={styles["modal-container"]}
>
<Elements
stripe={stripePromise}
options={{
clientSecret,
locale: language as StripeElementLocale | undefined,
}}
>
<CheckoutForm
confirmType={paymentType}
subscriptionReceiptId={paymentIntentId}
@ -38,5 +52,5 @@ export default function PaymentCardModal({
/>
</Elements>
</Modal>
)
}
);
}

View File

@ -14,7 +14,7 @@ import {
useRef,
useState,
} from "react";
import { loadStripe, Stripe } from "@stripe/stripe-js";
import { loadStripe, Stripe, StripeElementLocale } from "@stripe/stripe-js";
import { usePaywall } from "@/hooks/paywall/usePaywall";
import { useMakePayment } from "@/hooks/payment/useMakePayment";
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 CreditCardIcon from "@/components/PaymentModalNew/PaymentCardModal/CreditCardIcon";
import { useTranslations } from "@/hooks/translations";
import { addCurrency, ELocalesPlacement } from "@/locales";
import { addCurrency, ELocalesPlacement, language } from "@/locales";
import { selectors } from "@/store";
import { useSelector } from "react-redux";
@ -145,7 +145,7 @@ export default function PaymentModalNew({
"/payment.total_due",
{
trialPrice: addCurrency(
getFormattedPrice(activeProduct.trialPrice),
getFormattedPrice(activeProduct.trialPrice || 0),
currency
),
},
@ -164,7 +164,13 @@ export default function PaymentModalNew({
<div>Credit / Debit Card</div>
</div>
)}
<Elements stripe={stripePromise} options={{ clientSecret }}>
<Elements
stripe={stripePromise}
options={{
clientSecret,
locale: language as StripeElementLocale | undefined,
}}
>
<ExpressCheckoutStripe
clientSecret={clientSecret!}
returnUrl={returnUrl}

View File

@ -8,9 +8,22 @@ const isValidEmail = (email: string) => {
return re.test(String(email).toLowerCase().trim());
};
function EmailInput(props: FormField<string>): JSX.Element {
const { name, value, placeholder, inputClassName, onValid, onInvalid } =
props;
interface IEmailInputProps {
inputContainerClassName?: string;
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 handleChangeEmail = (event: React.ChangeEvent<HTMLInputElement>) => {
@ -32,7 +45,7 @@ function EmailInput(props: FormField<string>): JSX.Element {
}, [email, onInvalid, onValid]);
return (
<div className={styles["input-container"]}>
<div className={`${styles["input-container"]} ${inputContainerClassName}`}>
<input
className={inputClassName}
type="email"
@ -42,7 +55,11 @@ function EmailInput(props: FormField<string>): JSX.Element {
onChange={handleChangeEmail}
placeholder=" "
/>
<span className={styles["input__placeholder"]}>{placeholder}</span>
<span
className={`${styles["input__placeholder"]} ${placeholderClassName}`}
>
{placeholder}
</span>
</div>
);
}

View File

@ -35,8 +35,8 @@ function PaymentTable({
const getPrice = useCallback(
(product: IPaywallProduct) => {
if (product.trialPrice % 100 === 0) {
return addCurrency(product.trialPrice / 100, currency);
if ((product.trialPrice || 0) % 100 === 0) {
return addCurrency((product.trialPrice || 0) / 100, currency);
}
return addCurrency(
((product.trialPrice || 0) / 100).toFixed(2),

View File

@ -55,7 +55,7 @@ function MarketingTrialPayment() {
<div className={styles["total-today"]}>
<p className={styles.description}>Total today:</p>
<p className={styles.value}>
${(products[0]?.trialPrice / 100).toFixed(2) || 0}
${((products[0]?.trialPrice || 0) / 100).toFixed(2) || 0}
</p>
</div>
<div className={styles.line} />
@ -81,7 +81,7 @@ function MarketingTrialPayment() {
<p className={styles["text-description"]}>
You will be charged only{" "}
<b>
${(products[0]?.trialPrice / 100).toFixed(2) || 0} for your{" "}
${((products[0]?.trialPrice || 0) / 100).toFixed(2) || 0} for your{" "}
{activeProduct?.trialDuration}-day trial.
</b>{" "}
Subscription <b>renews automatically</b> until cancelled. You{" "}

Some files were not shown because too many files have changed in this diff Show More