From 8db05c3fd4a64ead52515bf6ab3ec02269f44b34 Mon Sep 17 00:00:00 2001 From: gofnnp Date: Thu, 16 Nov 2023 02:29:49 +0400 Subject: [PATCH] feat: add authorization with apple and google, add payment systems, minor edits, fixed bugs --- public/apple-auth-icon.png | Bin 0 -> 412 bytes public/apple-auth-icon.svg | 3 + public/google-auth-icon.png | Bin 0 -> 1016 bytes public/google-auth-icon.svg | 13 ++ public/padlock_icon_animation_closing.png | Bin 0 -> 148309 bytes src/api/api.ts | 8 +- src/api/resources/AIRequests.ts | 3 +- src/api/resources/AppleAuth.ts | 13 ++ src/api/resources/AssetCategories.ts | 2 - src/api/resources/Assets.ts | 3 - src/api/resources/GoogleAuth.ts | 14 ++ src/api/resources/SubscriptionPlans.ts | 43 ++++ src/api/resources/User.ts | 171 +++++++------- src/api/resources/UserSubscriptionReceipts.ts | 32 ++- src/api/resources/index.ts | 43 ++-- src/auth/useAuth.ts | 6 +- src/components/App/index.tsx | 216 ++++++++++++------ src/components/AttentionPage/index.tsx | 57 +++-- .../AttentionPage/styles.module.css | 1 + .../AuthPage/AppleAuthButton/index.tsx | 17 ++ .../AppleAuthButton/styles.module.css | 11 + .../AuthPage/GoogleAuthButton/index.tsx | 17 ++ .../GoogleAuthButton/styles.module.css | 11 + src/components/AuthPage/index.tsx | 96 ++++++++ src/components/AuthPage/styles.module.css | 41 ++++ src/components/AuthResultPage/index.tsx | 86 +++++++ .../AuthResultPage/styles.module.css | 10 + src/components/CompatResultPage/index.tsx | 2 - src/components/Compatibility/DatePicker.tsx | 3 +- .../Compatibility/DatePickerItem.tsx | 48 +--- src/components/Compatibility/index.tsx | 3 - .../CreateProfilePage/ProcessFlow.tsx | 3 - src/components/DidYouKnowPage/index.tsx | 50 ++-- src/components/FeedbackPage/index.tsx | 2 +- src/components/PaymentPage/index.tsx | 101 ++++---- .../PaymentPage/methods/PayPal/Button.tsx | 15 ++ .../PaymentPage/methods/Stripe/Button.tsx | 2 - .../methods/Stripe/CheckoutForm.tsx | 13 +- .../PaymentPage/methods/Stripe/Modal.tsx | 13 +- .../PaymentPage/results/SuccessPage/index.tsx | 18 +- src/components/PaymentPage/results/index.tsx | 6 +- src/components/PaymentPage/styles.css | 19 +- src/components/Policy/index.tsx | 26 ++- src/components/PriceItem/index.tsx | 24 +- src/components/PriceList/index.tsx | 81 +++---- src/components/PriceListPage/index.tsx | 97 +++++--- src/components/SpecialWelcomeOffer/index.tsx | 8 +- src/components/StripePage/index.tsx | 63 +++++ src/components/StripePage/styles.module.css | 16 ++ src/components/SubscriptionPage/index.tsx | 35 ++- .../SubscriptionPage/styles.module.css | 6 +- src/components/WallpaperPage/index.tsx | 20 +- src/locales/dev.ts | 3 +- src/routes.ts | 19 +- src/services/price/index.ts | 15 ++ src/store/index.ts | 2 + src/store/payment.ts | 7 + src/types.ts | 26 +-- 58 files changed, 1150 insertions(+), 513 deletions(-) create mode 100644 public/apple-auth-icon.png create mode 100644 public/apple-auth-icon.svg create mode 100644 public/google-auth-icon.png create mode 100644 public/google-auth-icon.svg create mode 100644 public/padlock_icon_animation_closing.png create mode 100644 src/api/resources/AppleAuth.ts create mode 100644 src/api/resources/GoogleAuth.ts create mode 100644 src/api/resources/SubscriptionPlans.ts create mode 100644 src/components/AuthPage/AppleAuthButton/index.tsx create mode 100644 src/components/AuthPage/AppleAuthButton/styles.module.css create mode 100644 src/components/AuthPage/GoogleAuthButton/index.tsx create mode 100644 src/components/AuthPage/GoogleAuthButton/styles.module.css create mode 100644 src/components/AuthPage/index.tsx create mode 100644 src/components/AuthPage/styles.module.css create mode 100644 src/components/AuthResultPage/index.tsx create mode 100644 src/components/AuthResultPage/styles.module.css create mode 100644 src/components/PaymentPage/methods/PayPal/Button.tsx create mode 100644 src/components/StripePage/index.tsx create mode 100644 src/components/StripePage/styles.module.css create mode 100644 src/services/price/index.ts diff --git a/public/apple-auth-icon.png b/public/apple-auth-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..158c7efafb36525215f6d03d3bf8a27736796c12 GIT binary patch literal 412 zcmV;N0b~A&P)EWx?BO+EvPd``K;6=FNGtyH$BkqwNjhT0XD?UPo zI@X{dbDcO%OnwlQw{ULGJEl`>$iNR8?|c8K$OVaCrr=xbMlB?55rL;R0%CFrQwJvVEP`H_H_Tay+UBcNTB}0000 + + diff --git a/public/google-auth-icon.png b/public/google-auth-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4136c8c5606674626716cbd8c38f4f187b13f8e7 GIT binary patch literal 1016 zcmVUK~#7FwU?Lqs?dbVC7hB&6KxHI#<-dkN=*V$QD*B=Zs^S*iS|K9t)_q{g=E9CFVS{*o^ z1%wC!Xe6!$BS8X?ECd!;Lacwwo6lCE_AtmeuIph}O|~M@bs-dn6+@=$LHl-d(1c=z zY$hxZO-x+2v~PhodLzx`gOeC>dnt zib`1aiyWz#f|7~KsjliBh~=@(G1^quf(V^~Edkj?*u^-R3M)&bixfw5Jg)|kofXYR zS0cI~Jbt=f^Bmq67)V6M6n7uimo;26H_#6yBrWXrmJNA!NSl691K#MyrLxR9xb0mc0VPIp-z!l9yoTi-Y&bNQ z?uz@na$c2;ZM|Q+VI5$E?09xT`O!bHsd)%kIAy!seFE!*Dgq&rTNv6i0m_bKd_y#8 z1yw$AFL|8x9_bEhZdo<{G{@)%K~eGto$AG;q3kDs=;Bla}`q`P#3Z z+$zy|r|N*%mnrO+-Urc8C~gh}Dw#K;XOfG%R9{?P-2vqje}gDJ*bv-2G8ZjOpn z)&l_`kR@&==lF^dvlQmo9uI{*=0y~Q1BBQjMj8(NI|}7vR{(iMZWCP}Zdb;Z2uo_a z&$j`g0VRMrRZuZ}3z%D#ewRy#Qck0sX8EpUe?0u+NB@qCdxf8|9@YpcNpLoQ6b~U# zXLs9_avL(D%Y^5}-wJW@ggUGhbil3nZgKP)KHhAwmYDL@kv^A^iP^s@MM4O1FX_b+ zvG}sU#X^-2Jv%Q>pV(Gp2TWw#7`W7v_ncNxI78j@bH|Cx<10qw4_l@qVpO)68Cx8U m6I`U + + + + + + + + + + + + diff --git a/public/padlock_icon_animation_closing.png b/public/padlock_icon_animation_closing.png new file mode 100644 index 0000000000000000000000000000000000000000..06ec26269892b0f48cd0bd6536ae9afa9f287585 GIT binary patch literal 148309 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
    eV{GRU^u&3 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ðfJk7b18r>&Ijrs4o;<4EhH7%y! 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 ImAf1tsNZBUACR5#uOkH(#~OI=~fa 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 literal 0 HcmV?d00001 diff --git a/src/api/api.ts b/src/api/api.ts index 7655863..f6c0744 100644 --- a/src/api/api.ts +++ b/src/api/api.ts @@ -19,11 +19,16 @@ import { AIRequests, UserCallbacks, Translations, - Zodiacs + Zodiacs, + GoogleAuth, + SubscriptionPlans, + AppleAuth } from './resources' const api = { auth: createMethod(AuthTokens.createRequest), + appleAuth: createMethod(AppleAuth.createRequest), + googleAuth: createMethod(GoogleAuth.createRequest), getAppConfig: createMethod(Apps.createRequest), getElement: createMethod(Element.createRequest), getElements: createMethod(Elements.createRequest), @@ -34,6 +39,7 @@ const api = { getDailyForecasts: createMethod(DailyForecasts.createRequest), getAuras: createMethod(Auras.createRequest), getSubscriptionItems: createMethod(SubscriptionItems.createRequest), + getSubscriptionPlans: createMethod(SubscriptionPlans.createRequest), getSubscriptionCheckout: createMethod(SubscriptionCheckout.createRequest), getSubscriptionStatus: createMethod(SubscriptionStatus.createRequest), getSubscriptionReceipt: createMethod(SubscriptionReceipts.createGetRequest), diff --git a/src/api/resources/AIRequests.ts b/src/api/resources/AIRequests.ts index dfe1ca8..6f796e2 100644 --- a/src/api/resources/AIRequests.ts +++ b/src/api/resources/AIRequests.ts @@ -1,3 +1,4 @@ +import { apiHost } from "@/routes"; import { getAuthHeaders } from "../utils"; export interface Payload { @@ -40,6 +41,6 @@ export interface IAiInputs { } export const createRequest = ({ body_check_path, token }: Payload): Request => { - const url = new URL(`https://aura.wit.life${body_check_path}`); + const url = new URL(`${apiHost}${body_check_path}`); return new Request(url, { method: "GET", headers: getAuthHeaders(token) }); }; diff --git a/src/api/resources/AppleAuth.ts b/src/api/resources/AppleAuth.ts new file mode 100644 index 0000000..da00711 --- /dev/null +++ b/src/api/resources/AppleAuth.ts @@ -0,0 +1,13 @@ +import routes from "@/routes"; + +export interface Payload { + origin: string; +} + +export type Response = unknown; + +export const createRequest = ({ origin }: Payload): Request => { + + const url = new URL(routes.server.appleAuth(origin)); + return new Request(url, { method: "POST" }); +}; diff --git a/src/api/resources/AssetCategories.ts b/src/api/resources/AssetCategories.ts index 60f1c01..a8bf1d7 100644 --- a/src/api/resources/AssetCategories.ts +++ b/src/api/resources/AssetCategories.ts @@ -1,6 +1,4 @@ import routes from "@/routes" -// import { AuthPayload } from "../types" -// import { getAuthHeaders } from "../utils" export interface Payload { locale: string diff --git a/src/api/resources/Assets.ts b/src/api/resources/Assets.ts index 2af5a00..0036e41 100644 --- a/src/api/resources/Assets.ts +++ b/src/api/resources/Assets.ts @@ -1,9 +1,6 @@ import routes from "@/routes" import { AssetCategory } from "./AssetCategories" -// import { AuthPayload } from "../types" -// import { getAuthHeaders } from "../utils" -// export interface Payload extends AuthPayload { export interface Payload { category: string page?: number diff --git a/src/api/resources/GoogleAuth.ts b/src/api/resources/GoogleAuth.ts new file mode 100644 index 0000000..4f66cee --- /dev/null +++ b/src/api/resources/GoogleAuth.ts @@ -0,0 +1,14 @@ +export interface Payload { + requestUrl: string; +} + +export interface Response { + access_token: string; +} + +export const createRequest = ({ requestUrl }: Payload): Request => { + const url = new URL(requestUrl); + return new Request(url, { + method: "GET", + }); +}; diff --git a/src/api/resources/SubscriptionPlans.ts b/src/api/resources/SubscriptionPlans.ts new file mode 100644 index 0000000..3e91f12 --- /dev/null +++ b/src/api/resources/SubscriptionPlans.ts @@ -0,0 +1,43 @@ +import routes from "@/routes"; + +export interface Payload { + locale: string; +} + +export interface Response { + sub_plans: ISubscriptionPlan[]; +} + +export interface ISubscriptionPlan { + id: string; + name: string; + desc: string; + provider: "stripe" | "paypal"; + interval: "week" | "month" | "year"; + price_cents: number; + trial: ITrial | null; +} + +export interface ITrial { + is_paid: boolean; + is_free: boolean; + days: number; + price_cents: number; +} + +export interface AssetMetadata { + size: number; + width: number; + height: number; + filename: string; + mime_type: string; +} + +export const createRequest = ({ locale }: Payload): Request => { + const url = new URL(routes.server.subscriptionPlans()); + const query = new URLSearchParams({ locale }); + + url.search = query.toString(); + + return new Request(url, { method: "GET" }); +}; diff --git a/src/api/resources/User.ts b/src/api/resources/User.ts index 10df905..2bab6eb 100644 --- a/src/api/resources/User.ts +++ b/src/api/resources/User.ts @@ -1,121 +1,132 @@ -import routes from "@/routes" -import { AuthPayload } from "../types" -import { getAuthHeaders } from "../utils" +import routes from "@/routes"; +import { AuthPayload } from "../types"; +import { getAuthHeaders } from "../utils"; -export type GetPayload = AuthPayload +export type GetPayload = AuthPayload; export interface PatchPayload extends AuthPayload { - user: Partial + user: Partial; } export interface Response { - user: User + user: User; meta?: { links: { - self: string - } - } + self: string; + }; + }; } export interface UserPatch { - locale: string - timezone: string - profile_attributes: Partial & { - birthplace_id: null - birthplace_attributes: { - address?: string - coords?: string - }, - remote_userpic_url: string - }> - daily_push_subs_attributes: [{ - time: string - daily_push_id: string - }] + locale: string; + timezone: string; + profile_attributes: Partial< + Pick< + UserProfile, + "gender" | "full_name" | "relationship_status" | "birthday" + > & { + birthplace_id: null; + birthplace_attributes: { + address?: string; + coords?: string; + }; + remote_userpic_url: string; + } + >; + daily_push_subs_attributes: [ + { + time: string; + daily_push_id: string; + } + ]; } export interface User { - id: string | null | undefined - username: string | null - email: string - locale: string - state: string - timezone: string - new_registration: boolean + id: string | null | undefined; + username: string | null; + email: string; + locale: string; + state: string; + timezone: string; + new_registration: boolean; stat: { - last_online_at: string | null - prev_online_at: string | null - } - profile: UserProfile - daily_push_subs: Subscription[] + last_online_at: string | null; + prev_online_at: string | null; + }; + profile: UserProfile; + daily_push_subs: Subscription[]; } export interface UserProfile { - full_name: string | null - gender: string | null - birthday: string | null - birthplace: UserBirhplace | null - age: UserAge | null - sign: UserSign | null - userpic: UserPic | null - userpic_mime_type: string | undefined - relationship_status: string - human_relationship_status: string + full_name: string | null; + gender: string | null; + birthday: string | null; + birthplace: UserBirhplace | null; + age: UserAge | null; + sign: UserSign | null; + userpic: UserPic | null; + userpic_mime_type: string | undefined; + relationship_status: string; + human_relationship_status: string; } export interface UserAge { - years: number - days: number + years: number; + days: number; } export interface UserSign { - house: number - ruler: string + house: number; + ruler: string; dates: { start: { - month: number - day: number - } + month: number; + day: number; + }; end: { - month: number - day: number - } - } - sign: string - char: string - polarity: string - modality: string - triplicity: string + month: number; + day: number; + }; + }; + sign: string; + char: string; + polarity: string; + modality: string; + triplicity: string; } export interface UserPic { - th: string - th2x: string - lg: string + th: string; + th2x: string; + lg: string; } export interface UserBirhplace { - id: string - address: string - coords: string + id: string; + address: string; + coords: string; } export interface Subscription { - id: string - daily_push_id: string - time: string - updated_at: string - created_at: string - last_sent_at: string | null + id: string; + daily_push_id: string; + time: string; + updated_at: string; + created_at: string; + last_sent_at: string | null; } export const createGetRequest = ({ token }: GetPayload): Request => { - const url = new URL(routes.server.user()) - return new Request(url, { method: 'GET', headers: getAuthHeaders(token) }) -} + const url = new URL(routes.server.user()); + return new Request(url, { method: "GET", headers: getAuthHeaders(token) }); +}; export const createPatchRequest = ({ token, user }: PatchPayload): Request => { - const url = new URL(routes.server.user()) - const body = JSON.stringify({ user }) - return new Request(url, { method: 'PATCH', headers: getAuthHeaders(token), body }) -} + const url = new URL(routes.server.user()); + const body = JSON.stringify({ user }); + return new Request(url, { + method: "PATCH", + headers: getAuthHeaders(token), + body, + }); +}; diff --git a/src/api/resources/UserSubscriptionReceipts.ts b/src/api/resources/UserSubscriptionReceipts.ts index 3fc8138..0692ff2 100644 --- a/src/api/resources/UserSubscriptionReceipts.ts +++ b/src/api/resources/UserSubscriptionReceipts.ts @@ -19,13 +19,22 @@ export interface AppleReceiptPayload extends AuthPayload { } export interface StripeReceiptPayload extends AuthPayload { + way: "stripe"; + subscription_receipt: { + sub_plan_id: string; + }; +} + +export interface PayPalReceiptPayload extends AuthPayload { itemInterval: "week" | "month" | "year"; + way: "paypal"; } export type Payload = | ChargebeeReceiptPayload | AppleReceiptPayload - | StripeReceiptPayload; + | StripeReceiptPayload + | PayPalReceiptPayload; export interface Response { subscription_receipt: SubscriptionReceipt; @@ -54,9 +63,16 @@ export interface SubscriptionReceipt { app_bundle_id: string; autorenewable: boolean; error: string; + links?: IPayPalLink[]; }; } +interface IPayPalLink { + href: string; + rel: "approve" | "edit" | "self"; + method: "GET" | "PATCH"; +} + function createRequest({ token, itemPriceId, @@ -69,7 +85,7 @@ function createRequest({ autorenewable = true, sandbox = true, }: AppleReceiptPayload): Request; -function createRequest({ token, itemInterval }: StripeReceiptPayload): Request; +function createRequest({ token }: StripeReceiptPayload): Request; function createRequest(payload: Payload): Request; function createRequest(payload: Payload): Request { const url = new URL(routes.server.subscriptionReceipts()); @@ -103,11 +119,19 @@ function getDataPayload(payload: Payload) { }, }; } - if ("itemInterval" in payload) { + if ("way" in payload && payload.way === "paypal") { + return { + way: "paypal", + subscription_receipt: { + item_interval: payload.itemInterval, + }, + }; + } + if ("way" in payload && payload.way === "stripe") { return { way: "stripe", subscription_receipt: { - item_interval: payload.itemInterval, + sub_plan_id: payload.subscription_receipt.sub_plan_id, }, }; } diff --git a/src/api/resources/index.ts b/src/api/resources/index.ts index 00e1ec1..a679cc4 100644 --- a/src/api/resources/index.ts +++ b/src/api/resources/index.ts @@ -1,20 +1,23 @@ -export * as Assets from './Assets' -export * as AssetCategories from './AssetCategories' -export * as Apps from './Apps' -export * as User from './User' -export * as DailyForecasts from './UserDailyForecasts' -export * as Auras from './Auras' -export * as Element from './Element' -export * as Elements from './Elements' -export * as AuthTokens from './AuthTokens' -export * as SubscriptionItems from './UserSubscriptionItemPrices' -export * as SubscriptionCheckout from './UserSubscriptionCheckout' -export * as SubscriptionStatus from './UserSubscriptionStatus' -export * as SubscriptionReceipts from './UserSubscriptionReceipts' -export * as PaymentIntents from './UserPaymentIntents' -export * as AICompatCategories from './AICompatCategories' -export * as AICompats from './AICompats' -export * as AIRequests from './AIRequests' -export * as UserCallbacks from './UserCallbacks' -export * as Translations from './Translations' -export * as Zodiacs from './Zodiacs' +export * as Assets from "./Assets"; +export * as AssetCategories from "./AssetCategories"; +export * as Apps from "./Apps"; +export * as User from "./User"; +export * as DailyForecasts from "./UserDailyForecasts"; +export * as Auras from "./Auras"; +export * as Element from "./Element"; +export * as Elements from "./Elements"; +export * as AuthTokens from "./AuthTokens"; +export * as SubscriptionItems from "./UserSubscriptionItemPrices"; +export * as SubscriptionCheckout from "./UserSubscriptionCheckout"; +export * as SubscriptionStatus from "./UserSubscriptionStatus"; +export * as SubscriptionReceipts from "./UserSubscriptionReceipts"; +export * as PaymentIntents from "./UserPaymentIntents"; +export * as AICompatCategories from "./AICompatCategories"; +export * as AICompats from "./AICompats"; +export * as AIRequests from "./AIRequests"; +export * as UserCallbacks from "./UserCallbacks"; +export * as Translations from "./Translations"; +export * as Zodiacs from "./Zodiacs"; +export * as GoogleAuth from "./GoogleAuth"; +export * as SubscriptionPlans from "./SubscriptionPlans"; +export * as AppleAuth from "./AppleAuth"; diff --git a/src/auth/useAuth.ts b/src/auth/useAuth.ts index f002396..8cc4eea 100644 --- a/src/auth/useAuth.ts +++ b/src/auth/useAuth.ts @@ -1,4 +1,4 @@ -import { useContext } from 'react' -import { AuthContext } from './AuthContext' +import { useContext } from "react"; +import { AuthContext } from "./AuthContext"; -export const useAuth = () => useContext(AuthContext) +export const useAuth = () => useContext(AuthContext); diff --git a/src/components/App/index.tsx b/src/components/App/index.tsx index 5698856..7cd075d 100644 --- a/src/components/App/index.tsx +++ b/src/components/App/index.tsx @@ -48,17 +48,22 @@ import { Asset } from "@/api/resources/Assets"; import PaymentResultPage from "../PaymentPage/results"; import PaymentSuccessPage from "../PaymentPage/results/SuccessPage"; import PaymentFailPage from "../PaymentPage/results/ErrorPage"; +import { StripePage } from "../StripePage"; +import AuthPage from "../AuthPage"; +import AuthResultPage from "../AuthResultPage"; function App(): JSX.Element { const [isSpecialOfferOpen, setIsSpecialOfferOpen] = useState(false); const [leoApng, setLeoApng] = useState(Error); + const [padLockApng, setPadLockApng] = useState(Error); const navigate = useNavigate(); const api = useApi(); const dispatch = useDispatch(); + const { token, user } = useAuth(); const closeSpecialOfferAttention = () => { setIsSpecialOfferOpen(false); - navigate(routes.client.emailEnter()); + navigate(routes.client.auth()); }; const assetsData = useCallback(async () => { @@ -71,13 +76,25 @@ function App(): JSX.Element { const { data } = useApiCall(assetsData); useEffect(() => { - // TODO: remove later - dispatch( - actions.token.update( - "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOjQwNjEyLCJpYXQiOjE2OTc5MjY0MTksImV4cCI6MTcwNjU2NjQxOSwianRpIjoiZTg0NWE0ZmUtYmVmNy00ODNmLWIwMzgtYjlkYzBlZjk1MjNmIiwiZW1haWwiOiJvdGhlcjJAZXhhbXBsZS5jb20iLCJzdGF0ZSI6InByb3ZlbiIsImxvYyI6ImVuIiwidHoiOjAsInR5cGUiOiJlbWFpbCIsImlzcyI6ImNvbS5saWZlLmF1cmEifQ.ijaHDiNRLUIKdkziVB-zt8DA8WNH7RNwvYkp2EGDxTM" - ) - ); - }, [dispatch]); + (async () => { + if (!token.length || !user) return; + const { + user: { has_subscription }, + } = await api.getSubscriptionStatus({ + token, + }); + + if (has_subscription && user) { + return dispatch(actions.status.update("subscribed")); + } + if (!has_subscription && user) { + return dispatch(actions.status.update("unsubscribed")); + } + if (!user) { + return dispatch(actions.status.update("lead")); + } + })(); + }, [dispatch, api, token, user]); useEffect(() => { async function getApng() { @@ -91,61 +108,115 @@ function App(): JSX.Element { getApng(); }, [data]); + useEffect(() => { + (async () => { + const response = await fetch("/padlock_icon_animation_closing.png"); + const arrayBuffer = await response.arrayBuffer(); + setPadLockApng(parseAPNG(arrayBuffer)); + })(); + }, []); + + useEffect(() => { + if (!user) return; + dispatch(actions.form.addEmail(user.email)); + }, []); + return ( }> - } /> - } /> - } /> - } - /> - - } - /> - } /> - } /> - } /> - } /> - } /> - } - /> - } - /> - } - /> - } /> - } /> - } - /> - } - /> - } /> - } /> - } /> - } /> - }> + } /> + } /> + } + /> + } + /> + + } + /> + } /> + } /> + } /> + } + /> + } + /> + } + /> + } /> + } /> + {/* } - /> - }> + /> */} + + } + /> + }> + }> + } + /> + } + /> + } + /> + } + /> + } + /> + + }> + } /> + } + /> + } + /> + } + /> + } + /> + } + /> + + } /> @@ -248,6 +319,16 @@ function Layout({ setIsSpecialOfferOpen }: LayoutProps): JSX.Element { ); } +function AuthorizedUserOutlet(): JSX.Element { + const status = useSelector(selectors.selectStatus); + const { user } = useAuth(); + return user && status === "subscribed" ? ( + + ) : ( + + ); +} + function PrivateOutlet(): JSX.Element { const { user } = useAuth(); return user ? ( @@ -257,6 +338,15 @@ function PrivateOutlet(): JSX.Element { ); } +function PrivateSubscriptionOutlet(): JSX.Element { + const status = useSelector(selectors.selectStatus); + return status === "subscribed" ? ( + + ) : ( + + ); +} + function SkipStep(): JSX.Element { const { user } = useAuth(); return user ? ( @@ -271,14 +361,4 @@ function MainPage(): JSX.Element { return ; } -function ProtectWallpaperPage(): JSX.Element { - const status = useSelector(selectors.selectStatus); - return ; - return status === "subscribed" ? ( - - ) : ( - - ); -} - export default App; diff --git a/src/components/AttentionPage/index.tsx b/src/components/AttentionPage/index.tsx index 1b69440..783d581 100644 --- a/src/components/AttentionPage/index.tsx +++ b/src/components/AttentionPage/index.tsx @@ -1,43 +1,40 @@ -import { useNavigate } from 'react-router-dom' -import { useTranslation } from 'react-i18next' -import Title from '../Title' -import routes from '@/routes' -import styles from './styles.module.css' -// import CheckboxWithText from '../CheckboxWithText' -import SpecialWelcomeOffer from '../SpecialWelcomeOffer' -import MainButton from '../MainButton' -// import MainButton from '../MainButton' +import { useNavigate } from "react-router-dom"; +import { useTranslation } from "react-i18next"; +import Title from "../Title"; +import routes from "@/routes"; +import styles from "./styles.module.css"; +import SpecialWelcomeOffer from "../SpecialWelcomeOffer"; +import MainButton from "../MainButton"; interface AttentionPageProps { - isOpenModal: boolean - onCloseSpecialOffer?: () => void + isOpenModal: boolean; + onCloseSpecialOffer?: () => void; } -function AttentionPage({ isOpenModal, onCloseSpecialOffer }: AttentionPageProps): JSX.Element { - const { t } = useTranslation() - const navigate = useNavigate() - const handleNext = () => navigate(routes.client.feedback()) - - // const onChangeCheckbox = (e: React.FormEvent) => { - // if (e.currentTarget.checked) { - // handleNext() - // } - // } +function AttentionPage({ + isOpenModal, + onCloseSpecialOffer, +}: AttentionPageProps): JSX.Element { + const { t } = useTranslation(); + const navigate = useNavigate(); + const handleNext = () => navigate(routes.client.feedback()); return (
    stop - {t('aura.attention.title')} -

    {t('aura.warming_up.body')}

    -
    - {/* */} - {/* {t('aura.warming_up.button')} */} - {t('aura.warmin_good.button')} - {t('aura.warmin_bad.button')} + {t("aura.attention.title")} +

    {t("aura.warming_up.body")}

    +
    + + {t("aura.warmin_good.button")} + + + {t("aura.warmin_bad.button")} +
    - ) + ); } -export default AttentionPage +export default AttentionPage; diff --git a/src/components/AttentionPage/styles.module.css b/src/components/AttentionPage/styles.module.css index 4185856..7e997cf 100644 --- a/src/components/AttentionPage/styles.module.css +++ b/src/components/AttentionPage/styles.module.css @@ -22,6 +22,7 @@ margin: 64px auto 0; display: flex; flex-direction: column; + align-items: center; gap: 13px; } diff --git a/src/components/AuthPage/AppleAuthButton/index.tsx b/src/components/AuthPage/AppleAuthButton/index.tsx new file mode 100644 index 0000000..733340d --- /dev/null +++ b/src/components/AuthPage/AppleAuthButton/index.tsx @@ -0,0 +1,17 @@ +import MainButton from "@/components/MainButton"; +import styles from "./styles.module.css"; + +interface IAppleAuthButtonProps { + onClick: () => void; +} + +function AppleAuthButton({ onClick }: IAppleAuthButtonProps): JSX.Element { + return ( + + Apple + {"Sign in with Apple"} + + ); +} + +export default AppleAuthButton; diff --git a/src/components/AuthPage/AppleAuthButton/styles.module.css b/src/components/AuthPage/AppleAuthButton/styles.module.css new file mode 100644 index 0000000..ab68165 --- /dev/null +++ b/src/components/AuthPage/AppleAuthButton/styles.module.css @@ -0,0 +1,11 @@ +.button { + width: 100%; + background-color: transparent; + color: #000; + font-size: 19px; + font-weight: 600; + border: solid #000 2px; + flex-direction: row; + justify-content: flex-start; + gap: 20px; +} diff --git a/src/components/AuthPage/GoogleAuthButton/index.tsx b/src/components/AuthPage/GoogleAuthButton/index.tsx new file mode 100644 index 0000000..d5ab7f4 --- /dev/null +++ b/src/components/AuthPage/GoogleAuthButton/index.tsx @@ -0,0 +1,17 @@ +import MainButton from "@/components/MainButton"; +import styles from "./styles.module.css"; + +interface IGoogleAuthButtonProps { + onClick: () => void; +} + +function AppleAuthButton({ onClick }: IGoogleAuthButtonProps): JSX.Element { + return ( + + Google + {"Sign in with Google"} + + ); +} + +export default AppleAuthButton; diff --git a/src/components/AuthPage/GoogleAuthButton/styles.module.css b/src/components/AuthPage/GoogleAuthButton/styles.module.css new file mode 100644 index 0000000..6cb39f3 --- /dev/null +++ b/src/components/AuthPage/GoogleAuthButton/styles.module.css @@ -0,0 +1,11 @@ +.button { + width: 100%; + background-color: transparent; + color: #000; + font-size: 19px; + font-weight: 600; + border: solid #4285f4 2px; + flex-direction: row; + justify-content: flex-start; + gap: 20px; +} diff --git a/src/components/AuthPage/index.tsx b/src/components/AuthPage/index.tsx new file mode 100644 index 0000000..7678877 --- /dev/null +++ b/src/components/AuthPage/index.tsx @@ -0,0 +1,96 @@ +import Policy from "../Policy"; +import { useTranslation } from "react-i18next"; +import styles from "./styles.module.css"; +import AppleAuthButton from "./AppleAuthButton"; +import routes from "@/routes"; +import Title from "../Title"; +import { APNG } from "apng-js"; +import Player from "apng-js/types/library/player"; +import { useEffect, useRef } from "react"; +import GoogleAuthButton from "./GoogleAuthButton"; + +let apngPlayer: Player | null = null; + +interface AuthPageProps { + padLockApng: Error | APNG; +} + +function AuthPage({ padLockApng }: AuthPageProps): JSX.Element { + const { t } = useTranslation(); + const padLockCanvasRef = useRef(null); + + useEffect(() => { + let padLockTimeOut: NodeJS.Timeout; + async function getApngPlayer() { + const context = padLockCanvasRef.current?.getContext("2d"); + if (context && !(padLockApng instanceof Error)) { + context.canvas.height = padLockApng.height; + context.canvas.width = padLockApng.width; + const _apngPlayer = await padLockApng.getPlayer(context); + apngPlayer = _apngPlayer; + if (apngPlayer) { + apngPlayer.play(); + padLockTimeOut = setTimeout(() => { + if (apngPlayer) { + apngPlayer.pause(); + } + }, 900); + } + } + } + getApngPlayer(); + return () => { + clearTimeout(padLockTimeOut); + }; + }, [padLockApng]); + + const handleAppleAuth = async () => { + window.location.href = routes.server.appleAuth( + encodeURI(`${window.location.origin}/auth/result`) + ); + }; + + const handleGoogleAuth = async () => { + window.location.href = routes.server.googleAuth( + encodeURI(`${window.location.origin}/auth/result`) + ); + }; + + return ( +
    + + Sign in to save your energy analysis, horoscope, and predictions. + + +

    {t("we_dont_share")}

    +
    + + +
    + + {t("_continue_agree", { + eulaLink: ( +
    + {t("eula")} + + ), + privacyLink: ( + + {t("privacy_policy")} + + ), + })} + +
    + ); +} + +export default AuthPage; diff --git a/src/components/AuthPage/styles.module.css b/src/components/AuthPage/styles.module.css new file mode 100644 index 0000000..649f7c0 --- /dev/null +++ b/src/components/AuthPage/styles.module.css @@ -0,0 +1,41 @@ +.page { + position: relative; + /* height: calc(100vh - 103px); + max-height: -webkit-fill-available; */ + flex: auto; + justify-content: flex-start; + display: flex; + grid-template-rows: 1fr 96px; + justify-items: center; +} + +.disclaimer { + font-size: 19px; + font-weight: 500; + text-align: center; + margin-top: 24px; + line-height: 150%; +} + +.title { + font-weight: 700; + margin: 32px 0 0; +} + +.pad-lock { + width: 76px; + margin-top: 48px; +} + +.buttons-container { + width: 100%; + display: flex; + flex-direction: column; + gap: 20px; + max-width: 320px; + margin-top: 42px; +} + +.policy { + margin-top: 32px; +} \ No newline at end of file diff --git a/src/components/AuthResultPage/index.tsx b/src/components/AuthResultPage/index.tsx new file mode 100644 index 0000000..670ce39 --- /dev/null +++ b/src/components/AuthResultPage/index.tsx @@ -0,0 +1,86 @@ +import { ApiError, extractErrorMessage, useApi } from "@/api"; +import Loader from "../Loader"; +import styles from "./styles.module.css"; +import { useEffect, useState } from "react"; +import Title from "../Title"; +import MainButton from "../MainButton"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { useAuth } from "@/auth"; +import ErrorText from "../ErrorText"; +import { useDispatch, useSelector } from "react-redux"; +import { actions, selectors } from "@/store"; + +function AuthResultPage(): JSX.Element { + const api = useApi(); + const { signUp } = useAuth(); + const dispatch = useDispatch(); + const birthday = useSelector(selectors.selectBirthday); + const [apiError, setApiError] = useState(null); + const [error, setError] = useState(false); + const [isLoading, setIsLoading] = useState(true); + const navigate = useNavigate(); + const queryParameters = new URLSearchParams(window.location.search); + const access_token = queryParameters.get("jwt") || ""; + + useEffect(() => { + (async () => { + try { + setIsLoading(true); + const apiUser = await api.getUser({ token: access_token }); + signUp(access_token, apiUser.user); + const payload = { + user: { profile_attributes: { birthday } }, + token: access_token, + }; + const updatedUser = await api.updateUser(payload).catch((error) => { + console.log("Error: ", error); + }); + if (updatedUser?.user) { + dispatch(actions.user.update(updatedUser.user)); + } + dispatch(actions.status.update("registred")); + setIsLoading(false); + setTimeout(() => { + navigate(routes.client.priceList()); + }, 1500); + } catch (error) { + console.error(error); + if (error instanceof ApiError) { + setApiError(error as ApiError); + } else { + setError(true); + } + setIsLoading(false); + } + })(); + }, []); + + const handleTryAgain = () => { + navigate(routes.client.auth()); + }; + + return ( +
    + {isLoading && } + {(error || apiError) && ( + <> + Something went wrong + Try again + + )} + {apiError && ( + + )} + {!apiError && !error && !isLoading && access_token.length && ( + Success Icon + )} +
    + ); +} + +export default AuthResultPage; diff --git a/src/components/AuthResultPage/styles.module.css b/src/components/AuthResultPage/styles.module.css new file mode 100644 index 0000000..9757c27 --- /dev/null +++ b/src/components/AuthResultPage/styles.module.css @@ -0,0 +1,10 @@ +.page { + position: relative; + height: calc(100vh - 103px); + max-height: -webkit-fill-available; + flex: auto; + justify-content: center; + display: flex; + grid-template-rows: 1fr 96px; + justify-items: center; +} diff --git a/src/components/CompatResultPage/index.tsx b/src/components/CompatResultPage/index.tsx index 16a737a..bc07024 100644 --- a/src/components/CompatResultPage/index.tsx +++ b/src/components/CompatResultPage/index.tsx @@ -42,8 +42,6 @@ function CompatResultPage(): JSX.Element { return navigate(routes.client.compatibility()); }; - // const handleCompatibility = () => navigate(routes.client.compatibility()); - const loadData = useCallback(async () => { const right_bday = typeof rightUser.birthDate === "string" diff --git a/src/components/Compatibility/DatePicker.tsx b/src/components/Compatibility/DatePicker.tsx index 2ce5043..c399f97 100644 --- a/src/components/Compatibility/DatePicker.tsx +++ b/src/components/Compatibility/DatePicker.tsx @@ -30,7 +30,7 @@ const DatePicker: React.FC = ({ }); const months = Array.from({ length: 36 }, (_, index) => - new Date(0, index).toLocaleDateString(undefined, { month: "long" }) + new Date(0, index).toLocaleDateString(locale, { month: "long" }) ); const years = Array.from({ length: 81 }, (_, index) => (currentDate.getFullYear() - 80 + index).toString() @@ -60,6 +60,7 @@ const DatePicker: React.FC = ({ } }, [selectedDate, onDateChange]); + return ( <>
    diff --git a/src/components/Compatibility/DatePickerItem.tsx b/src/components/Compatibility/DatePickerItem.tsx index 9aafa61..6330e70 100644 --- a/src/components/Compatibility/DatePickerItem.tsx +++ b/src/components/Compatibility/DatePickerItem.tsx @@ -48,8 +48,10 @@ const DatePickerItem: React.FC = ({ }; useEffect(() => { - setTranslateY((data.indexOf(selectedValue) + (unit === "month" ? 12 : 0)) * -ITEM_HEIGHT) - }, [selectedValue, data, unit]) + setTranslateY( + (data.indexOf(selectedValue) + (unit === "month" ? 12 : 0)) * -ITEM_HEIGHT + ); + }, [selectedValue, data, unit]); useEffect(() => { if (unit === "month") { @@ -98,48 +100,6 @@ const DatePickerItem: React.FC = ({ } }; - // const handleMouseDown = (event: React.MouseEvent) => { - // if (!isMobile) { - // setTouchY(event.clientY); - // document.addEventListener("mousemove", handleMouseMove); - // document.addEventListener("mouseup", handleMouseUp); - // } - // }; - - // const handleMouseMove = (event: MouseEvent) => { - // const deltaY = event.clientY - touchY; - // handleScroll(deltaY); - // setTouchY(event.clientY); - // }; - - // const handleMouseUp = () => { - // resetMouseState(); - // }; - - // const resetTouchState = () => { - // if (isMobile && scrollRef.current) { - // const selectedIndex = Math.round(-translateY / ITEM_HEIGHT); - // onSelect(data[selectedIndex]); - - // // Limit the translateY to ensure it aligns with a valid item - // setTranslateY(-selectedIndex * ITEM_HEIGHT); - // setTouchY(0); - // } - // }; - - // const resetMouseState = () => { - // document.removeEventListener("mousemove", handleMouseMove); - // document.removeEventListener("mouseup", handleMouseUp); - // resetTouchState(); - // }; - - // useEffect(() => { - // // Clean up mouse event listeners when the component unmounts - // return () => { - // resetMouseState(); - // }; - // }, []); - return (
    diff --git a/src/components/Compatibility/index.tsx b/src/components/Compatibility/index.tsx index a110b52..9ef9e3e 100644 --- a/src/components/Compatibility/index.tsx +++ b/src/components/Compatibility/index.tsx @@ -176,9 +176,6 @@ function CompatibilityPage(): JSX.Element { {!showNavbarFooter && (
    )} - {/* - {t("compatibility")} - */}
    {onboardingCompatibility && ( diff --git a/src/components/CreateProfilePage/ProcessFlow.tsx b/src/components/CreateProfilePage/ProcessFlow.tsx index 41f0e4a..60bdd34 100644 --- a/src/components/CreateProfilePage/ProcessFlow.tsx +++ b/src/components/CreateProfilePage/ProcessFlow.tsx @@ -38,9 +38,6 @@ const calculateTop = (currentIdx: number, length: number, items: HTMLDivElement[ if (!item) return accumulator; return accumulator + item.clientHeight }, 1) + 8 * getMultiplier(currentIdx, length) - - // const itemHeight = 63 - // return getMultiplier(currentIdx, length) * itemHeight1?.clientHeight } function ProcessFlow({ items, onDone }: ProcessFlowProps): JSX.Element { diff --git a/src/components/DidYouKnowPage/index.tsx b/src/components/DidYouKnowPage/index.tsx index 23aedb4..f6da302 100644 --- a/src/components/DidYouKnowPage/index.tsx +++ b/src/components/DidYouKnowPage/index.tsx @@ -1,44 +1,38 @@ -import { useNavigate } from 'react-router-dom' -import { useTranslation } from 'react-i18next' -import MainButton from '../MainButton' -import Title from '../Title' -import routes from '@/routes' -import styles from './styles.module.css' -import { useSelector } from 'react-redux' -import { selectors } from '@/store' -import { getZodiacSignByDate } from '@/services/zodiac-sign' -// import SpecialWelcomeOffer from '../SpecialWelcomeOffer' -// import { useState } from 'react' +import { useNavigate } from "react-router-dom"; +import { useTranslation } from "react-i18next"; +import MainButton from "../MainButton"; +import Title from "../Title"; +import routes from "@/routes"; +import styles from "./styles.module.css"; +import { useSelector } from "react-redux"; +import { selectors } from "@/store"; +import { getZodiacSignByDate } from "@/services/zodiac-sign"; function DidYouKnowPage(): JSX.Element { - const { t } = useTranslation() - const navigate = useNavigate() - const handleNext = () => navigate(routes.client.freePeriodInfo()) - // const [isOpenModal, setIsOpenModal] = useState(false) - // const handleSpecialOffer = () => { - // setIsOpenModal(true) - // } - const birthdate = useSelector(selectors.selectBirthdate) - const zodiacSign = getZodiacSignByDate(birthdate) - + const { t } = useTranslation(); + const navigate = useNavigate(); + const handleNext = () => navigate(routes.client.freePeriodInfo()); + const birthdate = useSelector(selectors.selectBirthdate); + const zodiacSign = getZodiacSignByDate(birthdate); return ( <section className={`${styles.page} page`}> - {/* <SpecialWelcomeOffer open={isOpenModal} /> */} <div className={styles.content}> - <Title variant='h1'>{t('did_you_know')} + {t("did_you_know")}

    - {t('zodiac_sign_info', { zodiacSign })} + {t("zodiac_sign_info", { zodiacSign })}

    - {t('learn_about_my_energy')} + {t("learn_about_my_energy")} - {t('skip_for_now')} + + {t("skip_for_now")} +
    - ) + ); } -export default DidYouKnowPage +export default DidYouKnowPage; diff --git a/src/components/FeedbackPage/index.tsx b/src/components/FeedbackPage/index.tsx index 024c450..3b26183 100644 --- a/src/components/FeedbackPage/index.tsx +++ b/src/components/FeedbackPage/index.tsx @@ -12,7 +12,7 @@ function FeedbackPage(): JSX.Element { const { t } = useTranslation(); const navigate = useNavigate(); const api = useApi(); - const handleNext = () => navigate(routes.client.emailEnter()); + const handleNext = () => navigate(routes.client.auth()); const assetsData = useCallback(async () => { const { assets } = await api.getAssets({ category: String("au") }); diff --git a/src/components/PaymentPage/index.tsx b/src/components/PaymentPage/index.tsx index c3f40e1..bd146cd 100644 --- a/src/components/PaymentPage/index.tsx +++ b/src/components/PaymentPage/index.tsx @@ -1,18 +1,10 @@ -import { useCallback, useState } from "react"; +import { useState } from "react"; import { useTranslation } from "react-i18next"; -import { useDispatch, useSelector } from "react-redux"; +import { useSelector } from "react-redux"; import { useNavigate } from "react-router-dom"; import { selectors } from "@/store"; import { usePayment } from "@/payment"; -import { actions } from "@/store"; -import { - ApplePayBanner, - // ApplePayButton, - GooglePayBanner, - // GooglePayButton, - // CardButton, - // CardModal, -} from "./methods"; +import { ApplePayBanner, GooglePayBanner } from "./methods"; import ErrorModal from "./ErrorModal"; import UserHeader from "../UserHeader"; import Title from "../Title"; @@ -21,33 +13,56 @@ import secure from "./secure.png"; import routes from "@/routes"; import "./styles.css"; import Header from "../Header"; -import { StripeButton, StripeModal } from "./methods/Stripe"; +import { StripeButton } from "./methods/Stripe"; +import { PayPalButton } from "./methods/PayPal/Button"; +import { useAuth } from "@/auth"; +import { useApi } from "@/api"; +import { PayPalReceiptPayload } from "@/api/resources/UserSubscriptionReceipts"; +import { ISubscriptionPlan } from "@/api/resources/SubscriptionPlans"; + +const getPrice = (activeSubPlan: ISubscriptionPlan | null) => { + if (!activeSubPlan) return 0; + return String( + activeSubPlan?.trial?.price_cents + ? activeSubPlan.trial.price_cents / 100 + : 0 + ); +}; function PaymentPage(): JSX.Element { const { t } = useTranslation(); const { applePay } = usePayment(); - // const [openCardModal, setOpenCardModal] = useState(false); - const [openStripeModal, setOpenStripeModal] = useState(false); + const api = useApi(); + const { token } = useAuth(); const [openErrorModal, setOpenErrorModal] = useState(false); - const dispatch = useDispatch(); const navigate = useNavigate(); const isLoading = applePay === null; const isApplePayAvailable = import.meta.env.PROD && applePay?.canMakePayments(); const email = useSelector(selectors.selectEmail); - const isDiscount = useSelector(selectors.selectIsDiscount); - const selectedPrice = useSelector(selectors.selectSelectedPrice); - const price = isDiscount - ? (Math.round(selectedPrice || 0) / 2).toFixed(2) - : selectedPrice; - const onSuccess = useCallback(() => { - dispatch(actions.status.update("subscribed")); - navigate(routes.client.wallpaper()); - }, [dispatch, navigate]); - const onError = useCallback((error: Error) => { - console.error(error); - setOpenErrorModal(true); - }, []); + const activeSubPlan = useSelector(selectors.selectActiveSubPlan); + + const navigateToStripe = () => { + navigate(routes.client.paymentStripe()); + }; + + const navigateToPayPal = async () => { + const { subscription_receipt } = await api.createSubscriptionReceipt({ + token, + itemInterval: "year", + way: "paypal", + subscription_receipt: { + sub_plan_id: activeSubPlan?.id || "", + }, + } as PayPalReceiptPayload); + const url = subscription_receipt.data.links?.find( + (link) => link.rel === "approve" + )?.href; + if (!url?.length) { + return setOpenErrorModal(true); + } + window.location.href = url; + }; return ( <> @@ -68,33 +83,21 @@ function PaymentPage(): JSX.Element { {t("choose_payment")} - {/* {isApplePayAvailable ? ( - - ) : ( - - )} -
    {t("or").toUpperCase()}
    - setOpenCardModal(true)} /> */} - setOpenStripeModal(true)} /> +
    + + +

    {t("will_be_charged", { strongText: ( - {t("trial_price", { price: price })} + + {t("trial_price", { + price: getPrice(activeSubPlan || null), + })} + ), })}

    - {/* setOpenCardModal(false)} - onSuccess={onSuccess} - onError={onError} - /> */} - setOpenStripeModal(false)} - onSuccess={onSuccess} - onError={onError} - /> setOpenErrorModal(false)} diff --git a/src/components/PaymentPage/methods/PayPal/Button.tsx b/src/components/PaymentPage/methods/PayPal/Button.tsx new file mode 100644 index 0000000..78e32a5 --- /dev/null +++ b/src/components/PaymentPage/methods/PayPal/Button.tsx @@ -0,0 +1,15 @@ +import { useTranslation } from "react-i18next"; +import MainButton from "@/components/MainButton"; + +interface IPayPalButtonProps { + onClick: () => void; +} + +export function PayPalButton({ onClick }: IPayPalButtonProps): JSX.Element { + const { t } = useTranslation(); + return ( + + {t("payPal")} + + ); +} diff --git a/src/components/PaymentPage/methods/Stripe/Button.tsx b/src/components/PaymentPage/methods/Stripe/Button.tsx index 2f35277..cba41d3 100644 --- a/src/components/PaymentPage/methods/Stripe/Button.tsx +++ b/src/components/PaymentPage/methods/Stripe/Button.tsx @@ -1,7 +1,6 @@ import { useTranslation } from 'react-i18next' import MainButton from '@/components/MainButton' -// import card from './card.svg' interface IStripeButtonProps { onClick: () => void @@ -11,7 +10,6 @@ export function StripeButton({ onClick }: IStripeButtonProps): JSX.Element { const { t } = useTranslation() return ( - {/* Credit / Debit Card */} {t('stripe')} ) diff --git a/src/components/PaymentPage/methods/Stripe/CheckoutForm.tsx b/src/components/PaymentPage/methods/Stripe/CheckoutForm.tsx index 2487d31..244fc4e 100644 --- a/src/components/PaymentPage/methods/Stripe/CheckoutForm.tsx +++ b/src/components/PaymentPage/methods/Stripe/CheckoutForm.tsx @@ -1,15 +1,18 @@ import MainButton from "@/components/MainButton"; import Title from "@/components/Title"; +import { actions } from "@/store"; import { PaymentElement, useElements, useStripe, } from "@stripe/react-stripe-js"; import { useState } from "react"; +import { useDispatch } from "react-redux"; export default function CheckoutForm() { const stripe = useStripe(); const elements = useElements(); + const dispatch = useDispatch(); const [message, setMessage] = useState(""); const [isProcessing, setIsProcessing] = useState(false); @@ -27,18 +30,22 @@ export default function CheckoutForm() { elements, confirmParams: { return_url: `https://${window.location.host}/payment/result`, - } + }, }); if (error) { setMessage(error?.message || "Oops! Something went wrong."); } - + dispatch(actions.status.update("subscribed")); setIsProcessing(false); }; return ( -
    + diff --git a/src/components/PaymentPage/methods/Stripe/Modal.tsx b/src/components/PaymentPage/methods/Stripe/Modal.tsx index daa0eea..f38259e 100644 --- a/src/components/PaymentPage/methods/Stripe/Modal.tsx +++ b/src/components/PaymentPage/methods/Stripe/Modal.tsx @@ -6,6 +6,9 @@ import { Stripe, loadStripe } from "@stripe/stripe-js"; import { Elements } from "@stripe/react-stripe-js"; import CheckoutForm from "./CheckoutForm"; import { useAuth } from "@/auth"; +import { useSelector } from "react-redux"; +import { selectors } from "@/store"; +import { PayPalReceiptPayload } from "@/api/resources/UserSubscriptionReceipts"; interface StripeModalProps { open: boolean; @@ -22,10 +25,11 @@ export function StripeModal({ StripeModalProps): JSX.Element { const api = useApi(); const { token } = useAuth(); + const activeSubPlan = useSelector(selectors.selectActiveSubPlan); const [stripePromise, setStripePromise] = useState | null>(null); const [clientSecret, setClientSecret] = useState(""); - const [isLoading, setIsLoading ] = useState(true); + const [isLoading, setIsLoading] = useState(true); useEffect(() => { (async () => { @@ -37,11 +41,14 @@ StripeModalProps): JSX.Element { useEffect(() => { if (!open) return; (async () => { - const { subscription_receipt } = await api.createSubscriptionReceipt({ token, + way: "paypal", itemInterval: "year", - }); + subscription_receipt: { + sub_plan_id: activeSubPlan?.id || "", + }, + } as PayPalReceiptPayload); const { client_secret } = subscription_receipt.data; setClientSecret(client_secret); setIsLoading(false); diff --git a/src/components/PaymentPage/results/SuccessPage/index.tsx b/src/components/PaymentPage/results/SuccessPage/index.tsx index ba9aed4..6d5e665 100644 --- a/src/components/PaymentPage/results/SuccessPage/index.tsx +++ b/src/components/PaymentPage/results/SuccessPage/index.tsx @@ -1,14 +1,20 @@ -import { useNavigate } from 'react-router-dom' +import { useNavigate } from "react-router-dom"; import { useTranslation } from "react-i18next"; -import routes from '@/routes' +import routes from "@/routes"; import styles from "./styles.module.css"; import Title from "@/components/Title"; import MainButton from "@/components/MainButton"; +import { useDispatch } from "react-redux"; +import { actions } from "@/store"; function PaymentSuccessPage(): JSX.Element { const { t } = useTranslation(); - const navigate = useNavigate() - const handleNext = () => navigate(routes.client.home()) + const navigate = useNavigate(); + const dispatch = useDispatch(); + const handleNext = () => { + dispatch(actions.status.update("subscribed")); + navigate(routes.client.home()); + }; return (
    @@ -17,7 +23,9 @@ function PaymentSuccessPage(): JSX.Element { {t("auweb.pay_good.title")}

    {t("auweb.pay_good.text1")}

    - {t("auweb.pay_good.button")} + + {t("auweb.pay_good.button")} + ); } diff --git a/src/components/PaymentPage/results/index.tsx b/src/components/PaymentPage/results/index.tsx index e9356e8..4871444 100644 --- a/src/components/PaymentPage/results/index.tsx +++ b/src/components/PaymentPage/results/index.tsx @@ -2,18 +2,22 @@ import { useNavigate } from "react-router-dom"; import routes from "@/routes"; import { useEffect } from "react"; import { useSearchParams } from "react-router-dom"; +import { useDispatch } from "react-redux"; +import { actions } from "@/store"; function PaymentResultPage(): JSX.Element { const navigate = useNavigate(); + const dispatch = useDispatch(); const [searchParams] = useSearchParams(); const status = searchParams.get("redirect_status"); useEffect(() => { if (status === "succeeded") { + dispatch(actions.status.update("subscribed")); return navigate(routes.client.paymentSuccess()); } return navigate(routes.client.paymentFail()); - }, [navigate, status]); + }, [navigate, status, dispatch]); return <>; } diff --git a/src/components/PaymentPage/styles.css b/src/components/PaymentPage/styles.css index e734aca..89be04d 100644 --- a/src/components/PaymentPage/styles.css +++ b/src/components/PaymentPage/styles.css @@ -41,7 +41,7 @@ .payment-inforamtion { font-size: 12px; line-height: 1.5; - letter-spacing: .0008em; + letter-spacing: 0.0008em; } .payment-chargebee { @@ -82,6 +82,13 @@ margin-right: 12px; } +.payment-form-stripe { + display: flex; + flex-direction: column; + align-items: center; + gap: 16px; +} + .payment-loader { display: flex; justify-content: center; @@ -100,6 +107,14 @@ font-weight: 500; } +.payment-buttons-container { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + gap: 16px; +} + .pay-btn, .gpay-button-fake-loader, .apple-pay-button-placeholder { @@ -138,6 +153,6 @@ display: flex; align-items: end; background-repeat: no-repeat; - background-color: rgba(0,0,0,.5); + background-color: rgba(0, 0, 0, 0.5); padding: 12px 15% 10px; } diff --git a/src/components/Policy/index.tsx b/src/components/Policy/index.tsx index b62527d..f4053ea 100644 --- a/src/components/Policy/index.tsx +++ b/src/components/Policy/index.tsx @@ -1,23 +1,27 @@ -import './styles.css' +import "./styles.css"; interface PolicyProps { - children: string - sizing?: 'small' | 'medium' | 'large' - className?: string + children: string | JSX.Element | null; + sizing?: "small" | "medium" | "large"; + className?: string; } const sizes = { - small: 'policy--small', - medium: 'policy--medium', - large: 'policy--large', -} + small: "policy--small", + medium: "policy--medium", + large: "policy--large", +}; -function Policy({ children, sizing = 'small', className = '' }: PolicyProps): JSX.Element { +function Policy({ + children, + sizing = "small", + className = "", +}: PolicyProps): JSX.Element { return (

    {children}

    - ) + ); } -export default Policy +export default Policy; diff --git a/src/components/PriceItem/index.tsx b/src/components/PriceItem/index.tsx index a930345..0b48af5 100644 --- a/src/components/PriceItem/index.tsx +++ b/src/components/PriceItem/index.tsx @@ -1,29 +1,17 @@ +import { removeAfterDot, roundToWhole } from "@/services/price"; import { Currency, Locale, Price } from "../PaymentTable"; -import { IPrice } from "../PriceList"; import styles from "./styles.module.css"; const currency = Currency.USD; const locale = Locale.EN; -const roundToWhole = (value: string | number): number => { - value = Number(value); - if (value % Math.floor(value) !== 0) { - return value; - } - return Math.floor(value); -}; -const removeAfterDot = (value: string): string => { - const _value = Number(value.split("$")[1]); - if (_value % Math.floor(_value) !== 0 && _value !== 0) { - return value; - } - return value.split(".")[0]; -}; interface PriceItemProps { + id: string, + value: number, active: boolean; - click: (id: number) => void; + click: (id: string) => void; } function PriceItem({ @@ -31,11 +19,11 @@ function PriceItem({ value, active, click, -}: IPrice & PriceItemProps): JSX.Element { +}: PriceItemProps): JSX.Element { const _price = new Price(roundToWhole(value), currency, locale); const compatClassName = () => { - const isPopular = id === 3; + const isPopular = id === 'stripe.7'; const isActive = active; return `${styles.container} ${isPopular ? styles.popular : ""} ${isActive ? styles.active : ""}`; }; diff --git a/src/components/PriceList/index.tsx b/src/components/PriceList/index.tsx index fd51fb6..b3a1bd9 100644 --- a/src/components/PriceList/index.tsx +++ b/src/components/PriceList/index.tsx @@ -1,64 +1,53 @@ -import { useState } from 'react' -import PriceItem from '../PriceItem' -import styles from './styles.module.css' -import { useDispatch } from 'react-redux' -import { actions } from '@/store' - -export interface IPrice { - id: number - value: number -} - -const prices: IPrice[] = [ - { - id: 1, - value: 0 - }, - { - id: 2, - value: 5 - }, - { - id: 3, - value: 9 - }, - { - id: 4, - value: 13.67 - }, -] +import { useState } from "react"; +import PriceItem from "../PriceItem"; +import styles from "./styles.module.css"; +import { useDispatch } from "react-redux"; +import { actions } from "@/store"; +import { ISubscriptionPlan } from "@/api/resources/SubscriptionPlans"; interface PriceListProps { - activeItem: number | null - click: () => void + subPlans: ISubscriptionPlan[]; + activeItem: number | null; + click: () => void; } -function PriceList({click}: PriceListProps): JSX.Element { - const dispatch = useDispatch(); - const [activePriceItem, setActivePriceItem] = useState(null) +const getPrice = (plan: ISubscriptionPlan) => { + return (plan.trial?.price_cents || 0) / 100; +}; - const priceItemClick = (id: number) => { - setActivePriceItem(id) - const activePriceItem = prices.find((item) => item.id === Number(id)) - if (activePriceItem) { +function PriceList({ click, subPlans }: PriceListProps): JSX.Element { + const dispatch = useDispatch(); + const [activePlanItem, setActivePlanItem] = + useState(null); + + const priceItemClick = (id: string) => { + const activePlan = subPlans.find((item) => item.id === String(id)) || null; + setActivePlanItem(activePlan); + if (activePlan) { dispatch( actions.payment.update({ - selectedPrice: activePriceItem.value + activeSubPlan: activePlan, }) ); } setTimeout(() => { - click() - }, 1000) - } + click(); + }, 1000); + }; return (
    - {prices.map((price, idx) => ( - + {subPlans.map((plan, idx) => ( + ))}
    - ) + ); } -export default PriceList +export default PriceList; diff --git a/src/components/PriceListPage/index.tsx b/src/components/PriceListPage/index.tsx index 554bc6d..69e6668 100644 --- a/src/components/PriceListPage/index.tsx +++ b/src/components/PriceListPage/index.tsx @@ -1,46 +1,87 @@ -import { useNavigate } from 'react-router-dom' -import routes from '@/routes' -import styles from './styles.module.css' -import UserHeader from '../UserHeader' -import { useDispatch, useSelector } from 'react-redux' -import { actions, selectors } from '@/store' -import Title from '../Title' -import { useTranslation } from 'react-i18next' -import EmailsList from '../EmailsList' -import PriceList from '../PriceList' +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import styles from "./styles.module.css"; +import UserHeader from "../UserHeader"; +import { useDispatch, useSelector } from "react-redux"; +import { actions, selectors } from "@/store"; +import Title from "../Title"; +import { useTranslation } from "react-i18next"; +import EmailsList from "../EmailsList"; +import PriceList from "../PriceList"; +import { useApi } from "@/api"; +import { useEffect, useState } from "react"; +import { ISubscriptionPlan } from "@/api/resources/SubscriptionPlans"; +import Loader from "../Loader"; function PriceListPage(): JSX.Element { - const { t } = useTranslation() - const navigate = useNavigate() + const { t, i18n } = useTranslation(); + const locale = i18n.language; + const api = useApi(); + const navigate = useNavigate(); const dispatch = useDispatch(); const homeConfig = useSelector(selectors.selectHome); - const selectedPrice = useSelector(selectors.selectSelectedPrice) - - const email = useSelector(selectors.selectEmail) + const selectedPrice = useSelector(selectors.selectSelectedPrice); + const [subPlans, setSubPlans] = useState([]); + const email = useSelector(selectors.selectEmail); + + useEffect(() => { + (async () => { + const { sub_plans } = await api.getSubscriptionPlans({ locale }); + const plans = sub_plans + .filter( + (plan: ISubscriptionPlan) => plan.provider === "stripe" && plan.trial + ) + .sort((a, b) => { + if (!a.trial || !b.trial) { + return 0; + } + if (a.trial.price_cents < b.trial.price_cents) { + return -1; + } + if (a.trial.price_cents > b.trial.price_cents) { + return 1; + } + return 0; + }); + setSubPlans(plans); + })(); + }, [api]); + const handleNext = () => { dispatch( actions.siteConfig.update({ home: { pathFromHome: homeConfig.pathFromHome, isShowNavbar: false }, }) ); - navigate(routes.client.subscription()) - } + navigate(routes.client.subscription()); + }; return ( <> - -
    - {t('choose_your_own_fee')} -

    {t('aura.web.price_selection')}

    -
    - + +
    + {!!subPlans.length && ( + <> + + {t("choose_your_own_fee")} + +

    {t("aura.web.price_selection")}

    +
    +
    -
    - +
    +
    -
    + + )} + {!subPlans.length && } +
    - ) + ); } -export default PriceListPage +export default PriceListPage; diff --git a/src/components/SpecialWelcomeOffer/index.tsx b/src/components/SpecialWelcomeOffer/index.tsx index eea012e..2305a2b 100644 --- a/src/components/SpecialWelcomeOffer/index.tsx +++ b/src/components/SpecialWelcomeOffer/index.tsx @@ -33,6 +33,10 @@ function SpecialWelcomeOffer({ open, onClose }: ModalTopProps): JSX.Element { navigate(routes.client.paymentMethod()); }; + const handleMoreAbout = () => { + window.location.href = "https://witapps.us/en/aura"; + }; + return ( <> {open ? ( @@ -69,9 +73,7 @@ function SpecialWelcomeOffer({ open, onClose }: ModalTopProps): JSX.Element { { - console.log("click"); - }} + onClick={handleMoreAbout} > Leo {t("au.more_llc.button")} diff --git a/src/components/StripePage/index.tsx b/src/components/StripePage/index.tsx new file mode 100644 index 0000000..dfa1ec4 --- /dev/null +++ b/src/components/StripePage/index.tsx @@ -0,0 +1,63 @@ +import { useApi } from "@/api"; +import Loader from "@/components/Loader"; +import { useEffect, useState } from "react"; +import { Stripe, loadStripe } from "@stripe/stripe-js"; +import { Elements } from "@stripe/react-stripe-js"; +import CheckoutForm from "../PaymentPage/methods/Stripe/CheckoutForm"; +import { useAuth } from "@/auth"; +import styles from "./styles.module.css"; +import { useSelector } from "react-redux"; +import { selectors } from "@/store"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; + +export function StripePage(): JSX.Element { + const api = useApi(); + const { token } = useAuth(); + const navigate = useNavigate(); + const activeSubPlan = useSelector(selectors.selectActiveSubPlan); + const [stripePromise, setStripePromise] = + useState | null>(null); + const [clientSecret, setClientSecret] = useState(""); + const [isLoading, setIsLoading] = useState(true); + if (!activeSubPlan) { + navigate(routes.client.priceList()); + } + + useEffect(() => { + (async () => { + const siteConfig = await api.getAppConfig({ bundleId: "auraweb" }); + setStripePromise(loadStripe(siteConfig.data.stripe_public_key)); + })(); + }, [api]); + + useEffect(() => { + (async () => { + const { subscription_receipt } = await api.createSubscriptionReceipt({ + token, + way: "stripe", + subscription_receipt: { + sub_plan_id: activeSubPlan?.id || "stripe.7", + }, + }); + const { client_secret } = subscription_receipt.data; + setClientSecret(client_secret); + setIsLoading(false); + })(); + }, [api, token]); + + return ( +
    + {isLoading ? ( +
    + +
    + ) : null} + {stripePromise && clientSecret && ( + + + + )} +
    + ); +} diff --git a/src/components/StripePage/styles.module.css b/src/components/StripePage/styles.module.css new file mode 100644 index 0000000..dda5732 --- /dev/null +++ b/src/components/StripePage/styles.module.css @@ -0,0 +1,16 @@ +.page { + position: relative; + /* height: calc(100vh - 50px); + max-height: -webkit-fill-available; */ + flex: auto; + justify-content: center; + display: grid; + grid-template-rows: 1fr 96px; + justify-items: center; +} + +.payment-loader { + display: flex; + justify-content: center; + align-items: center; +} diff --git a/src/components/SubscriptionPage/index.tsx b/src/components/SubscriptionPage/index.tsx index 1addcd2..11b7161 100644 --- a/src/components/SubscriptionPage/index.tsx +++ b/src/components/SubscriptionPage/index.tsx @@ -13,28 +13,34 @@ import styles from "./styles.module.css"; import Header from "../Header"; import SpecialWelcomeOffer from "../SpecialWelcomeOffer"; import { useState } from "react"; +import { ITrial } from "@/api/resources/SubscriptionPlans"; const currency = Currency.USD; const locale = Locale.EN; -const itemPriceId = "aura-membership-2-week-USD"; + +const getPriceFromTrial = (trial: ITrial | null) => { + if (!trial) { + return 0; + } + return (trial.price_cents || 0) / 100; +}; function SubscriptionPage(): JSX.Element { const [isOpenModal, setIsOpenModal] = useState(false); const { t } = useTranslation(); + const activeSubPlan = useSelector(selectors.selectActiveSubPlan); const paymentItems = [ { - title: "Per 7-Day Trial For", - price: 1.0, - description: t("au.2week_plan.web"), + title: activeSubPlan?.name || "Per 7-Day Trial For", + price: getPriceFromTrial(activeSubPlan?.trial || null), + description: activeSubPlan?.desc.length + ? activeSubPlan?.desc + : t("au.2week_plan.web"), }, ]; + const navigate = useNavigate(); const email = useSelector(selectors.selectEmail); - const itemPrice = useSelector(selectors.selectPlanById(itemPriceId)); - const selectedPrice = useSelector(selectors.selectSelectedPrice); - if (selectedPrice || selectedPrice === 0) { - paymentItems[0].price = selectedPrice; - } const handleClick = () => navigate(routes.client.paymentMethod()); const handleCross = () => setIsOpenModal(true); const policyLink = ( @@ -42,13 +48,13 @@ function SubscriptionPage(): JSX.Element { {t("subscription_policy")} ); - console.log({ itemPrice }); + return ( <>
    -
    +
    {t("get_access")}
    - {t("subscription_text", { policyLink })} + + <> + {t("auweb.agree.text1")} + {t("subscription_text", { policyLink })} + + ); diff --git a/src/components/SubscriptionPage/styles.module.css b/src/components/SubscriptionPage/styles.module.css index 97d1d54..15061b0 100644 --- a/src/components/SubscriptionPage/styles.module.css +++ b/src/components/SubscriptionPage/styles.module.css @@ -1,3 +1,7 @@ +.page { + padding-bottom: 32px !important; +} + .subscription-action { position: fixed; bottom: 0; @@ -5,7 +9,7 @@ right: 0; display: flex; justify-content: center; - background-color: #fff; + background-color: transparent; padding: 15px; } diff --git a/src/components/WallpaperPage/index.tsx b/src/components/WallpaperPage/index.tsx index 3719670..7dd060a 100644 --- a/src/components/WallpaperPage/index.tsx +++ b/src/components/WallpaperPage/index.tsx @@ -47,7 +47,9 @@ function getZodiacParagraphs( {paragraph.title} {getTypeOfContent(paragraph.content) === "string" - ? paragraph.content.map((content, _index) =>

    {content as string}

    ) + ? paragraph.content.map((content, _index) => ( +

    {content as string}

    + )) : getZodiacParagraphs(paragraph.content as ZodiacParagraph[], depth)}
    ); @@ -58,7 +60,7 @@ function WallpaperPage(): JSX.Element { const api = useApi(); const { i18n } = useTranslation(); const locale = i18n.language; - const token = useSelector(selectors.selectToken) + const token = useSelector(selectors.selectToken); const { user, @@ -111,20 +113,6 @@ function WallpaperPage(): JSX.Element { ))} - {/*

    - {t("analysis_background")} -

    */} - {/* {forecasts.map((forecast) => ( -
    -

    - {forecast.category} -

    -

    {forecast.body}

    -
    - ))} */}
    {getZodiacParagraphs(zodiacInfo?.paragraphs || [])}
    diff --git a/src/locales/dev.ts b/src/locales/dev.ts index d9a557b..b428b63 100644 --- a/src/locales/dev.ts +++ b/src/locales/dev.ts @@ -35,7 +35,7 @@ export default { charged_only: "You will be charged only for your 7-day trial. We'll email you a reminder before your trial period ends. Cancel anytime.", purposes: "For entertaiment purposes only.", get_access: "Get access", - subscription_text: "By proceeding, you agree that if you do not cancel your subscription before the end of the 7-day trial period, you will be automatically charged nineteen US dollars zero cents every 2 weeks until you cancel the subscription in the settings. Learn more about cancellation and refund policy in ", + subscription_text: " Learn more about cancellation and refund policy in ", subscription_policy: "Subscription policy", company_name: "Wit Apps LLC, California, US", choose_payment: "Choose Payment Method", @@ -81,6 +81,7 @@ export default { you_and: "You and ", sign: "Sign", stripe: "Stripe", + payPal: "PayPal", 'aura-10_breath-button': "Increase up to 10%. Practice for the Energy of Money", 'aura-money_compatibility-button': "low MONEY energy. Determine who drains your energy", "breathe-subtitle": "Breathing practice will help improve your aura. Breath in the positive energy, breathe out the negative...", diff --git a/src/routes.ts b/src/routes.ts index fd689fa..7ca5f05 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -1,7 +1,8 @@ import type { UserStatus } from "./types"; const host = ""; -const apiHost = "https://aura.wit.life"; +export const apiHost = "https://api-web.aura.wit.life"; +const siteHost = "https://aura.wit.life"; const prefix = "api/v1"; const routes = { @@ -12,6 +13,8 @@ const routes = { freePeriodInfo: () => [host, "free-period"].join("/"), birthtime: () => [host, "birthtime"].join("/"), emailEnter: () => [host, "email"].join("/"), + authResult: () => [host, "auth", "result"].join("/"), + auth: () => [host, "auth"].join("/"), subscription: () => [host, "subscription"].join("/"), createProfile: () => [host, "profile", "create"].join("/"), attention: () => [host, "attention"].join("/"), @@ -20,6 +23,7 @@ const routes = { paymentResult: () => [host, "payment", "result"].join("/"), paymentSuccess: () => [host, "payment", "success"].join("/"), paymentFail: () => [host, "payment", "fail"].join("/"), + paymentStripe: () => [host, "payment", "stripe"].join("/"), wallpaper: () => [host, "wallpaper"].join("/"), static: () => [host, "static", ":typeId"].join("/"), legal: (type: string) => [host, "static", type].join("/"), @@ -31,10 +35,13 @@ const routes = { breathResult: () => [host, "breath", "result"].join("/"), }, server: { + appleAuth: (origin: string) => [apiHost, "auth", "apple", `gate?origin=${origin}`].join("/"), + googleAuth: (origin: string) => [apiHost, "auth", "google", `gate?origin=${origin}`].join("/"), user: () => [apiHost, prefix, "user.json"].join("/"), token: () => [apiHost, prefix, "auth", "token.json"].join("/"), elements: () => [apiHost, prefix, "elements.json"].join("/"), - zodiacs: (zodiac: string) => [apiHost, prefix, "zodiacs", `${zodiac}.json`].join("/"), + zodiacs: (zodiac: string) => + [apiHost, prefix, "zodiacs", `${zodiac}.json`].join("/"), element: (type: string) => [apiHost, prefix, "elements", `${type}.json`].join("/"), apps: (bundleId: string) => @@ -50,6 +57,7 @@ const routes = { [apiHost, prefix, "user", "payment_intents.json"].join("/"), subscriptionItems: () => [apiHost, prefix, "user", "subscription", "item_prices.json"].join("/"), + subscriptionPlans: () => [apiHost, prefix, "sub_plans.json"].join("/"), subscriptionCheckout: () => [apiHost, prefix, "user", "subscription", "checkout", "new.json"].join( "/" @@ -71,7 +79,7 @@ const routes = { [apiHost, prefix, "user", "callbacks.json"].join("/"), getUserCallbacks: (id: string) => [apiHost, prefix, "user", "callbacks", `${id}.json`].join("/"), - getTranslations: () => [apiHost, "api/v2", "t.json"].join("/"), + getTranslations: () => [siteHost, "api/v2", "t.json"].join("/"), }, }; @@ -101,7 +109,7 @@ export const hasNoNavigation = (path: string) => !hasNavigation(path); export const withCrossButtonRoutes = [ // routes.client.attention(), routes.client.subscription(), - routes.client.paymentMethod() + routes.client.paymentMethod(), ]; export const hasCrossButton = (path: string) => withCrossButtonRoutes.includes(path); @@ -121,6 +129,7 @@ export const withoutFooterRoutes = [ routes.client.paymentResult(), routes.client.paymentSuccess(), routes.client.paymentFail(), + routes.client.paymentStripe(), ]; export const hasNoFooter = (path: string) => !withoutFooterRoutes.includes(path); @@ -155,7 +164,7 @@ export const getRouteBy = (status: UserStatus): string => { case "unsubscribed": return routes.client.subscription(); case "subscribed": - return routes.client.wallpaper(); + return routes.client.home(); default: throw new Error(`Unknown user status, received status is "${status}"`); } diff --git a/src/services/price/index.ts b/src/services/price/index.ts new file mode 100644 index 0000000..52afca5 --- /dev/null +++ b/src/services/price/index.ts @@ -0,0 +1,15 @@ +export const roundToWhole = (value: string | number): number => { + value = Number(value); + if (value % Math.floor(value) !== 0) { + return value; + } + return Math.floor(value); +}; + +export const removeAfterDot = (value: string): string => { + const _value = Number(value.split("$")[1]); + if (_value % Math.floor(_value) !== 0 && _value !== 0) { + return value; + } + return value.split(".")[0]; +}; diff --git a/src/store/index.ts b/src/store/index.ts index b7df392..6288770 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -24,6 +24,7 @@ import onboardingConfig, { } from "./onboarding"; import payment, { actions as paymentActions, + selectActiveSubPlan, selectIsDiscount, } from "./payment"; import subscriptionPlans, { @@ -71,6 +72,7 @@ export const selectors = { selectSelfName, selectCategoryId, selectSelectedPrice, + selectActiveSubPlan, selectUserCallbacksDescription, selectUserCallbacksPrevStat, selectHome, diff --git a/src/store/payment.ts b/src/store/payment.ts index c4d7de4..908ad06 100644 --- a/src/store/payment.ts +++ b/src/store/payment.ts @@ -1,14 +1,17 @@ +import { ISubscriptionPlan } from "@/api/resources/SubscriptionPlans"; import { createSlice, createSelector } from "@reduxjs/toolkit"; import type { PayloadAction } from "@reduxjs/toolkit"; interface IPayment { selectedPrice: number | null; isDiscount: boolean; + activeSubPlan: ISubscriptionPlan | null; } const initialState: IPayment = { selectedPrice: null, isDiscount: false, + activeSubPlan: null }; const paymentSlice = createSlice({ @@ -27,6 +30,10 @@ export const selectSelectedPrice = createSelector( (state: { payment: IPayment }) => state.payment.selectedPrice, (payment) => payment ); +export const selectActiveSubPlan = createSelector( + (state: { payment: IPayment }) => state.payment.activeSubPlan, + (payment) => payment +); export const selectIsDiscount = createSelector( (state: { payment: IPayment }) => state.payment.isDiscount, (payment) => payment diff --git a/src/types.ts b/src/types.ts index 9ff926b..e124ca4 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,8 +1,8 @@ -import { Chargebee } from '@chargebee/chargebee-js-types' +import { Chargebee } from "@chargebee/chargebee-js-types"; declare global { interface Window { - Chargebee: typeof Chargebee + Chargebee: typeof Chargebee; } } @@ -14,19 +14,19 @@ export enum EDirectionOnboarding { } export interface FormField { - name: string - value: T - label?: string | null - placeholder?: string | null - inputClassName?: string - onValid: (value: string) => void - onInvalid: () => void + name: string; + value: T; + label?: string | null; + placeholder?: string | null; + inputClassName?: string; + onValid: (value: string) => void; + onInvalid: () => void; } export interface SignupForm { - email: string - birthdate: string - birthtime: string + email: string; + birthdate: string; + birthtime: string; } -export type UserStatus = 'lead' | 'registred' | 'subscribed' | 'unsubscribed' +export type UserStatus = "lead" | "registred" | "subscribed" | "unsubscribed";