From 61a63a91ee62a7ca62c5e0224e34247896b3369f Mon Sep 17 00:00:00 2001 From: Daniil Chemerkin Date: Tue, 25 Feb 2025 11:05:56 +0000 Subject: [PATCH] develop --- .../locales/compatibility-v2/en/male_en.json | 68 ++++-- .../locales/email-generator/en/female_en.json | 5 + .../locales/email-generator/en/male_en.json | 5 + public/locales/palmistry-v0/en/male_en.json | 3 +- public/locales/palmistry-v1/en/male_en.json | 168 +++++++++---- public/v1/palmistry/apple-icon.png | Bin 0 -> 4276 bytes public/v1/palmistry/copy-icon-white.png | Bin 0 -> 3232 bytes public/v1/palmistry/copy-icon.png | Bin 0 -> 2452 bytes public/v1/palmistry/download-app.png | Bin 0 -> 8477 bytes public/v1/palmistry/trial-choice/arrow.svg | 3 + public/v2/compatibility/apple-icon.png | Bin 0 -> 4276 bytes public/v2/compatibility/copy-icon-white.png | Bin 0 -> 3232 bytes public/v2/compatibility/copy-icon.png | Bin 0 -> 2452 bytes public/v2/compatibility/download-app.png | Bin 0 -> 8477 bytes public/v2/palmistry/apple-icon.png | Bin 0 -> 4276 bytes public/v2/palmistry/copy-icon-white.png | Bin 0 -> 3232 bytes public/v2/palmistry/copy-icon.png | Bin 0 -> 2452 bytes public/v2/palmistry/download-app.png | Bin 0 -> 8477 bytes src/api/api.ts | 1 + src/api/resources/User.ts | 9 + .../components/HowWork/index.tsx | 3 +- .../CompatibilityV2/pages/Email/index.tsx | 10 +- .../pages/FindHappiness/index.tsx | 8 +- .../CompatibilityV2/pages/Gender/index.tsx | 10 + .../pages/ScannedPhoto/index.tsx | 21 +- .../pages/TrialPayment/index.tsx | 2 + .../TryApp/components/CopyCode/index.tsx | 55 +++++ .../components/CopyCode/styles.module.scss | 40 ++++ .../TryApp/components/EnterCode/index.tsx | 20 ++ .../components/EnterCode/styles.module.scss | 14 ++ .../pages/TryApp/components/Header/index.tsx | 66 ++++++ .../components/Header/styles.module.scss | 100 ++++++++ .../TryApp/components/PalmPhoto/index.tsx | 187 +++++++++++++++ .../components/PalmPhoto/styles.module.scss | 31 +++ .../components/YourAccessCode/index.tsx | 54 +++++ .../YourAccessCode/styles.module.scss | 75 ++++++ .../CompatibilityV2/pages/TryApp/index.tsx | 118 +++++++++ .../pages/TryApp/styles.module.scss | 224 ++++++++++++++++++ .../components/EmailsList/index.tsx | 87 +++++++ .../components/EmailsList/styles.module.scss | 84 +++++++ .../PalmistryV1/pages/FindHappiness/index.tsx | 42 ++-- .../pages/GenderPalmistry/index.tsx | 10 + .../PalmistryV1/pages/ScannedPhoto/index.tsx | 34 ++- .../PalmistryV1/pages/TrialChoice/index.tsx | 19 +- .../pages/TrialChoice/v1/index.tsx | 130 ++++++++++ .../pages/TrialChoice/v1/styles.module.scss | 160 +++++++++++++ .../TryApp/components/CopyCode/index.tsx | 55 +++++ .../components/CopyCode/styles.module.scss | 40 ++++ .../TryApp/components/EnterCode/index.tsx | 20 ++ .../components/EnterCode/styles.module.scss | 14 ++ .../pages/TryApp/components/Header/index.tsx | 66 ++++++ .../components/Header/styles.module.scss | 100 ++++++++ .../TryApp/components/PalmPhoto/index.tsx | 187 +++++++++++++++ .../components/PalmPhoto/styles.module.scss | 31 +++ .../components/YourAccessCode/index.tsx | 54 +++++ .../YourAccessCode/styles.module.scss | 75 ++++++ .../PalmistryV1/pages/TryApp/index.tsx | 118 +++++++++ .../pages/TryApp/styles.module.scss | 224 ++++++++++++++++++ .../pages/GetInformationPartner/index.tsx | 8 +- .../pages/SkipTrial/index.tsx | 5 +- .../palm-camera-modal/palm-camera-modal.css | 2 +- .../palm-camera-modal/palm-camera-modal.tsx | 151 +----------- .../payment-screen/payment-screen.css | 20 +- .../payment-screen/payment-screen.tsx | 154 +++++++++--- .../palmistry/scanned-photo/scanned-photo.css | 37 +++ .../palmistry/scanned-photo/scanned-photo.tsx | 116 +++++++-- .../authentication/use-authentication.ts | 14 +- .../emailsGeneration/useEmailsGeneration.ts | 93 ++++++++ src/hooks/payment/nmi/usePayment.ts | 2 +- src/init.tsx | 2 - src/locales/index.ts | 1 + .../Compatibility/v2/Layout/index.tsx | 1 + .../Compatibility/v2/index.tsx | 5 + src/routerComponents/Palmistry/v1/index.tsx | 5 + src/routes.ts | 3 + src/services/data/index.tsx | 10 + src/services/metric/metricService.ts | 1 + src/services/random-value/emailGenerator.ts | 100 ++++++++ src/utils/Helmet/index.tsx | 2 +- 79 files changed, 3268 insertions(+), 314 deletions(-) create mode 100644 public/locales/email-generator/en/female_en.json create mode 100644 public/locales/email-generator/en/male_en.json create mode 100644 public/v1/palmistry/apple-icon.png create mode 100644 public/v1/palmistry/copy-icon-white.png create mode 100644 public/v1/palmistry/copy-icon.png create mode 100644 public/v1/palmistry/download-app.png create mode 100644 public/v1/palmistry/trial-choice/arrow.svg create mode 100644 public/v2/compatibility/apple-icon.png create mode 100644 public/v2/compatibility/copy-icon-white.png create mode 100644 public/v2/compatibility/copy-icon.png create mode 100644 public/v2/compatibility/download-app.png create mode 100644 public/v2/palmistry/apple-icon.png create mode 100644 public/v2/palmistry/copy-icon-white.png create mode 100644 public/v2/palmistry/copy-icon.png create mode 100644 public/v2/palmistry/download-app.png create mode 100644 src/components/CompatibilityV2/pages/TryApp/components/CopyCode/index.tsx create mode 100644 src/components/CompatibilityV2/pages/TryApp/components/CopyCode/styles.module.scss create mode 100644 src/components/CompatibilityV2/pages/TryApp/components/EnterCode/index.tsx create mode 100644 src/components/CompatibilityV2/pages/TryApp/components/EnterCode/styles.module.scss create mode 100644 src/components/CompatibilityV2/pages/TryApp/components/Header/index.tsx create mode 100644 src/components/CompatibilityV2/pages/TryApp/components/Header/styles.module.scss create mode 100644 src/components/CompatibilityV2/pages/TryApp/components/PalmPhoto/index.tsx create mode 100644 src/components/CompatibilityV2/pages/TryApp/components/PalmPhoto/styles.module.scss create mode 100644 src/components/CompatibilityV2/pages/TryApp/components/YourAccessCode/index.tsx create mode 100644 src/components/CompatibilityV2/pages/TryApp/components/YourAccessCode/styles.module.scss create mode 100644 src/components/CompatibilityV2/pages/TryApp/index.tsx create mode 100644 src/components/CompatibilityV2/pages/TryApp/styles.module.scss create mode 100644 src/components/PalmistryV1/components/EmailsList/index.tsx create mode 100644 src/components/PalmistryV1/components/EmailsList/styles.module.scss create mode 100644 src/components/PalmistryV1/pages/TrialChoice/v1/index.tsx create mode 100644 src/components/PalmistryV1/pages/TrialChoice/v1/styles.module.scss create mode 100644 src/components/PalmistryV1/pages/TryApp/components/CopyCode/index.tsx create mode 100644 src/components/PalmistryV1/pages/TryApp/components/CopyCode/styles.module.scss create mode 100644 src/components/PalmistryV1/pages/TryApp/components/EnterCode/index.tsx create mode 100644 src/components/PalmistryV1/pages/TryApp/components/EnterCode/styles.module.scss create mode 100644 src/components/PalmistryV1/pages/TryApp/components/Header/index.tsx create mode 100644 src/components/PalmistryV1/pages/TryApp/components/Header/styles.module.scss create mode 100644 src/components/PalmistryV1/pages/TryApp/components/PalmPhoto/index.tsx create mode 100644 src/components/PalmistryV1/pages/TryApp/components/PalmPhoto/styles.module.scss create mode 100644 src/components/PalmistryV1/pages/TryApp/components/YourAccessCode/index.tsx create mode 100644 src/components/PalmistryV1/pages/TryApp/components/YourAccessCode/styles.module.scss create mode 100644 src/components/PalmistryV1/pages/TryApp/index.tsx create mode 100644 src/components/PalmistryV1/pages/TryApp/styles.module.scss create mode 100644 src/hooks/emailsGeneration/useEmailsGeneration.ts create mode 100644 src/services/random-value/emailGenerator.ts diff --git a/public/locales/compatibility-v2/en/male_en.json b/public/locales/compatibility-v2/en/male_en.json index 795635a..931a5da 100644 --- a/public/locales/compatibility-v2/en/male_en.json +++ b/public/locales/compatibility-v2/en/male_en.json @@ -37,24 +37,24 @@ "description": "In palmistry, everyone has both masculine and feminine traits.

