From 6e0dfc7e3a3a881638661a8e730cc700c62f8651 Mon Sep 17 00:00:00 2001 From: Tristan Yang Date: Thu, 22 Sep 2022 11:41:28 +0800 Subject: [PATCH] feat: license payment --- src/app/config.ts | 24 +++ src/app/services/server.ts | 22 ++- src/assets/icons/check.png | Bin 0 -> 39672 bytes src/common/hook/useLicense.ts | 6 +- src/routes/callback/PaymentSuccess.tsx | 71 ++++++++ src/routes/callback/index.tsx | 18 ++ src/routes/callback/styled.tsx | 13 ++ src/routes/index.tsx | 2 + src/routes/setting/License.tsx | 173 +++++++------------ src/routes/setting/LicensePriceListModal.tsx | 76 ++++++++ src/routes/setting/Overview.tsx | 1 - src/types/server.ts | 14 ++ 12 files changed, 301 insertions(+), 119 deletions(-) create mode 100644 src/assets/icons/check.png create mode 100644 src/routes/callback/PaymentSuccess.tsx create mode 100644 src/routes/callback/index.tsx create mode 100644 src/routes/callback/styled.tsx create mode 100644 src/routes/setting/LicensePriceListModal.tsx diff --git a/src/app/config.ts b/src/app/config.ts index e8b8353f..42a6373c 100644 --- a/src/app/config.ts +++ b/src/app/config.ts @@ -3,6 +3,30 @@ const BASE_URL = process.env.REACT_APP_RELEASE ? `${location.origin}/api` : `https://dev.voce.chat/api`; +export const LicensePriceList = [ + { + title: "VoceChat Pro", + limit: 100, + pid: "price_1LkICIGGoUDRyc3jqrdPEnkY", + desc: "User Limit: 100" + }, + { + title: "VoceChat Supreme", + limit: 99999, + pid: "price_1LkKqdGGoUDRyc3jnpZvXhzx", + desc: "User Limit: No Limit" + } + // { + // title: "VoceChat Enterprise", + // limit: 500, + // // pid: "price_1LkJNsGGoUDRyc3jkVNf4VPE", + // pid: "price_1LkQGpGGoUDRyc3jGTh3GYHw", + // desc: "User Limit: 500" + // } +]; +export const PAYMENT_URL_PREFIX = process.env.REACT_APP_RELEASE + ? `https://vera.nicegoodthings.com` + : `http://localhost:4000`; export const CACHE_VERSION = `0.3.1`; export const GuestRoutes = ["/", "/chat", "/chat/channel/:channel_id"]; export const ContentTypes = { diff --git a/src/app/services/server.ts b/src/app/services/server.ts index 0c750b50..ab34be1d 100644 --- a/src/app/services/server.ts +++ b/src/app/services/server.ts @@ -1,5 +1,5 @@ import { createApi } from "@reduxjs/toolkit/query/react"; -import BASE_URL from "../config"; +import BASE_URL, { PAYMENT_URL_PREFIX } from "../config"; import { updateInfo } from "../slices/server"; import baseQuery from "./base.query"; import { RootState } from "../store"; @@ -14,7 +14,9 @@ import { SMTPConfig, AgoraConfig, GithubAuthConfig, - LicenseResponse + LicenseResponse, + RenewLicense, + RenewLicenseResponse } from "../../types/server"; const defaultExpireDuration = 7 * 24 * 60 * 60; @@ -195,6 +197,18 @@ export const serverApi = createApi({ }) }), + getLicensePaymentUrl: builder.mutation({ + query: (data) => ({ + url: `${PAYMENT_URL_PREFIX}/vocechat/payment/create`, + method: "POST", + body: data + }) + }), + getGeneratedLicense: builder.query<{ license: string }, string>({ + query: (session_id) => ({ + url: `${PAYMENT_URL_PREFIX}/vocechat/licenses/${session_id}` + }) + }), checkLicense: builder.mutation({ query: (license) => ({ url: "/license/check", @@ -241,5 +255,7 @@ export const { useCreateAdminMutation, useUpsertLicenseMutation, useCheckLicenseMutation, - useGetLicenseQuery + useGetLicenseQuery, + useGetLicensePaymentUrlMutation, + useLazyGetGeneratedLicenseQuery } = serverApi; diff --git a/src/assets/icons/check.png b/src/assets/icons/check.png new file mode 100644 index 0000000000000000000000000000000000000000..21c304652d3a7b9b8849332c7141c4d69d98a4f9 GIT binary patch literal 39672 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 STzASa0D-5gpUXO@geCwqwf$EB literal 0 HcmV?d00001 diff --git a/src/common/hook/useLicense.ts b/src/common/hook/useLicense.ts index 07a9c096..8c090b96 100644 --- a/src/common/hook/useLicense.ts +++ b/src/common/hook/useLicense.ts @@ -4,8 +4,10 @@ import { useGetLicenseQuery, useUpsertLicenseMutation } from "../../app/services/server"; +import { useAppSelector } from "../../app/store"; const useLicense = () => { + const userCount = useAppSelector((store) => store.users.ids.length); const { data: license } = useGetLicenseQuery(); const [check, { isLoading: isChecking, isSuccess: checked }] = useCheckLicenseMutation(); const [upsert, { isSuccess: upserted, isLoading: upserting }] = useUpsertLicenseMutation(); @@ -21,8 +23,10 @@ const useLicense = () => { return false; } }; - + console.log("uuu", userCount, license); + const lUserLimit = license?.user_limit ?? 0; return { + reachLimit: userCount >= lUserLimit, license, checked, checking: isChecking, diff --git a/src/routes/callback/PaymentSuccess.tsx b/src/routes/callback/PaymentSuccess.tsx new file mode 100644 index 00000000..e1f56c97 --- /dev/null +++ b/src/routes/callback/PaymentSuccess.tsx @@ -0,0 +1,71 @@ +import { useEffect } from "react"; +import styled from "styled-components"; +import { useLazyGetGeneratedLicenseQuery } from "../../app/services/server"; +import useLicense from "../../common/hook/useLicense"; +import Button from "../../common/component/styled/Button"; +import checkIcon from "../../assets/icons/check.png"; +import { useNavigate } from "react-router-dom"; +const Styled = styled.section` + display: flex; + flex-direction: column; + align-items: center; + padding: 24px; + width: 512px; + background: #f3f4f6; + border-radius: 20px; + .check { + width: 120px; + height: 120px; + } + .head { + font-weight: bold; + font-size: 32px; + padding-top: 20px; + } + .desc { + font-size: 18px; + color: #999; + padding: 0 0 30px 0; + } +`; + +type Props = { + sid: string; +}; + +const PaymentSuccess = ({ sid }: Props) => { + const navigateTo = useNavigate(); + const { upsertLicense, upserting, upserted } = useLicense(); + const [getGeneratedLicense, { data, isError, isLoading, isSuccess }] = + useLazyGetGeneratedLicenseQuery(); + useEffect(() => { + if (sid) { + getGeneratedLicense(sid); + } + }, [sid]); + useEffect(() => { + if (isSuccess && data) { + const l = data.license; + upsertLicense(l); + } + }, [data, isSuccess]); + const handleBack = () => { + navigateTo("/"); + }; + return ( + + check icon +

Payment Success!

+

+ {upserting ? "Renewing the License, do not close the window!" : ""} + {upserted ? "Renew the License Successfully!" : ""} + {isError ? "Invalided Stripe Session ID" : ""} +

+ +
+ ); +}; + +export default PaymentSuccess; diff --git a/src/routes/callback/index.tsx b/src/routes/callback/index.tsx new file mode 100644 index 00000000..8c08380e --- /dev/null +++ b/src/routes/callback/index.tsx @@ -0,0 +1,18 @@ +import { useParams } from "react-router-dom"; +import PaymentSuccess from "./PaymentSuccess"; +import StyledWrapper from "./styled"; +// type Props = { +// type: "payment_success"; +// }; +// 该页面服务于一些第三方服务的回调,比如stripe付款成功的回调 +export default function CallbackPage() { + const { type = "", payload = "" } = useParams(); + if (type == "payment_success") { + return ( + + + + ); + } + return callback page; +} diff --git a/src/routes/callback/styled.tsx b/src/routes/callback/styled.tsx new file mode 100644 index 00000000..b3eb1582 --- /dev/null +++ b/src/routes/callback/styled.tsx @@ -0,0 +1,13 @@ +import styled from "styled-components"; + +const StyledWrapper = styled.div` + display: flex; + width: 100vw; + height: 100vh; + justify-content: center; + align-items: center; + word-break: break-word; + line-height: 1.5; +`; + +export default StyledWrapper; diff --git a/src/routes/index.tsx b/src/routes/index.tsx index 55112189..587b36e1 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -14,6 +14,7 @@ const RegPage = lazy(() => import("./reg/Register")); const LoginPage = lazy(() => import("./login")); const OAuthPage = lazy(() => import("./oauth")); const UsersPage = lazy(() => import("./users")); +const CallbackPage = lazy(() => import("./callback")); const FavoritesPage = lazy(() => import("./favs")); const OnboardingPage = lazy(() => import("./onboarding")); const InvitePage = lazy(() => import("./invite")); @@ -51,6 +52,7 @@ const PageRoutes = () => { }> } /> + } /> } /> .input { + > .license { width: 100%; display: flex; - flex-direction: column; + /* flex-direction: column; */ align-items: flex-start; - gap: 8px; + gap: 15px; } `; export default function License() { - const { license: licenseInfo, checking, upserting, upsertLicense } = useLicense(); - const [license, setLicense] = useState(""); - const handleUpsert = async () => { - if (!license) { - toast.error("License Empty"); - hideAll(); - return; - } - const success = await upsertLicense(license); - if (!success) { - toast.error("Invalid License"); - hideAll(); - } else { - toast.success("License Updated!"); - } + const { license: licenseInfo } = useLicense(); + const [modalVisible, setModalVisible] = useState(false); + const handleRenewLicense = () => { + toggleModalVisible(); }; - const handleLicenseInput = (evt: ChangeEvent) => { - setLicense(evt.target.value); + const toggleModalVisible = () => { + setModalVisible((prev) => !prev); }; - useEffect(() => { - if (licenseInfo?.base58) { - setLicense(licenseInfo.base58); - } - }, [licenseInfo]); - const disableBtn = checking || upserting || !license || license === licenseInfo?.base58; + // const disableBtn = !reachLimit; return ( - -
- -
- Signed - {licenseInfo?.sign ? "Yes" : "Not Yet"} -
-
- Domains -
    - {" "} - {licenseInfo?.domains.map((d) => { - return
  • {d}
  • ; - })} -
-
-
- User Limit - {licenseInfo?.user_limit} -
-
- Expired At - - {dayjs(licenseInfo?.expired_at).format("YYYY-MM-DD h:mm:ss A")} - -
-
- Created At - - {dayjs(licenseInfo?.created_at).format("YYYY-MM-DD h:mm:ss A")} - -
- - } - > -