Let's determine yours for a more accurate palm reading.", "already_have_account": "Already have an account? Sign in", "v1": { - "title": "Тест на Совместимость
👩‍❤️‍👨 ", - "subtitle": "Все начинается с тебя!
Выбери свой пол 👇", + "title": "Compatibility Test
👩‍❤️‍👨", + "subtitle": "It all starts with you!
Select your gender 👇", "points": { - "point1": "тест займет не более 1 мин", - "point2": "ты получишь анализ совместимости связанный с линиям на твоей руке", - "point3": "100% достоверность данных", - "point4": "более 50 стр разбора" + "point1": "The test takes less than a minute.", + "point2": "You’ll receive an analysis of your compatibility based on the lines on your hand.", + "point3": "100% data accuracy.", + "point4": "Over 50 pages of analysis." } }, "v2": { - "title": "Тест на Совместимость", - "subtitle": "Все начинается с тебя! Выбери свой пол.", + "title": "Compatibility Test", + "subtitle": "It all starts with you! Choose your gender.", "points": { - "point1": "Тест займет не более 1 мин.", - "point2": "Ты получишь разбор совместимости по хиромантическому анализу линий на твоей руке.", - "point3": "Решишь проблемы в отношениях за месяц.", - "point4": "Сэкономите сотни долларов на ненадёжных прогнозах.", - "point5": "Получите персональный анализ." + "point1": "The test takes less than a minute.", + "point2": "You'll receive a compatibility analysis through palmistry based on the lines on your hand.", + "point3": "Resolve relationship issues in a month.", + "point4": "Save hundreds of dollars on unreliable forecasts.", + "point5": "Get a personalized analysis." } } }, @@ -447,7 +447,16 @@ "bad_photo": "Bad Photo!", "try_again": "Try Again", "do_better": "You Can Do Better", - "next": "Next" + "no_access_camera": "No Access to Camera", + "give_access": "Give Access", + "reload_page": "Please reload the page to continue.", + "reload_page_button": "Reload Page", + "next": "Next", + "modal": { + "title": "To scan your hand, access to the Camera is required.", + "cancel": "Cancel", + "allow": "Allow" + } }, "/depends": { "with-partner": { @@ -506,5 +515,36 @@ "capricorn": "Capricorn", "aquarius": "Aquarius", "pisces": "Pisces" + }, + "/try-app": { + "header": { + "title": "Your Personalized Offer Reserved", + "get-prediction-in-app": "Get prediction in
the App" + }, + "palm_lines": { + "head": "Head line ✅", + "heart": "Love line ✅", + "fate": "Fate line ✅", + "life": "Life line ✅" + }, + "reading_ready": { + "title": "Your Palm Reading is READY and available in the app for your iPhone!" + }, + "your_access_code": "Your Access Code", + "copy": "COPY", + "instruction_point_1": "1. Download App", + "instruction_point_2": "2. Enter Your Access Code", + "not_share_description": "Enter your access code in the app to access Your Personalized Reading. Do not share your code with anyone.", + "get_prediction_in_app": "Get personal prediction in the App", + "enter-code-title": "Enter Your Access Code:", + "code-copied": "Code copied", + "copy-code-title": "Click to copy code", + "how_work": { + "title": "How does AURA work?" + }, + "get-my-reading-in-app": "GET MY READING IN THE APP", + "why_love": "Why does everyone ?", + "why_love_color": "love AURA", + "as_seen_in": " As Seen in " } } \ No newline at end of file diff --git a/public/locales/email-generator/en/female_en.json b/public/locales/email-generator/en/female_en.json new file mode 100644 index 0000000..b4fe842 --- /dev/null +++ b/public/locales/email-generator/en/female_en.json @@ -0,0 +1,5 @@ +{ + "firstNames": "Carlos,Luis,Maria,Ana,Juan,Pedro,Jose", + "lastNames": "Gomez,Lopez,Martinez,Rodriguez,Fernandez,Perez", + "domains": "gmail.com,yahoo.com,outlook.com,hotmail.com" +} \ No newline at end of file diff --git a/public/locales/email-generator/en/male_en.json b/public/locales/email-generator/en/male_en.json new file mode 100644 index 0000000..b4fe842 --- /dev/null +++ b/public/locales/email-generator/en/male_en.json @@ -0,0 +1,5 @@ +{ + "firstNames": "Carlos,Luis,Maria,Ana,Juan,Pedro,Jose", + "lastNames": "Gomez,Lopez,Martinez,Rodriguez,Fernandez,Perez", + "domains": "gmail.com,yahoo.com,outlook.com,hotmail.com" +} \ No newline at end of file diff --git a/public/locales/palmistry-v0/en/male_en.json b/public/locales/palmistry-v0/en/male_en.json index 9fd5d85..f504734 100644 --- a/public/locales/palmistry-v0/en/male_en.json +++ b/public/locales/palmistry-v0/en/male_en.json @@ -287,7 +287,8 @@ "total_due": "Total due today: ", "app_number_one_color": "25 million", "app_number_one": "The #1 Astrology app trusted by over people.", - "payment_success": "Payment success" + "payment_success": "Payment success", + "payment_error": "Payment error" }, "/camera": { "bad_photo": "Bad photo!", diff --git a/public/locales/palmistry-v1/en/male_en.json b/public/locales/palmistry-v1/en/male_en.json index 7d09c4f..b090d66 100644 --- a/public/locales/palmistry-v1/en/male_en.json +++ b/public/locales/palmistry-v1/en/male_en.json @@ -4,31 +4,31 @@ "eula_link": "EULA", "privacy_notice": "Privacy Notice", "policy_here": "here", - "thumb": "Thumb finger", "index_finger": "Index finger", "middle_finger": "Middle finger", "ring_finger": "Ring finger", "pinky": "Little finger", - "/scanned-photo": { - "title": "We are putting together a comprehensive Palmistry Reading just for you!", - "text": "Wow, looks like there is a lot we can tell about your ambitious and strong self-confident future." + "title": "Your extended palmistry analysis is almost ready!", + "text": "Judging by the lines on your palm, you have an exciting future ahead. Let’s explore it in more detail!", + "palm_lines": { + "head": "Head line ✅", + "heart": "Love line ✅", + "fate": "Fate line ✅", + "life": "Life line ✅" + } }, - "aura_paywall_palmistry_main": { "text_0": "We've helped millions of people to reveal the destiny of their love life and what the future holds for them and their families.", "text_1": "It costs us $13.21 to compensate our AURA\nemployees for the trial, but please choose the\namount you are comfortable with." }, - "skip_trial": "Skip Trial", "add_consultant": "Add Consultant", "add_guides": "Add Guides", "access_product": "Access Product", - "thank_you": "Thank you!", "order_successful": "Your order was successful!", - "/skip-trial": { "title": "Not planning on looking back?", "price_per_week": " per week", @@ -45,7 +45,6 @@ "skip_trial": "Accept offer and skip trial" } }, - "/add-consultant": { "more_for_you": "More for you", "exclusive_offer": "Exclusive offer recommended for you to achieve your goals faster", @@ -62,59 +61,69 @@ "unlock_profound": "Unlock profound insights into your personality, relationships, career trajectory, and life's pivotal moments through astrology, empowering you to make informed decisions and achieve greater fulfillment.", "choose_from": "Choose from 80+ experts astrologers." }, - "/find-your-happiness": { - "title": "Find your happiness with highly-personalized predictions.", + "title": "Gain clarity and confidence in life", "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" + "text": "Use astrology and palmistry to strengthen yourself and your relationships", + "advantage1": "In-depth analysis: We scan the lines on your palm", + "advantage2": "Personal approach: Analysis of personal destiny and future", + "advantage3": "Quick results: No more than 5 minutes to complete" }, "/gender": { - "title": "What’s your gender?", - "description": "In Palmistry, everyone is a blend of masculine and feminine, so it helps to know yours.", + "title": "What is your gender?", + "description": "In palmistry, everyone has both masculine and feminine traits.

Let's clarify yours for a more accurate hand reading.", "already_have_account": "Already have an account? Sign in" }, "/birthdate": { - "title": "What’s your date of birth?", - "text": "Your birth date reveals your core personality traits, needs and desires." + "title": "When were you born?", + "text": "Your birth date reveals which strengths and values can help you move forward" }, "/palms-information": { - "title": "Your palms hold a wealth of information about your fate and personality." + "title": "Your palms carry a vast amount of information about your destiny and character" }, "/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 which areas of life do you seek deeper understanding?", + "answer1": "Love and relationships", + "answer2": "Health and energy", + "answer3": "Career and purpose", + "answer4": "Life transitions" }, "/relationship-status": { - "title": "So we can get to know you better, please tell us your relationship status", + "title": "To better understand your essence, please indicate your current relationship status", "answer1": "Single", - "answer2": "In a relationship" + "answer2": "In a relationship", + "answer3": "Married", + "answer4": "Divorced", + "answer5": "It's complicated" }, "/element-resonates": { - "title": "Which element resonates with you most?", + "title": "Which element fills you with the greatest strength?", "answer1": "Water", "answer2": "Fire", "answer3": "Air", - "answer4": "Earth" + "answer4": "Earth", + "answer5": "Light", + "answer6": "Darkness" }, "/favorite-color": { - "title": "Which color do you like the most?", + "title": "Which color best represents your character?", "answer1": "Blue", "answer2": "Green", "answer3": "Orange", "answer4": "Violet", "answer5": "Red", - "answer6": "Yellow" + "answer6": "Yellow", + "answer7": "Turquoise" }, "/head-or-heart": { - "title": "Do you make decisions with your head or your heart?", - "answer1": "Heart", - "answer2": "Head", - "answer3": "Both" + "title": "What guides you in life: the call of the heart or the voice of reason?", + "answer1": "I follow my heart", + "answer2": "I rely on reason", + "answer3": "I combine both approaches", + "answer4": "It depends on the situation" }, "/relate-following": { "title": "Do you relate to the following:", @@ -127,17 +136,17 @@ "strongly_disagree": "Strongly Disagree" }, "/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": "We are scanning your palm", + "text": "Follow the on-screen instructions so we can analyze the lines of your palm, revealing the future and the secrets of your destiny!" }, - "biometric_data": "No biometric data collected. All recognition process performs on your device.", + "biometric_data": "We do not collect biometric data. The entire recognition process happens on your device.", "/scan-instruction": { - "title": "Take your palm picture as instructed", - "button": "Take a picture now" + "title": "Photograph your palm as shown", + "button": "Take a photo now" }, "/email": { - "title": "Enter your email to get your advanced Palmistry reading with AURA", - "not_share": "We don’t share any personal information.", + "title": "Enter your email to receive an extended palmistry analysis with AURA", + "not_share": "We do not share your personal information with third parties.", "placeholder_email": "Your email", "placeholder_name": "Your name" }, @@ -146,6 +155,22 @@ "text": "The app trusted by over 25 million people.", "color": "#1 Astrology" }, + "/trial-choice": { + "v1": { + "paragraph1": "AURA is the only accurate app with reliable fate line analysis, verified by professionals and guaranteed to provide precise predictions.

AURA has already helped millions of people find happiness and discover the whole truth about their relationships.

Your fate analysis, which will completely change your life, is almost ready! Before we provide it to you, we would like to offer you the opportunity to choose the amount you consider reasonable to try AURA for 7 days and which you think is fair for the changes that will happen to you:", + "paragraph2": "A 7-day trial period costs us , but please choose the amount that suits you best.", + "points": { + "point1": "You will discover all the most intimate secrets that the stars have prepared for you and solve relationship issues within just one month;", + "point2": "You will once and for all put the finishing touches on unresolved issues and forget about problems that have been haunting you for years (if not decades);", + "point3": "You will save hundreds of dollars on fake and unprofessional astrological predictions and fortune tellers;", + "point4": "You will receive not only a personal analysis but also personalized daily horoscopes, learn who and how is draining your energy, and get other personalized readings." + }, + "emails_list": { + "title": "Сегодня купили ", + "description": "Сейчас покупают человек:" + } + } + }, "/trial-payment": { "palm_is_ready": { "title": "Your Palm Reading ", @@ -226,9 +251,9 @@ } }, "/payment": { - "will_be_charged_trial_info": " for your -day trial", + "will_be_charged": "You will be charged only . Save now. Then per week. We’ll before your trial ends.", "will_be_charged_email_reminder": "email you a reminder", - "will_be_charged": "You will be charged only . Then per week. Save every week. We’ll before your trial ends.", + "will_be_charged_trial_info": " for your -day trial", "payment_information": { "personalized_offer": "Personalized offer reserved", "title": "Start your -day trial", @@ -246,9 +271,62 @@ "app_number_one": "The #1 Astrology app trusted by over " }, "/camera": { - "bad_photo": "Bad photo!", - "try_again": "Try again", - "do_better": "You can do it better", - "next": "Next" + "bad_photo": "Bad Photo!", + "try_again": "Try Again", + "do_better": "You Can Do Better", + "no_access_camera": "No Access to Camera", + "give_access": "Give Access", + "reload_page": "Please reload the page to continue.", + "reload_page_button": "Reload Page", + "next": "Next", + "modal": { + "title": "To scan your hand, access to the Camera is required.", + "cancel": "Cancel", + "allow": "Allow" + } + }, + "/with-heart": { + "title": "Your choice is natural—based on our data, 51% of with the sign follow their heart. We'll take this into account in your lines!" + }, + "/with-head": { + "title": "Even among , not everything is decided by the heart—based on our data, 35% of of your sign make decisions guided by reason. We'll factor this into your analysis." + }, + "/both": { + "wonderful": "Wonderful!", + "title": "The facts speak for themselves! According to our data, only 15% of born under the sign follow both heart and mind equally. That's the secret to harmonious relationships, and we'll reflect this in your lines." + }, + "/depends": { + "title": "Based on our data, only 9% of born under the sign possess a clear logical clarity—a rare gift. We'll certainly take this trait into account in your lines." + }, + "/try-app": { + "header": { + "title": "Your Personalized Offer Reserved", + "get-prediction-in-app": "Get prediction in
the App" + }, + "palm_lines": { + "head": "Head line ✅", + "heart": "Love line ✅", + "fate": "Fate line ✅", + "life": "Life line ✅" + }, + "reading_ready": { + "title": "Your Palm Reading is READY and available in the app for your iPhone!" + }, + "your_access_code": "Your Access Code", + "copy": "COPY", + "instruction_point_1": "1. Download App", + "instruction_point_2": "2. Enter Your Access Code", + "not_share_description": "Enter your access code in the app to access Your Personalized Reading. Do not share your code with anyone.", + "get_prediction_in_app": "Get personal prediction in the App", + "enter-code-title": "Enter Your Access Code:", + "code-copied": "Code copied", + "copy-code-title": "Click to copy code", + "how_work": { + "title": "How does AURA work?" + }, + "get-my-reading-in-app": "GET MY READING IN THE APP", + "why_love": "Why does everyone ?", + "why_love_color": "love AURA", + "as_seen_in": " As Seen in " } -} +} \ No newline at end of file diff --git a/public/v1/palmistry/apple-icon.png b/public/v1/palmistry/apple-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..699c6064b2b7ea78f9ecf00500ea999b33de7108 GIT binary patch literal 4276 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 OBUoD;M^&16U-%EVJcp|Q literal 0 HcmV?d00001 diff --git a/public/v1/palmistry/copy-icon-white.png b/public/v1/palmistry/copy-icon-white.png new file mode 100644 index 0000000000000000000000000000000000000000..d3d49e14778f12c333efa4dfee28d0b5b90adcae GIT binary patch literal 3232 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 + + diff --git a/public/v2/compatibility/apple-icon.png b/public/v2/compatibility/apple-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..699c6064b2b7ea78f9ecf00500ea999b33de7108 GIT binary patch literal 4276 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 OBUoD;M^&16U-%EVJcp|Q literal 0 HcmV?d00001 diff --git a/public/v2/compatibility/copy-icon-white.png b/public/v2/compatibility/copy-icon-white.png new file mode 100644 index 0000000000000000000000000000000000000000..d3d49e14778f12c333efa4dfee28d0b5b90adcae GIT binary patch literal 3232 zcmaJ^2{e@J8z0xw#1L8riO*8Uk{L5&X~qm@8q270#aPp2mM;dgn3={}y5km!EKyPR z7D~#vDv7Q(HARJ7T5h&UbrnfeO8?PKckTb3^F7b|KIhrq_xJmrbG}_Z-X5Cj2I>$9 zM3dr4_EqTXb1zg)Ax{R?mME0I$Sp|Z$J;E5qYFR?k;P+x0EI)30DVC^D+R7=yN`Zcn)6?4T0cY;`wxDG$;ZXU<8{>Fdb{UXbP}d1k*r!sx6hj z7K~(jCJI2mL~j~1F`9{GnYuUw_;{Qm0S6S(fp|^~SBQ%zn10TSQ>^FANK@dmizu34 z`bSeiR3Bh1PXGc~1j>eKYl{XPu?QA}j$zR;4Exmp+7^vLqR>c`y$#A1XNSgN9Dy&7 zsiL5OwHfD2cK=dNu_Ks9ibQ-I5*Zg4hls-3k##VLNxKc}FVs z|GRQHU%iDQU+~X<|1+_WmcR#*zMzn|MZi>Gx7lp26d$)%0MbP~0gcCtnZHP%NS=r% zjO6hFv^~NBu%ObJZ0?-J@^c84ilcCaB084|Qpf~TMG^#?&BED{v5xL`Yu30qx{**Q zH+L+_j!1SOx+x6yB=J12F zp%#Tqq{ZJKEsn@s>aVx+woF!Wu1s5lD$%5A*M0P9ZJ;lS*+o2^W1+_UrI%q^7e~#k zBVSo&??6tMv`X%3FJZuUrE8lx*e+XA?e*&Yw!#g|f`&Q@#UmZB&Bu^09h0!al0qzI zq@(%-%}NUrvUzzC1VV&ptNcThC3knJ{3Z%`Z`oW>>s2W&_VwucIU`GE1@4dry(7I_ zADjkUl>_qC;OS1dzHUSodSgOxVbzC2)9~X=M9-&Acm3MX>d9kRG_!f4LePYU6OZp* zoIg|0%+3f+AU1}+Ga?>O)sm@zD%1`3z43B&IbG!jyeYG&VwB=XTY1~EGQRTpn0>~lhyb8 z?--7hd#h0PFN9s!Xa{AKOk!tiiSUBEu{A!-dZwwLf|r>8L@){K&r5=yLuaj^UGBZN z&f^G&^q^@&qY^Q1C`SHF?~TJ!hE(GTtnWiPIGKQ?j806&%klCYy$2z+lcI%>?^)FY z;)8eMxc5Y0Ong+@@S5NR*JlI4yw~!Vq@1@fALpr>=8(p$mO}=`q5K(fna7J{_${gT zWx)A#*OG&uWBYlt?CREwj%0&*cH^ZiJcA1ir!Qe zQp4J_usSZhzy(bv=`LAD9w?*lp0o|Zrce?)W>b1;#Cy+{nu)3bU2C-q$J4fE0ubnT z+y5!-lpqoa0R6Xc#XLVT?)2iA;d9BauO|hqvhSVFg*Qsf!|Mz!@`0(D0keW!L{Ov1 zQLF)Y^4;~yGc|4-K%lyeQ)g1{sPcx?!gGu|%O0M(Mbh$oCvE0O zsrFs1e6m%nl<$_~o?SH7tLn3iXn>EJWx-v8RjMnoN}oSMZI!43oQhIE?C(JQ3zd1K z=JmWoaBFl5WKHVd0sAlXKHL5ZD(hycj?3eH+&pVd{ZXb0``YpJ(y^+aD@&ia!?TMD zpo6#3*$xJ-F6~*Vgs5#q?UZE+-G{tf+EtU39_FOmU$k~HO?N3x>OOQT=KGX(Lnqre z=|T0|iHZ0Y-+k^ieZh?xvqhF-;jlRS{8=4yXI?^grk`3T4>QC)lI`*6po0H!eAM%T zYFYW@qwYp;{hTV2_z+a*a+~ zQqTSHk0$c1;DI51imoWIHnw%eHJy?NZ`U; zvSZGT?p^xA`$qEnz=664tzjmfIA(7BB{S_Md$BSOn{(*d%Z_%xYn`wi!^ikO7nO*e za+G{kQMpgAX71j6Ue^aRsC3uw1y1apr0~VM9Ni%g_9qjSKEs2&E!EQ8qg5d-erlHW z(zi^g)PCB^!+Kq0#&PC(jco@p$P+HhQ6Hl+z zajidLofuS7eyFW}%pij&ug15y5@z~S>be@K^xn1DUsZ2Yr^KP`$(?H&%m^&##K9IUt+f*#id=d^h}rpnC;D=UL@CG`&6T6iBquY zs^E0s)myv45hn}y-9SuRj|zSzBdhsNlC$Ir^QcFAgV&<>F-K>TFSNCMy0db+^IWI; z#CZ>@2Z-JuQb^a>?~u^lZoy=(eE0nBlV7Wy$7&k_b4s3|wghwtoxnJ8H%MGZdL~dMuxz*%mMT1ci>9?FaXGS{?pUm|o<_w>I&4z z+M>0wf*~$kz-5OE#n*k024q_XqzzqISq^i6gi*S>cLILI@Cg6G&7Lh%~`~Sg0z!ga`rxp(r&Fr3#|SrCJd5hN|F2K?o8E zAWczz1_@1?4;w)V4+IQBkRnnfH_n?k@2_|7-PyBe_H$--cjmk2%(?37d{P{y3is;-SpzpS_W^3t{Lgu(xh=#+d7)?wVG_r;>U&6 zYj2t5VS(+;(a`(SlU<>sHaKG>4NE|m(Q;2n4-|-vfj#O+yTgk_T#@tzRDmDX}DiH#CqelsNO-M3`G8sS~io>n|zb6^Oe- z+&F`4Kq}zOHXg3mAee^0M7@eK0LQyuvCL5$-u<3EKHT|!#}}xA$d7~d^C&fHFcvb zya8r#D5(BY9&$> z@@TW;W9*A6ovSLn=B>?NS$=rf!O)cy>pg%GFfXmUh#(q|G>qXD3q>96AGZ$)tZR7Z zLtAoUS3Kv10@k_b7}?i#q6?QGoK7Gp)f5|6AHd(Z82U9?C-bdK~t6gXUkIq~jXRRWt^J{FZ%9HTKApp($3 zjLBS#WX73|csZ7$n z0&XLT2>;ziMesnK)x8Bib<3e_ZzGnfap>qEi-!f<+bDLI8O#lpj9%3~%$y1jvgkXO zJ+rXqqH67Mw{MN!&CAKGS-T1`rX7J~Dx@YrS^9ayagN6z=?17pa9-3$ zoH{!V>w&RVfP+PE_2pi#T5blj(PI)B@Q{E$xN>l-V^Hy)Id6iw`AV9h9in~x5wwxvQ8cyr>PEu^*aPcA z>hNkP?Re*!dd^apHr+I;$5YejqZek7~tPczDb;mWCS@**7_;<~Fp@%_Sr4&!kcu z`$(@UwuQc$&oJgyutT;=x&7$X54VUvu@|%jvGMa@y7}a0#WYqV_(J-zZkbwtd%d$3 zw~s>hufZm2wEiPhC_;nv(d2K1`seb7A~wdiAL(su6ai?CmQDIA+VHGvbzX}hQa^ut+koh+nqHM_a%#?~IQ%mK-ct%oiL&!c zzosbg$*W-q%vPtuLW3+y`Dq}5x93>Jy0w5jDclvuK7ldC+zx@E0&a{F(M7x|^wRGn zh|Vf2zaa}FB7}EHKQ>R6ql%5RstM%d=GNy&)5{x_=O~dT!Bp8OJ-4a01%F@}zScZY zNyQv{0K9~+$-j017eU)y>C6?D6kb(y0$I!Br}H0Ut+AxKgZ>xJ|CB|LwwP3EXfnK2 zuI^Sj9n@Mt7p^i>t0Z+%#T+&~i3gYZZ>M;GIvh@0D>ag5NnyTvv*y4Q;MeD$7TG9; zmnR;i8^2h_fLk<9I}zk%?5!|Y3>h%r=w_PHzW7@8}YG;z~kW%7mUy|;w zDX|^+1OdY5+s)l8HeK59{vRE@ewj;Bc#ISfh7z(x=n0E`0|NFOh|}3 z+87zc5@}caVMa8I(S;2q)Cj+I-66M>j^rr7uD8m+w|&3Rmtt8%AjtlZovfdIZc+t4 z6eKliaoJ?!ifQV&pXPYOWBEew(BSaVndJH>=jG_I(+Y^!@}l}-UumkoG~w0X}%E972{tz9(_a{clTAkS8Mi1?4? zy5}u^YH^DHa*vYizy#y%^X=F6^mU}q=z8g>B0KJH7wml7pV!R7_H}44@16YU&tW{H zNcK1Ya)+)Fr~zyfihAY5tXBN+{>rg=O&;l~w^Q4_@StfS>#Mkwgar)VIU|V`Sjd^2 zbM4$UO=v3Rq|((BT~;(C+beJ^n%Te92+yZq#A#1*ac^GCfm}f98jc6d%RVean3vcX z#)s;t%BaMI&ZhMnPd?e~Tx5WgVU+R=HMI+tGm1J~; z_w(Wrl%rey(F9c6Xq?HS6nn5ZpEh&E@p>oN06W#N4r*NDM06y<67>U^``!dg)6>67 zAP563ZbxXWLM32oT0PdMK3*|#rEm{*?2LUYqA+=h@C|cqvS&t`ojlExde4k{N^Gg# zH*UGEAWir(7RL5T)IZ}=B(_a5Fm1bnBt*IV+dAUtf--vxIKRw0JvOSQF@Ef|OU#py z5w!nsB-;ZoPM21HWw#)^bdq28`=1?-KJ@c}r@)0;Q9zmjp4yGqL>a{Sjqcj3$|!+D rM2B)0HP5U*TE>e1uUolY9!VNP)005Q<0{{R3A47^=00051P)t-s0001| zr>CcCcB^h zn30i@kB^V1r>CcCcCcB{jnVFfHn3$LV00960{{jL6sHmujh=>~-8#p*P zpP!$Ul$4E)jgOCyHa0c|1qJ>6{rmg-nwpv!85!>G?)mxokdTmidU`cAHTU=T3JMA{ zGczqMEs~Owm6eqc5D@I_>^(g_^A{HvK>k1lFbgiId(!^8% z03QWOL_t(|+U(eEPufrv!0}cGqJ$Bnnfl_K3lX_i1o7EQoR67|OvkViN2Zy>iNiRT zY}riI%tTzA`_gL_D@J1sZ4r9-y(*WsA^CIfZ7P&-H9ha@XclcM5DgO5?)G@wTn^zb zhqI+q3+}Tkv5`}yh4*-!ce1-$I<(@7mGWeAu*Z4)`S6%?0Uo*mlzu3iB&Xw9 zZL+tOG=Cxbaw}(Gd+bR`6}y>q&(P-dRB82wR?+w8L;?aBVX5Q}54wvhysJxX{ugLq zRY_u%Af2k!JuX4zXi?Yp6Ci?7CY?`l?scfqogJdMN@8uVSIxE>YlazJDGa*Yw}8zdxcI>DF7{u zFex789zlH>_YH_)bU`x8-9oc37XxY-SrFUf?SkkFbOSkzD(Lk`c|AHUl%tcaPC7c( z>hB7~NOT1* zNv9VBYM>bj%u;R9A%}Q)dMkQOJ;|u-CDLJS;>Heg zIb*S2BjK~PwKb#2Y8y}#nQP6V_Nm6=FM!h^of<_=rBXG(j3uRhGx1U>e#qeZ=^OiE zGD~+!2VjSuQpsel>lF^rxZp@o$FS7Ug@waeiu4M#av0L-c1tDaRDEl@$M`|T6p-Ne zr9b4EZd%7WW}PjP4j#I6>v!DMQ}%nk{@{QIG&WPIrBUE?rtwfQc@_^lp-gqWYnysHwsmKA;q|-cZuh%^hW0H=uzu>ofElUe#_-*M! z4=0`NU_B$yD(Q@t7~hEUyMn%}78s}$?TF8`tosQuIHT!Dw44DkM^(-V)YytPN(a}_ zB??lb5@@QnkXk56EP0^Tu+xnk#kX{ubZ{-cMnU1b<`>LVHJ=_t&gIF?E)@$3lsp z^sza0%|DH2g0gJAO*-qOYD;EhIj{cxSv3F<_(XR%h@q4k(Kr}`>q5?w-@W9g9GS;CiLhGb|muuHoArdp~0x+*w z5ktLP;aiFcClCWj^z#vDk>)@pM|$PK&6#lDh}wgb|3#6G2g&gs7flHSaU+Kg9;u0cuGtkt4 z*m8*kO%X~bRue8sNJqD=`l6bnk~Pg+LUdovI1<2zw=%BB;L)UaX9(-aL|Z7mLejJ9 zwZn&KT`=}oH!r@kqBpH(_ayFaW1jrMxq|*Us7zB|OB#r&2}EU~UOLd2hd&VA!)hHw zlhlA}^&kO~Kz=V6UGNFzku@OJ+6?Ks05Fdu`oD9bFVxeaM*<-ov(Z{A{E+~-wo{CE z?@*KOpH{0`r;OOfcq^NNgFMwk-!9@a26`0V8t4H0_g|1ce=WJ2poP+lGU7O+f|Fh- zyMPm?U@r6lQKj0CYRx)!kiG|XDebd073`X z-c?Y~2`a$MEY0WCUNnsf=>UfG5>-aRT7x5Umx|V;TSvK|H462yINV6TLb^65m%j9# z&mId=aSGIQ5J6mKpdwN02+a%)N!%#ul^l3L>C!$LT%JNJrGF+{KK1&X3Im|QD6qDR zytJ=4U4>B6~}-UWr~}!!%0Qzx35fnmWpNo*VJy zhZ&W`GGd|2@T!G$-CgK_`2CR5qr0dRI)#=>UqNzME4%@Ln%}2uNoF>o?t($jfr35; zrb`?f)umhC0mnm5C+elEnffcDip6%GH^sx5D2PxO zo1}xrJQ8&*i)bCLMSAc(mBh!J61C@@gprzbsDC2I8~l@}sXqX5;71%A+~aH`hT>p2 z*Ml4MUlJIvK5V4N+*o6B6j~}>$|B0#bvGiOgFrp=a@yQ}RE}XLgb@dIopq|Ge9-(e z>C-jofh_U^fuJ<%L ziAAInBJ_Fk7D{=fkxAv0OD_oNl8~+$5q;~WbBxEZb&+reZHHVhy(!xprm_n4>po@f%4A~X}}T*UT)a2FuM z-Y(UC2GL!iItn)-oj+q9s5MOK(skH{$VUW!>t(3`AtD|0NY?{Yqh^jC6+UJ1*F}gyk?mY#o!a zS=@c!jC8S&`o&!FF~ssA6`bnQJAhc_(t)T@T_&Kd>S~Bfm!O_a{t-)SVA`dT`lz6% zceo|J1EEPj;|=bT-gSw%^ZT*%@Y4I*R~CvqvA0wdNhdWKL<`uF(O@8A9quwQyZxh z5q+#a(i^1fyj8Obz}?dM8_e1Ge=VJbXZotu)#zQjFT5HXo_=>a8czi7_x*H7Zzq`& zR)~-4Vn+EA7ZB}fBh_!`74IkzBj`<`^$q+|`Ucq&@4qg>s=V|%e@;r6YEkX_hBfJI zNJh+iBr1*WBDIXdbzE&o0jc(qDm2qr5r{h@-QXG3eq=wBE=^kzlP0YVo09$m>FjJ_ zIXUaMTHR$|`)H%p7e@mTx1z|hqFC1>BX1IaB)vSpxw-MtM;=hlctDVtq|0Qn&$$_- z!gB_K4HAMsW`L;JWh?GFe=U6hICK`E^=-xJncJhvA;!N18r|OGSuHJFb?MMYl^ASK z55Ej4mxz{`hQ%enR$tK>U!)-w$`s8-`e!>0_Uz;zkBwNqdH(QU z!^-QC&g=KuHQ`0h?n)SR*2c+(cHpu$A=HpQZAdqs$YHIGbUdyNDF-)Ppb_pILzT(n z9@O6yN~2{N2_@T?meJb>4c1HJb}`ai7=(0E`pJ-vjnbv`E?=ap8`2X$5X(Y3Bzj(> zhIjw{-%amlSvxjD!Mu}p&h&2jKFN4Hvl|X*p0&-zR~H=}9WUpPJZ89ot1^^L?(f)~ zP|sD)b|Q>**=!3&FDG3IJ?2fD?TcQ!QH2_TgMsnL_|A#bh#Xew-rt|dRl$>+-wf3B zRHuEB{cq_*=*#6c0?>%L_-Z_|zq8?FAaHEX&wpRjx>x3Nxm%2}SbrwDH53J6bzy$K zA~xRX{QT*f-pI4i?eqCM7Apz%+tU00Tsqqb;azwwZi^l7M)CdT{*(x~gVz7o7dEvv z#cozjIgF=UxrbVs`v??Lwe^;66q5%-Yp zTDIf8$jrbK&G2}nvsW_S6Q3EL_%)A5x-{>_`y%JyiC^=0q!%rCZ!&Rsq6r?0baNi> zi}&SIc5jNuB3)`%?(KZ#|MLUp9~plr-86V_=R;4w+hm<#9;=m%TILN}>w`@Zt13-aBfh&LEJ1C@v@rTynG znRlA)GT$tHSYJJLIwu&I%lq8>-etBGt3CQbFZ@L}zl8Mk8L@_Y3I3v=UqX5+LacF? zhQB-yD80|H^ci9e*ERg*8R<14oo%<;qyH}+>B_R6w1@p2Cn08}`*Oq@ePDr$Pe=lu z58uo4o)@-2;q60b&&O1Pf!~TZTgIhloWv6TIWSKqJB{SM@H{Y?oo=dl3s#X`covGSH5XA3i~mmdPB$Zc&P6QoJ`LuXB0s3I(0rK7xSgnp z{7z3k>NO#K$xbYh2lK3Nk{@hjpy@D25kg}k3cn9#qz`k%5-nh!Ye|-IT|u*9t_KK} zR#3q%!!L>%>7&FN?G}PAn=MW;&}34Z1mOn4@j^8}JwNc2_nbS5a)y$nd>MXG%t-Gh z*06zT65)El$Nc1py%T6IAF6`#@Yaow{f_4%x$<_NOh={0z30QZAV>1>i(*Fl3u28b zn5I(C?(WfV&$F_397N|+y^JJ}4{j|oAX3b_`FkE zX2J#p=WQT^VFAH=*8TsauUV9SZ~-O>P4i#i+vbZQ}2h57TOkGO~>>@#4Jem=WSg6}=y^+PkcvJ0o{|K8HyY`rop zJ?SUbIAp;TMLxSnQUDLSdkRlzxma9|vidf>@M*N-73|WNK$BTb>A0`N?Chtaj#9CX z%xuP^d@)q?o_J@Mea(};9wXM+H~~{!y7_@%6yS(&bis2_^749QWaN6T$OkvM7|6{> zBJ(15nvqobn|_5$G}o@+12@a-(x zvf;?a>0Z9Pm`sBlX0ZODxwiTou`(JT+BiLyZLogbovp>(?u~Gv_1=e zMKHyvxVUqIf$dhszm?d(q|OS!#i%?b*(U~N()kx30W#%%BE@Z^r=t5i ztQNaWBk3DNja?$0JzupGIj($CE}cBFe-3aNCOmWEyK@H|k>TvWXohrnO)SFoF=nzm z@9=J2a*t{II4Hn3h9Of`SGIfguULZF303)W)OaMm5uVzmN$I{$TGtp^@klCTColaL z*L-EtKWsVGUvCRFL;52}EHZEm#_1q+0xaGyrp{+ju!LvlII2X=-VOXP(B$xA<%`nJy5ebYHiNAWxkL!r4Mike-SVt9Lm=!Xh`)ycfi+(G)uc-)oms?}V%5^f++)Y83yZ$SfDwAlNDsw{WeROz zkS}~@8^WS4@&Sw~bH*g*l3=|>PFcOcQ`gs9zMno_60RAlYGE0zwd+7uWaUb^L zhU2RQ8KZ?H)Ivmpf$M~k#hDu+PheLiyPaoAI{vG*4+!b!Frx$0olR)zSThb^sI8i z$1|)9ZZ<(ZBa7Pw8qtLakz$|T_2`k#z9l?m7NmUi6I?J*mdn2lQnoPwK0u^Hn|Sm; zmkyI0`6<+fqsFp3Sy2rqb7`7%><2_x8{t`HDPp$_)2rC2v}m1 z@1o}Zd+G3*{2ZoOV`KMtNHT}x6E@dMl^$1q^K2M9m5N+?K{cbPVVk^xMtCmU_v}O@ z*99W$H0ijyN_h;&O$4X@mvZT~1a0tqrbvy`?(1)-*H7tGYJ+7Yl zXwnZsNkQ1BT>5L3(N(l?t{J(dxTLvHwEas<_hqsD?tp?e?52b@oE0(MQ`RHjZ|`1x z|FgS$b@lY`?#vJ_Y&StVi-EDo=Ca=Pgcu)~mfd$hSi&+4Bx%yO8lJ_wCX>$ffReA` z@~IY%+X**iEr%}MfnEBTs`F)VcVtU0y@Qbj`~i35R={D(Y=U$=%xIN<(8-E$xKak; zS)fU8Z8ZKTujJC-scVPcBfz0;@j2cZ?esny!6zf-WsX3X)PVzxrt@k zS-r)aCmI9?txBh#?%Sc~h(L{?Vhp$v z23)J5^xpSx(qG9se{GnOUAY$IHQCZXYf8s(yJAiXF{i=Ndp}BVey`pRI>6N|P4XT+ z()+{#leY9J{Wqx=llke5W_tJTi>s{)T5xw;TIt;(9BtVdq~ZYmypgx`W*uNPcq!T} zX7}*x)?q0xoVXB^R7)QQB{spOT>26yVDX2!k3a`3uBbULwMXx#jfOFv31P~n)zW=c zoXDktPIFp191jq);5w;ZjvBPybWRv&tEG20>W}t6%B8E4crlEfCh6AiGKFhPdI{iK+IXY0^$KZ~^a%#!q_C|;-iXqv7tvli zF%vm-MPUl1-)pbP9TJ{SWw~zMSjUPA>C`33U>8{CjaliquxXyVl>YtHaIsTmA?e01 zJ5foW&(Ifg$to+CKCMicTZAVIdhoC>_&1b)3wVKo2(Io<36O z+8{jJpxM$B2f|6;&n%tU;)qGAQT=;)z;IO>pN&1iDy5UGJTLUPgprg&I;r|VN=ewT z3+T{~*gk+j6s3o~v~GaJm#GcC_C{Me;D+{L_PP3WB$_unayPI;F9valQpb;-m|Ra( z(zy;6L{js@dZkAx-Bn^hq#|UmfCrQu&H0qh7yNi2r zK6r3BlEVS>A$pIdw5v;U&+rB}kDbR@XKisclN`~EG6(vjG^f6YEFoiqKbFe=1PY-Co#dO zfnqXcY`Kp>;f3tLJW5CWEra~4>!o>uw0P9gN$fNKEOOS{I-s#c{N;`i*VxzXFDDsC zD4Ou@Y)#{L$giX75p(GmCB$9r^|6CnRKdY8l5}_^wwb9XSmQ&&-s{VU8f-UXV*ihNfC)mey?I zhO3_%UaCyowOlrzkMH@30N3rI-BOc_x)Yl1qi4upw?k8@-Fn z1qtGQZ!5hUnLFwkKFrtbGOn?n zDi?Vi?S4YRUM+$i>EKzU&yn}vHL>$!Ve>d<$yn+`^YIQLuV%K>IpSdD%U$4*7;H1u7C{NmY+XoHCbHMI-P}oU_!C!#kic+p($2p8niiQ>7!l z?RWKXaKYN>z3L7rH*3?*`rGb1Tap1|tVD*MIBi&&%lrnBenuf3d^6u-_&@)Ut>S?O z(jl{O5afgn%Sjd*z?|$>Yfd*OWVB!;UK;cOh4l4mjN>=j4`0agV&!W@*clfbo4Qq| ziQULhoe`kIo~&de`!4Jl{IN*(_2n`&TRLhly`8AGv>wyju`jhUYP0n}cCla-*2BXz z+#p?lKh08(r~8tnhd?0E(l?jE&r_uXM32{OPaAHX7a8s1gl;AmUL3aATFQOfmGv|< z!k1hqx3t(^^;{N}Uol%*I}B8-frqt9f>rOq=lk&e?+3PV88XK`o!z#>?$?XgI~j~j zv!x@RU*dTt66pwoQPGf&+cD5I7?y3~-ssYQrw0=lk&b9f|I_IGEB()t{Ax}MPmM%N5R$LJA&(J?wk*CG17ieCQi zpCw`R|L<|(YP03I=et8~tTNrG=(XrXuiUk*u^x`p#uKKSxmNTnTt6_Rjcp-pG6K67 z3~8g`i3~{rKktj*!qH!tzocS}SPAed3~8b=BWRA8X@CYpns^o>V-h0;{H(-~7D`nr z#tcGYS%3qEbTGbA6n2~td8t1|=c_vU!t#u~&;w=~cwv>H$Xlz^)+f4TWq~hZ^~k$D zq{6lgA{og9aBpLUp$IEA&ZwX{gD6fi3;d<}u)|P9oo+1^DYa#D#ju6}cy0D(eXr@F zFq*FKyT0qT4w5|j0r^BO`ts(g1$md})Uqodb|$EKZJk-_q#F0OvrWCO+OOs|_a_ey ziyoyJOEp(wsRVG&p;nwmVHC;}KU1Ihje55c_3qQl1?mOKY2GC7IM(P81UL%k+Ur|1 zVCM%N@{tourqV+RK;cZ$er0F!xwt_-;S88D6jr=nnF9_%2RyLL^JsvL+%bvSck% zwhB@9Y`rBye2@2id%wRw-tX^R*E!EQ&vk$9`+lD1b1&CPus?o`hw}(06B84UwH3+% z7_q>8j{P9;yx=2y1QG@JfFwDLTEQ~}2&`eAQ#$i;9uRo3s@xkGVWJBoclV&J{h&6<|YNFw2syU88 zw2GkN93zf9`9}Er>SCeBMi7HAJwO2oN5??INCD&^y)Z-QpL+Fx_x))#DCAEOy1yax zFQ?ql_7HOl4F}PMAyj?gaCL~bE)45~(ZFIfd^A-c>Tq=pHH5kvLQ@q1*F&o7X=p?K zzMz0X8rDzG0cH8OIpE6>N}$uJdTMH+p`ox)4H$)nS3~IP>Z-xj)zsBh0SVQha55be zrb-Ty{;dIp3-YBAsdOTR4B6L+@u39M4WWRuf31Q<{YNc1=?{|Dq()Khi;T2i$-C{a3|7PT^FXngcF~5=`?2&dyJI-xO8PoQA{DDKsYvCE)i) z+7l>rN)UlUg{W)7v>*y-j4zSAKco031dZ0SCI`_mWM7;$$`A@Dff0#VJtRt3+Y+gR zw9vLNLm(_HbA$hq|6(=&Cw89@Br0GTg`*Ke za9B$kg#`I?)q2E#^F8@lGy@_ zOAA+3y3iFNVbjjj^&Y2>7MbIzL+=8I+&zSA^;|HzXM+jjU|0A1(p+Xkd7cMl^GrCA z%(}KZAV%!FJv>^B$e4b%`og#QBe%fXv$a3AqxQb&^Web*Ms+pf%le4dMq+aE86hz- zF$^A$haTeeVAqIXMU&#WYy5O| zbVkV^>Qv>7jCN0m^Uj54Rc7))F2K1xJUn^}3JNM#o3_a;w_p8uP3Jk>sR9CBJSE8V zhA!G(gud-!D|21HM|5p%s_odvw{PDX%L%tKL3BKDSZw4WA)!a0Xrz5T3)=oyQ(0Nr z9i;C|x5w0cN>ETxTc46b{(z}{HnSeK}i-&IZ&VZaM z%vDt-JZcH4l9-!vn~~9#0-(giL>l{TG`t{J6c;?XTg@lyLazGbI&fB zKucHjLs!PYt#W9_<;!d=8JvxkrNza?1Kr)-$#5G%f_FkG`&rm=2}#N33lFRXi;9Z; zmY0_|?k6%2?c5uYKan$LJK7$r{V_6#ISuJ*NcL=s)V=b;N0eU+0g;uRq0kqT{YNT) ziIu;+2~XfKnYTF2da^zV@IuYb&MyA&;m?;j+OI{B4xDU0_~wHX@&n^RJQxOp@k&ce z8~4e?ZYfNyt*u>bZ*O;Nl>kjrbt)&LFZs=9Y&Ec}DJX2Vc6Q=`r zV^J!?^<&L3%}wRy< zg8(Y3eh`n{r4R^&2OuU@cNu>6BN6A$ZLgyZoaV}(KQ|#$scVrGri|Y8>iYUnbqx*k zM+sBy?F=9B*zziXNj#?}$Df4yGtBZ!8XFtI0*T#oO}ID)BTUjDj4Dr)opeC)({UO@ zY#2UvrH-*eZB5_-4 zbVLyW5{+P5(w4|MC27|$)FlAqVut?>T#ifXA>e#cOC!wno7Yxt! zbaicBE>)6)&huI+>?T`qTbc4S?{0m$!Eo3@9MnA9*z#fR1Eu*@-fcth$>_jk`QzE6 z=y&Lu+1Y5D`F6FQS=qRk zn>SI?pKBarR}9M=9UYx1NtZ%?5@MCo)%_WD$8qe^rGrL_I}b)A`S_0N)tb-c)dbD; z5zM5G5P&@zQc+Pcp^@)_n5d|>rlvE$($_{sCnran?mF`L5mQ3D@+B*oMt}muyE^;rl#&JDUOh8a34EW;A5Ox=In@pm=&kxAl+2(Op8?N$dKIju4_x`&G z%aOK20twSA6VJ|FJ1LA^UmOB6Y_`UsN+vGr16^J5*>9ez$ji%XvF4r=78d@&aM>ad ziC`dR5197oTX&m5);6UPHzTs{Y&`U^3JLk4sN}PwVnra#vzW=}j3NvS#y}T53k(j& z?|$9b;FD<)=j-Y1t*Wc9-*6Ca@9XP(Gc=TDUebQ?)2B~mwU>Gg4GcU-1L_3x1-RtM zV~+j#l<>6D^Z^0xVz9#5rjbn8h&p|!c@SA`$e*VS=y#JyxDZPnp=(}&y} zRFEc;;^Irob8{kgPr0M>e)7r5$qA>Xrk@er{H|tkG*lY0pT4CGE^`E=^G&axI zl|+dzU6m?AnLVgiRa9)yTvk$MV`IAwlvj>G*h^T33rUVi>eF#g&#~|Ft*0MTrw-+# zt8OW%s2GSHIa2!5X@EyeOGRGX@b<0T8#jVBUBzzA%*|zlgoJ4ES5-BWg`I}(@sojT zTiG+97eLINOG``J zlXbakoNXMlt4z1-cGPaMv$eIAM=lf#3f$RE$;|vYR4a1#hT03CuSXw>@_bt<&C8oy z68tQc#WXD4-_xUKF(&-^mQM7}CPzgj>he?bnF*Ws>Orw?clOG_ZN>Tb?wLo-zRc{8 zPlIbexRsq9i7M7#T3#jrHS0xz>gQw5&OI>0!N4M zQ4S7{mnGuNb2&Ejt#zW#7+u zv|@tSBTqclB1;;|PCp5G=IZ9=7PpK>+u0?>nPI>S4g(YFP6k3EA~D_ZZ@i_9 zIOBX$URT^GJDaJ2?@M~pDq>^FZkYH$7=1QAn9(eMQ4~XRU3yJ=l;a#m>ejG4|sni>R*rhBcEUu^%~r(A3l{ ztE_}U6e}H00r44t!F*i`jR1O&dJ36bIe2+HVq)yxVtAfR$t+c;zrSN}VqyX&kbrt# zz;pua8xR>8NyTDON*TS|X-9-55y4hPi-spHXTE%~_1A`2W{Y3z4C?Fc)$g34nFk8F zFYX>by6EBM6;u55>5kmv%iC*>;I7TUfPesT^=uAvbMthd#y$c)2RdA7IDG9Pt0gu%+3_uJ+&*Q%U5?-Of@`Ho!5LsjQ@zHD!-eq32y zHFh0|O+cAxyyTNK+S%Rs7~{2z>>cPxEHd(lj*gZaJkq}xvP|e(JP%^4Gw)p~H!BXy_Os!osu9KOQMs9NyaAeqn8Gef!MgraP09-V(KURe*w1 zQ0S3QyoA zO3+C4ry*Cb88>(LyRZYb;JHyiWwVt`X+=rNq*nv2a2hDYX5wOk{#?_v*0wg#l<39T z{#?oV>FMtto8!vfXiM+Hd*kEd6)C2PlMOb_KWD}0gex}_<~DPgKumiwm=v}9Z`}9) OBUoD;M^&16U-%EVJcp|Q literal 0 HcmV?d00001 diff --git a/public/v2/palmistry/copy-icon-white.png b/public/v2/palmistry/copy-icon-white.png new file mode 100644 index 0000000000000000000000000000000000000000..d3d49e14778f12c333efa4dfee28d0b5b90adcae GIT binary patch literal 3232 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.createRequest), // New Authorization authorization: createMethod(User.createAuthorizeRequest), + authorizationAnonymous: createMethod, User.ICreateAuthorizeResponse>(User.createAuthorizeAnonymousRequest), login: createMethod(Login.createRequest), resetPassword: createMethod(Password.resetRequest), // Paywall diff --git a/src/api/resources/User.ts b/src/api/resources/User.ts index de5d50f..364b431 100644 --- a/src/api/resources/User.ts +++ b/src/api/resources/User.ts @@ -197,6 +197,15 @@ export const createAuthorizeRequest = (data: ICreateAuthorizePayload): Request = }); } +export const createAuthorizeAnonymousRequest = (data: Omit): Request => { + const body = JSON.stringify(data); + return new Request(routes.server.dApiAnonymousAuth(), { + method: "POST", + headers: getBaseHeaders(), + body, + }); +} + export interface IMeResponse { user: IUser; } diff --git a/src/components/CompatibilityV2/components/HowWork/index.tsx b/src/components/CompatibilityV2/components/HowWork/index.tsx index be7aa71..f6dc5e8 100644 --- a/src/components/CompatibilityV2/components/HowWork/index.tsx +++ b/src/components/CompatibilityV2/components/HowWork/index.tsx @@ -2,7 +2,6 @@ import Title from "@/components/Title"; import styles from "./styles.module.scss"; import { compatibilityV2Prefix } from "@/routes"; import { useMemo, useRef } from "react"; -import MoneyBackGuarantee from "../MoneyBackGuarantee"; import { useTranslations } from "@/hooks/translations"; import { ELocalesPlacement } from "@/locales"; @@ -70,7 +69,7 @@ function HowWork() { ))} - + {/* */} ); } diff --git a/src/components/CompatibilityV2/pages/Email/index.tsx b/src/components/CompatibilityV2/pages/Email/index.tsx index d92faad..37a82f0 100644 --- a/src/components/CompatibilityV2/pages/Email/index.tsx +++ b/src/components/CompatibilityV2/pages/Email/index.tsx @@ -2,8 +2,8 @@ import Title from "@/components/Title"; import styles from "./styles.module.scss"; import EmailInput from "@/components/pages/ABDesign/v1/pages/EmailEnterPage/EmailInput"; import { useCallback, useEffect, useState } from "react"; -import { useDispatch } from "react-redux"; -import { actions } from "@/store"; +import { useDispatch, useSelector } from "react-redux"; +import { actions, selectors } from "@/store"; import Button from "../../components/Button"; import { useAuthentication } from "@/hooks/authentication/use-authentication"; import { ESourceAuthorization } from "@/api/resources/User"; @@ -32,6 +32,7 @@ function Email() { const [isValidName, setIsValidName] = useState(true); const [isDisabled, setIsDisabled] = useState(true); const [isAuth, setIsAuth] = useState(false); + const authCode = useSelector(selectors.selectAuthCode); const { flags } = useMetricABFlags(); const auraVideoTrial = flags?.auraVideoTrial?.[0]; @@ -91,11 +92,14 @@ function Email() { }; const handleNext = useCallback(() => { + if (!!authCode?.length) { + return navigate(routes.client.compatibilityV2TryApp()); + } if (auraVideoTrial === "on") { return navigate(routes.client.compatibilityV2TrialChoiceVideo()); } return navigate(routes.client.compatibilityV2TrialChoice()); - }, [auraVideoTrial, navigate]); + }, [auraVideoTrial, authCode, navigate]); useEffect(() => { if (user && token?.length && !isLoading && !error) { diff --git a/src/components/CompatibilityV2/pages/FindHappiness/index.tsx b/src/components/CompatibilityV2/pages/FindHappiness/index.tsx index b4bea16..7aff42e 100644 --- a/src/components/CompatibilityV2/pages/FindHappiness/index.tsx +++ b/src/components/CompatibilityV2/pages/FindHappiness/index.tsx @@ -24,11 +24,9 @@ function FindHappiness() { routes.client.compatibilityV2Welcome(), "" ); - dispatch( - actions.userConfig.setFeature( - feature.includes("/v1/gender") ? "" : feature - ) - ); + if (!!feature?.length) { + dispatch(actions.userConfig.setFeature(feature)); + } }, [dispatch, location.pathname]); return ( diff --git a/src/components/CompatibilityV2/pages/Gender/index.tsx b/src/components/CompatibilityV2/pages/Gender/index.tsx index d3379b8..a5008ac 100644 --- a/src/components/CompatibilityV2/pages/Gender/index.tsx +++ b/src/components/CompatibilityV2/pages/Gender/index.tsx @@ -44,6 +44,16 @@ function GenderPage() { title: translate(gender.id, undefined, ELocalesPlacement.V1), })); + useEffect(() => { + const feature = location.pathname.replace( + routes.client.compatibilityV2Gender(), + "" + ); + if (!!feature?.length) { + dispatch(actions.userConfig.setFeature(feature)); + } + }, [dispatch, location.pathname]); + const selectGender = (_gender: Gender | null) => { dispatch(actions.privacyPolicy.updateChecked(true)); setIsSelected(true); diff --git a/src/components/CompatibilityV2/pages/ScannedPhoto/index.tsx b/src/components/CompatibilityV2/pages/ScannedPhoto/index.tsx index 1fbcfc9..4fab087 100644 --- a/src/components/CompatibilityV2/pages/ScannedPhoto/index.tsx +++ b/src/components/CompatibilityV2/pages/ScannedPhoto/index.tsx @@ -12,6 +12,8 @@ import { useTranslations } from "@/hooks/translations"; import { ELocalesPlacement } from "@/locales"; import ProgressBarLine from "@/components/ui/ProgressBarLine"; import Modal from "@/components/Modal"; +import { useAuthentication } from "@/hooks/authentication/use-authentication"; +import { ESourceAuthorization } from "@/api/resources/User"; const drawElementChangeDelay = 1500; const startDelay = 500; @@ -43,6 +45,12 @@ function ScannedPhoto() { const [isDecorationShown, setIsDecorationShown] = useState(true); const [classNameScannedPhoto, setClassNameScannedPhoto] = useState(""); + const feature = useSelector(selectors.selectFeature); + const isIOSPath = useMemo(() => feature?.toLowerCase()?.includes("ios"), [feature]); + const authCode = useSelector(selectors.selectAuthCode); + + const { authorization } = useAuthentication(); + const drawElements = useMemo(() => [...fingers, ...lines], [fingers, lines]); const { relationshipStatus } = useSelector(selectors.selectCompatibilityV2Answers) @@ -83,6 +91,14 @@ function ScannedPhoto() { ] }, []); + useEffect(() => { + if (isIOSPath) { + (async () => { + await authorization("", ESourceAuthorization["aura.compatibility.v2"], true); + })(); + } + }, [isIOSPath, authorization]) + useEffect(() => { if (!drawElements[currentElementIndex]) return; changeTitleTimeOut.current = setTimeout(() => { @@ -174,8 +190,11 @@ function ScannedPhoto() { ); const onEndLoading = useCallback(() => { + if (isIOSPath && !!authCode) { + return navigate(routes.client.compatibilityV2TryApp()); + } navigate(routes.client.compatibilityV2Email()); - }, []); + }, [isIOSPath, authCode, navigate]); useEffect(() => { if (progress === 75) { diff --git a/src/components/CompatibilityV2/pages/TrialPayment/index.tsx b/src/components/CompatibilityV2/pages/TrialPayment/index.tsx index 3f571bc..1ef00b2 100644 --- a/src/components/CompatibilityV2/pages/TrialPayment/index.tsx +++ b/src/components/CompatibilityV2/pages/TrialPayment/index.tsx @@ -23,6 +23,7 @@ import { useDynamicSize } from "@/hooks/useDynamicSize"; import { formatDateToLocale } from "@/locales/localFormats"; import { useEffect } from "react"; import metricService, { EGoals, EMetrics } from "@/services/metric/metricService"; +import MoneyBackGuarantee from "../../components/MoneyBackGuarantee"; function TrialPayment() { const { height, elementRef } = useDynamicSize({}); @@ -127,6 +128,7 @@ function TrialPayment() { {translate("/trial-payment.how_work.title")} + diff --git a/src/components/CompatibilityV2/pages/TryApp/components/CopyCode/index.tsx b/src/components/CompatibilityV2/pages/TryApp/components/CopyCode/index.tsx new file mode 100644 index 0000000..b1ef4d2 --- /dev/null +++ b/src/components/CompatibilityV2/pages/TryApp/components/CopyCode/index.tsx @@ -0,0 +1,55 @@ +import { useSelector } from "react-redux"; +import styles from "./styles.module.scss"; +import { selectors } from "@/store"; +import { images } from "@/components/CompatibilityV2/data"; +import { useEffect, useState } from "react"; +import { copyToClipboard } from "@/services/data"; +import Toast from "@/components/pages/ABDesign/v1/components/Toast"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; + +interface ICopyCodeProps { + variant?: "default" | "black"; +} + +function CopyCode({ + variant = "default" +}: ICopyCodeProps) { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV2); + const code = useSelector(selectors.selectAuthCode); + const [isCopied, setIsCopied] = useState(false); + + const handleCopy = async () => { + const isCopied = await copyToClipboard(code); + setIsCopied(isCopied); + }; + + useEffect(() => { + if (!isCopied) return; + + const timeout = setTimeout(() => { + setIsCopied(false); + }, 4000); + + return () => clearTimeout(timeout); + }, [isCopied]); + + return ( + <> +
+ {code} + {variant === "default" && Copy code} + {variant === "black" && Copy code} +
+ {isCopied && + {translate("/try-app.code-copied")} + } + + ) +} + +export default CopyCode; \ No newline at end of file diff --git a/src/components/CompatibilityV2/pages/TryApp/components/CopyCode/styles.module.scss b/src/components/CompatibilityV2/pages/TryApp/components/CopyCode/styles.module.scss new file mode 100644 index 0000000..645e9d2 --- /dev/null +++ b/src/components/CompatibilityV2/pages/TryApp/components/CopyCode/styles.module.scss @@ -0,0 +1,40 @@ +.container { + width: 100%; + max-width: 188px; + background-color: #CADCFF; + padding-inline: 11px; + font-weight: 600; + font-size: 23px; + line-height: 27.84px; + text-align: center; + min-height: 45px; + border-radius: 22px; + display: flex; + align-items: center; + justify-content: flex-end; + margin-top: 24px; + cursor: pointer; + + &>span { + width: 100%; + text-align: center; + } + + &.black { + background-color: #000; + color: #fff; + } +} + +.copyIcon { + width: 23px; + height: 23px; +} + +.toast { + position: fixed; + width: calc(100% - 32px); + max-width: 528px; + bottom: calc(0dvh + 16px); + z-index: 9999; +} \ No newline at end of file diff --git a/src/components/CompatibilityV2/pages/TryApp/components/EnterCode/index.tsx b/src/components/CompatibilityV2/pages/TryApp/components/EnterCode/index.tsx new file mode 100644 index 0000000..e0271ae --- /dev/null +++ b/src/components/CompatibilityV2/pages/TryApp/components/EnterCode/index.tsx @@ -0,0 +1,20 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.scss"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import CopyCode from "../CopyCode"; + +function EnterCode() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV2); + + return ( +
+ + {translate("/try-app.enter-code-title")} + + +
+ ); +} + +export default EnterCode; diff --git a/src/components/CompatibilityV2/pages/TryApp/components/EnterCode/styles.module.scss b/src/components/CompatibilityV2/pages/TryApp/components/EnterCode/styles.module.scss new file mode 100644 index 0000000..aeeb4ce --- /dev/null +++ b/src/components/CompatibilityV2/pages/TryApp/components/EnterCode/styles.module.scss @@ -0,0 +1,14 @@ +.container { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; +} + +.title { + font-weight: 600; + font-size: 22px; + line-height: 26.63px; + text-align: center; + margin-bottom: 0; +} \ No newline at end of file diff --git a/src/components/CompatibilityV2/pages/TryApp/components/Header/index.tsx b/src/components/CompatibilityV2/pages/TryApp/components/Header/index.tsx new file mode 100644 index 0000000..abe1236 --- /dev/null +++ b/src/components/CompatibilityV2/pages/TryApp/components/Header/index.tsx @@ -0,0 +1,66 @@ +import Title from "@/components/Title" +import styles from "./styles.module.scss" +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import { images } from "@/components/CompatibilityV2/data"; +import { useSelector } from "react-redux"; +import { selectors } from "@/store"; +import useTimer from "@/hooks/palmistry/use-timer"; +import { useEffect, useState } from "react"; +import { copyToClipboard } from "@/services/data"; +import Toast from "@/components/pages/ABDesign/v1/components/Toast"; + +interface IHeaderProps { + onButtonClick: () => void; +} + +function Header({ + onButtonClick +}: IHeaderProps) { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV2); + const authCode = useSelector(selectors.selectAuthCode); + const timer = useTimer(); + const [isCopied, setIsCopied] = useState(false); + + const handleCopy = async () => { + const isCopied = await copyToClipboard(authCode); + setIsCopied(isCopied); + }; + + useEffect(() => { + if (!isCopied) return; + + const timeout = setTimeout(() => { + setIsCopied(false); + }, 4000); + + return () => clearTimeout(timeout); + }, [isCopied]); + + return ( +
+ + {translate("/try-app.header.title")} + +
+
+ Copy code + {authCode} +
+
+ {timer} +

+ {translate("/try-app.header.get-prediction-in-app", { + br:
+ })} +

+
+
+ {isCopied && + {translate("/try-app.code-copied")} + } +
+ ) +} + +export default Header \ No newline at end of file diff --git a/src/components/CompatibilityV2/pages/TryApp/components/Header/styles.module.scss b/src/components/CompatibilityV2/pages/TryApp/components/Header/styles.module.scss new file mode 100644 index 0000000..e9dd620 --- /dev/null +++ b/src/components/CompatibilityV2/pages/TryApp/components/Header/styles.module.scss @@ -0,0 +1,100 @@ +.container { + display: flex; + align-items: center; + flex-direction: column; + width: 100vw; + max-width: 560px; + padding: 0 6px 8px; + background-color: #EFF0FC; + position: sticky; + top: calc(0dvh); + box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.11); + margin-bottom: 46px; + z-index: 9999; + + &>* { + font-family: SF Pro Text, sans-serif; + } + + &>.title { + margin: 0; + font-size: 14px; + line-height: 26px; + font-weight: 600; + } +} + +.buttons { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + width: 100%; + gap: 11px; + + &>.copyCode { + display: flex; + flex-direction: row; + align-items: center; + gap: 4px; + padding: 0px 14px; + border-radius: 22px; + background-color: #CADCFF; + min-width: 144px; + cursor: pointer; + + &>img { + width: 20px; + height: 20px; + } + + &>.code { + font-size: 23px; + line-height: 45px; + font-weight: 600; + text-align: center; + width: 100%; + } + } + + &>.downloadApp { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + gap: 4px; + padding: 0px 10px; + border-radius: 8px; + background-color: #000000; + color: #FFFFFF; + min-height: 53px; + width: 100%; + max-width: 230px; + box-shadow: 2px 5px 2.5px -1px rgba(0, 0, 0, 0.2); + cursor: pointer; + + &>.timer { + font-weight: 600; + font-size: 14px; + line-height: 18px; + text-align: center; + } + + &>.downloadAppDescription { + font-family: SF Pro Text; + font-weight: 500; + font-size: 17px; + line-height: 21.25px; + text-align: center; + width: 100%; + } + } +} + +.toast { + position: fixed; + width: calc(100% - 32px); + max-width: 528px; + bottom: calc(0dvh + 16px); + z-index: 9999; +} \ No newline at end of file diff --git a/src/components/CompatibilityV2/pages/TryApp/components/PalmPhoto/index.tsx b/src/components/CompatibilityV2/pages/TryApp/components/PalmPhoto/index.tsx new file mode 100644 index 0000000..b0d28dc --- /dev/null +++ b/src/components/CompatibilityV2/pages/TryApp/components/PalmPhoto/index.tsx @@ -0,0 +1,187 @@ +import { selectors } from "@/store"; +import styles from "./styles.module.scss"; +import { useSelector } from "react-redux"; +import { useCallback, useEffect, useRef, useState } from "react"; +import { IPalmistryPoint } from "@/api/resources/Palmistry"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; + +function PalmPhoto() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV2); + const photo = useSelector(selectors.selectCompatibilityV2Photo); + const [isImageLoaded, setIsImageLoaded] = useState(false); + const [imageWidth, setImageWidth] = useState(0); + const [imageHeight, setImageHeight] = useState(0); + const imageRef = useRef(null); + const linesRef = useRef([]); + const fingers = useSelector(selectors.selectCompatibilityV2Fingers); + const lines = useSelector(selectors.selectCompatibilityV2Lines); + const [textPositions, setTextPositions] = useState>([]); + + useEffect(() => { + if (isImageLoaded && imageRef.current) { + setImageWidth(imageRef.current.width || 0); + setImageHeight(imageRef.current.height || 0); + } + }, [isImageLoaded]); + + const getCoordinatesString = useCallback( + (points: IPalmistryPoint[]) => { + const coordinatesString = `M ${points[0]?.x * imageWidth} ${points[0]?.y * imageHeight + }`; + return points.reduce( + (acc, point) => + `${acc} L ${point?.x * imageWidth} ${point?.y * imageHeight}`, + coordinatesString + ); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [lines, isImageLoaded, imageWidth, imageHeight] + ); + + const getLineLength = (line: SVGPathElement) => { + return line?.getTotalLength(); + }; + + useEffect(() => { + if (!imageWidth || !imageHeight || !lines.length) return; + + const textWidth = 90; + const textHeight = 17; + const padding = 10; + const newPositions: Array<{ x: number, y: number }> = []; + + lines.forEach((line, index) => { + const points = line.points; + const positions = []; + + for (let i = 0; i < points.length - 1; i++) { + const x = (points[i].x + points[i + 1].x) / 2; + const y = (points[i].y + points[i + 1].y) / 2; + positions.push({ x, y }); + } + + positions.unshift({ x: points[0].x, y: points[0].y }); + positions.push({ x: points[points.length - 1].x, y: points[points.length - 1].y }); + + let positionFound = false; + for (const pos of positions) { + let hasOverlap = false; + + for (const existingPos of newPositions) { + if ( + pos.x * imageWidth + padding < existingPos.x + textWidth && + pos.x * imageWidth + padding + textWidth > existingPos.x && + pos.y * imageHeight - padding < existingPos.y + textHeight && + pos.y * imageHeight - padding + textHeight > existingPos.y + ) { + hasOverlap = true; + break; + } + } + + if (!hasOverlap) { + newPositions.push({ + x: pos.x * imageWidth + 10, + y: pos.y * imageHeight - 5 + }); + positionFound = true; + break; + } + } + + if (!positionFound) { + newPositions.push({ + x: points[0].x * imageWidth + textWidth + padding * (index + 1), + y: points[0].y * imageHeight - textHeight - padding * (index + 1) + }); + } + }); + + setTextPositions(newPositions); + }, [lines, imageWidth, imageHeight]); + + return ( +
+
+ Palm photo setIsImageLoaded(true)} + /> + {/*
*/} + {!!imageHeight && !!imageWidth && ( + + {!!fingers.length && + fingers?.map((finger, index) => { + return ( + + + + + ); + })} + + {lines.map((line, index) => ( + + + (linesRef.current[index] = el as SVGPathElement) + } + style={{ + strokeDasharray: + getLineLength(linesRef.current[index]) || 500, + strokeDashoffset: + getLineLength(linesRef.current[index]) || 500, + }} + /> + + ))} + {lines.map((line, index) => ( + + + {translate(`/try-app.palm_lines.${line.name}`)} + + + ))} + + )} +
+
+ ) +} + +export default PalmPhoto \ No newline at end of file diff --git a/src/components/CompatibilityV2/pages/TryApp/components/PalmPhoto/styles.module.scss b/src/components/CompatibilityV2/pages/TryApp/components/PalmPhoto/styles.module.scss new file mode 100644 index 0000000..1a7b40e --- /dev/null +++ b/src/components/CompatibilityV2/pages/TryApp/components/PalmPhoto/styles.module.scss @@ -0,0 +1,31 @@ +.container { + width: 100%; + background: linear-gradient(0.63deg, #FFFFFF 0.53%, #C8DBFF 99.45%); + border-radius: 30px; + padding-top: 24px; + display: flex; + justify-content: center; + margin-top: 16px; +} + +.photoContainer { + position: relative; + + &>.blur { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 65px; + // background: rgba(255, 255, 255, 1); + backdrop-filter: blur(32px); + + } +} + +.photo { + width: 100%; + object-fit: contain; + max-width: 280px; + border-radius: 20px 20px 0 0; +} \ No newline at end of file diff --git a/src/components/CompatibilityV2/pages/TryApp/components/YourAccessCode/index.tsx b/src/components/CompatibilityV2/pages/TryApp/components/YourAccessCode/index.tsx new file mode 100644 index 0000000..2aa67f5 --- /dev/null +++ b/src/components/CompatibilityV2/pages/TryApp/components/YourAccessCode/index.tsx @@ -0,0 +1,54 @@ +import { useTranslations } from "@/hooks/translations"; +import styles from "./styles.module.scss"; +import { ELocalesPlacement } from "@/locales"; +import { useSelector } from "react-redux"; +import { selectors } from "@/store"; +import { images } from "@/components/CompatibilityV2/data"; +import { useEffect, useState } from "react"; +import { copyToClipboard } from "@/services/data"; +import Toast from "@/components/pages/ABDesign/v1/components/Toast"; + +function YourAccessCode(): JSX.Element { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV2); + const code = useSelector(selectors.selectAuthCode) + const [isCopied, setIsCopied] = useState(false); + + const handleCopy = async () => { + const isCopied = await copyToClipboard(code); + setIsCopied(isCopied); + }; + + useEffect(() => { + if (!isCopied) return; + + const timeout = setTimeout(() => { + setIsCopied(false); + }, 4000); + + return () => clearTimeout(timeout); + }, [isCopied]); + + return ( +
+
+ {translate("/try-app.your_access_code")} +
+
+
+
+ {code} +
+
+ Copy code + {translate("/try-app.copy")} +
+
+
+ {isCopied && + {translate("/try-app.code-copied")} + } +
+ ); +} + +export default YourAccessCode; diff --git a/src/components/CompatibilityV2/pages/TryApp/components/YourAccessCode/styles.module.scss b/src/components/CompatibilityV2/pages/TryApp/components/YourAccessCode/styles.module.scss new file mode 100644 index 0000000..3582475 --- /dev/null +++ b/src/components/CompatibilityV2/pages/TryApp/components/YourAccessCode/styles.module.scss @@ -0,0 +1,75 @@ +.container { + display: flex; + flex-direction: column; + align-items: center; + border: solid 3px #1171AC; + width: 100%; + max-width: 326px; + border-radius: 11px 11px 22px 22px; +} + +.header { + min-height: 42px; + width: 100%; + background-color: #1171AC; + font-family: Inter; + font-weight: 600; + font-size: 20px; + line-height: 24.2px; + text-align: center; + color: #FFFFFF; + display: flex; + align-items: center; + justify-content: center; +} + +.body { + min-height: 106px; + padding-inline: 32px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 100%; + cursor: pointer; +} + +.codeContainer { + padding-inline: 38px; + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; +} + +.code { + width: 100%; + font-weight: 600; + font-size: 34px; + line-height: 41.15px; + text-align: center; + color: #000000; +} + +.copy { + margin-right: -38px; + display: flex; + flex-direction: column; + align-items: flex-end; + justify-content: center; + gap: 2px; + cursor: pointer; + + &>img { + width: 34px; + height: 34px; + } +} + +.toast { + position: fixed; + width: calc(100% - 32px); + max-width: 528px; + bottom: calc(0dvh + 16px); + z-index: 9999; +} \ No newline at end of file diff --git a/src/components/CompatibilityV2/pages/TryApp/index.tsx b/src/components/CompatibilityV2/pages/TryApp/index.tsx new file mode 100644 index 0000000..5bbddc7 --- /dev/null +++ b/src/components/CompatibilityV2/pages/TryApp/index.tsx @@ -0,0 +1,118 @@ +import Title from "@/components/Title"; +import AppNumberOne from "../../components/AppNumberOne"; +import Button from "../../components/Button"; +import styles from "./styles.module.scss"; +import HowWork from "../../components/HowWork"; +import WhatIncluded from "../../components/WhatIncluded"; +import PalmsSayAbout from "../../components/PalmsSayAbout"; +import Reviews from "../../components/Reviews"; +import { compatibilityV2Prefix } from "@/routes"; +import Footer from "../../components/Footer"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import { usePreloadImages } from "@/hooks/preload/images"; +import { useEffect } from "react"; +import metricService, { EGoals, EMetrics } from "@/services/metric/metricService"; +import Header from "./components/Header"; +import PalmPhoto from "./components/PalmPhoto"; +import YourAccessCode from "./components/YourAccessCode"; +import { images } from "../../data"; +import CopyCode from "./components/CopyCode"; +import EnterCode from "./components/EnterCode"; + +function TryApp() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV2); + usePreloadImages([ + "/v1/palmistry/ticket.svg", + ]) + + const downloadApp = () => { + // TODO + window.location.href = + "https://apps.apple.com/us/app/aura-astrology-horoscope/id1601978549"; + }; + + useEffect(() => { + metricService.reachGoal(EGoals.TRIAL_PAYMENT_PAGE_VISIT, [EMetrics.YANDEX, EMetrics.KLAVIYO]); + metricService.reachGoal(EGoals.AURA_TRIAL_PAYMENT_PAGE_VISIT, [EMetrics.KLAVIYO]); + }, []); + + return ( + <> +
+ + + + {translate("/try-app.reading_ready.title")} + + +

{translate("/try-app.instruction_point_1")}

+ Download app +

{translate("/try-app.instruction_point_2")}

+ +

+ {translate("/try-app.not_share_description")} +

+ + + {translate("/try-app.how_work.title")} + + + {/* */} + + + + + + + + {translate("/try-app.why_love", { + color: <span>{translate("/try-app.why_love_color")}</span>, + })} + + + + + + {translate("/try-app.as_seen_in", { + color: ( + <span> + {translate("app_name", undefined, ELocalesPlacement.V1)} + </span> + ), + })} + + Partners +