Skip to content

Commit fca7a92

Browse files
committed
[fixes ✅ ] pricing , subscription store , feedback from
1 parent d28704e commit fca7a92

File tree

7 files changed

+122
-134
lines changed

7 files changed

+122
-134
lines changed

package-lock.json

Lines changed: 26 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"zod": "^3.22.4"
3737
},
3838
"devDependencies": {
39+
"@typeform/embed-react": "^3.17.0",
3940
"@types/js-cookie": "^3.0.6",
4041
"@types/lodash": "^4.17.0",
4142
"@types/node": "^20.11.25",

src/components/ContactUS.tsx

Lines changed: 12 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { PopupButton } from "@typeform/embed-react";
12
export default function ContactUS() {
23
return (
34
<section
@@ -80,88 +81,18 @@ export default function ContactUS() {
8081
in touch with us. We look forward to hearing from you!
8182
</p>
8283
</div>
83-
<div className="mt-12">
84-
<form
85-
action="#"
86-
className="grid grid-cols-1 gap-y-6 sm:grid-cols-2 sm:gap-x-8"
87-
method="POST"
84+
<PopupButton
85+
id={String(import.meta.env.VITE_APP_TYPEFORM_FEEDBACK_ID)}
86+
style={{ fontSize: 20 ,width: "100%", marginTop: "20px"}}
87+
className="my-button"
88+
>
89+
<button
90+
className="w-full inline-flex items-center justify-center px-6 py-3 border border-transparent rounded-md shadow-sm text-base font-medium text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500"
91+
type="submit"
8892
>
89-
<div>
90-
<label
91-
className="block text-sm font-medium text-gray-700"
92-
htmlFor="first-name"
93-
>
94-
Name
95-
</label>
96-
<div className="mt-1">
97-
<input
98-
autoComplete="given-name"
99-
className="py-3 px-4 block w-full shadow-sm focus:ring-indigo-500 focus:border-indigo-500 border-gray-300 rounded-md"
100-
id="first-name"
101-
name="first-name"
102-
type="text"
103-
/>
104-
</div>
105-
</div>
106-
<div>
107-
<label
108-
className="block text-sm font-medium text-gray-700"
109-
htmlFor="email"
110-
>
111-
Email Address
112-
</label>
113-
<div className="mt-1">
114-
<input
115-
autoComplete="email"
116-
className="py-3 px-4 block w-full shadow-sm focus:ring-indigo-500 focus:border-indigo-500 border-gray-300 rounded-md"
117-
id="email"
118-
name="email"
119-
type="email"
120-
/>
121-
</div>
122-
</div>
123-
<div className="sm:col-span-2">
124-
<label
125-
className="block text-sm font-medium text-gray-700"
126-
htmlFor="subject"
127-
>
128-
Subject
129-
</label>
130-
<div className="mt-1">
131-
<input
132-
className="py-3 px-4 block w-full shadow-sm focus:ring-indigo-500 focus:border-indigo-500 border-gray-300 rounded-md"
133-
id="subject"
134-
name="subject"
135-
type="text"
136-
/>
137-
</div>
138-
</div>
139-
<div className="sm:col-span-2">
140-
<label
141-
className="block text-sm font-medium text-gray-700"
142-
htmlFor="message"
143-
>
144-
Your Message
145-
</label>
146-
<div className="mt-1">
147-
<textarea
148-
className="py-3 px-4 block w-full shadow-sm focus:ring-indigo-500 focus:border-indigo-500 border border-gray-300 rounded-md"
149-
id="message"
150-
name="message"
151-
rows={4}
152-
/>
153-
</div>
154-
</div>
155-
<div className="sm:col-span-2">
156-
<button
157-
className="w-full inline-flex items-center justify-center px-6 py-3 border border-transparent rounded-md shadow-sm text-base font-medium text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500"
158-
type="submit"
159-
>
160-
Send Message
161-
</button>
162-
</div>
163-
</form>
164-
</div>
93+
Send Your FeedBack/Query
94+
</button>
95+
</PopupButton>
16596
</div>
16697
</section>
16798
);

src/components/Pricing.tsx

Lines changed: 27 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,17 @@
1-
import handleCheckout from "@/api/payment/handleCheckout";
2-
import { Button } from "@/components/ui/button";
3-
import { useAuthStatus } from "@/hooks/useAuthStatus";
4-
import { useSubscription } from "@/hooks/useSubscription";
5-
import { SVGProps, useEffect, useState } from "react";
1+
import { SVGProps, useEffect } from "react";
62
import toast from "react-hot-toast";
73
import { useLocation, useNavigate } from "react-router-dom";
4+
import SubscriptionButton from "./SubscriptionButton";
85

96
export default function Pricing() {
10-
const {isProUser}=useSubscription();
11-
const {status}=useAuthStatus();
12-
const [sessionUrl,setSessionUrl]=useState<string>("");
137
const { search } = useLocation();
148
const params = new URLSearchParams(search);
15-
const navigate = useNavigate();
16-
useEffect(() => {
17-
if(status){
18-
handleCheckout().then((redirect_url) => {
19-
console.log(redirect_url);
20-
setSessionUrl(redirect_url);
21-
}).catch(() => {
22-
toast.error("Error in Generating you session Url");
23-
});
24-
}
25-
}, [status]);
9+
if (params.get("redirect") && params.get("redirect") === "billingportal") {
10+
return <Redirecting to="/" />;
11+
}
2612
if (params.get("success") == "true") {
2713
toast.success("Payment SuccessFul");
28-
setTimeout(() => {
29-
navigate("/test");
30-
}, 2000);
31-
return (
32-
<section className="w-full py-12 bg-gradient-to-r from-gray-50 to-gray-100 dark:from-zinc-900 dark:to-zinc-800 flex items-center justify-center h-screen flex-col sm:flex-row">
33-
<CheckIcon /> Redirecting to DashBoard{" "}
34-
<span className="animate-bounce text-xl font-extrabold">.</span>
35-
<span className="animate-bounce text-xl font-extrabold">.</span>
36-
<span className="animate-bounce text-xl font-extrabold">.</span>
37-
<span className="animate-bounce text-xl font-extrabold">.</span>
38-
</section>
39-
);
14+
return <Redirecting to="/test" />;
4015
}
4116
if (params.get("success") == "false") {
4217
toast.error("Payment Failed");
@@ -72,18 +47,7 @@ export default function Pricing() {
7247
</ul>
7348
</div>
7449
<div className="mt-6">
75-
<Button
76-
className="w-full bg-gradient-to-r from-pink-500 to-purple-500"
77-
onClick={() => {
78-
if(!status){
79-
navigate("/login");
80-
}else{
81-
window.location.href=sessionUrl;
82-
}
83-
}}
84-
>
85-
{ (status && isProUser) ? "Manage Subscription" : "Subscribe Now"}
86-
</Button>
50+
<SubscriptionButton />
8751
</div>
8852
</div>
8953
</section>
@@ -109,3 +73,23 @@ function CheckIcon(props: JSX.IntrinsicAttributes & SVGProps<SVGSVGElement>) {
10973
);
11074
}
11175

76+
function Redirecting({ to = "/" }: { to: string }) {
77+
const navigate = useNavigate();
78+
useEffect(() => {
79+
const id = setTimeout(() => {
80+
navigate(`${to}`);
81+
}, 2000);
82+
return () => {
83+
clearTimeout(id);
84+
};
85+
}, []);
86+
return (
87+
<section className="w-full py-12 bg-gradient-to-r from-gray-50 to-gray-100 dark:from-zinc-900 dark:to-zinc-800 flex items-center justify-center h-screen flex-col sm:flex-row">
88+
<CheckIcon /> Redirecting{" "}
89+
<span className="animate-bounce text-xl font-extrabold">.</span>
90+
<span className="animate-bounce text-xl font-extrabold">.</span>
91+
<span className="animate-bounce text-xl font-extrabold">.</span>
92+
<span className="animate-bounce text-xl font-extrabold">.</span>
93+
</section>
94+
);
95+
}

src/components/SubscriptionButton.tsx

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import handleCheckout from "@/api/payment/handleCheckout";
2+
import { useAuthStatus } from "@/hooks/useAuthStatus";
3+
import { useSubscription } from "@/hooks/useSubscription";
4+
import React, { useEffect, useState } from "react";
5+
import { Button } from "./ui/button";
6+
import toast from "react-hot-toast";
7+
import { useNavigate } from "react-router-dom";
8+
9+
const SubscribeButton = () => {
10+
const { isProUser } = useSubscription();
11+
const { status } = useAuthStatus();
12+
const [sessionUrl, setSessionUrl] = useState<string>("");
13+
const navigate = useNavigate();
14+
useEffect(() => {
15+
if (status) {
16+
handleCheckout()
17+
.then((redirect_url) => {
18+
console.log(redirect_url);
19+
setSessionUrl(redirect_url);
20+
})
21+
.catch(() => {
22+
toast.error("Error in Generating you session Url");
23+
});
24+
}
25+
}, [status]);
26+
return (
27+
<Button
28+
className="w-full bg-gradient-to-r from-pink-500 to-purple-500"
29+
onClick={() => {
30+
if (!status) {
31+
navigate("/login");
32+
} else {
33+
window.location.href = sessionUrl;
34+
}
35+
}}
36+
>
37+
{status && isProUser ? "Manage Subscription" : "Subscribe Now"}
38+
</Button>
39+
);
40+
};
41+
42+
const SubscriptionButton = React.memo(SubscribeButton);
43+
export default SubscriptionButton;

src/pages/Dashboard/DashBoard.tsx

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import ChartView from "@/components/ChartView";
1818
import { ModeToggle } from "@/components/ui/toggle-theme";
1919
import { useSubscription } from "@/hooks/useSubscription";
2020
import History from "@/components/History";
21+
import SubscriptionButton from "@/components/SubscriptionButton";
2122

2223
export default function Component() {
2324
const dispatch = useAppDispatch();
@@ -45,12 +46,12 @@ export default function Component() {
4546
<div className="flex flex-col flex-1">
4647
<header className="h-16 px-4 border-b shrink-0 md:px-6 flex items-center">
4748
<div className="flex items-center justify-end w-full gap-4 md:ml-auto md:gap-2 lg:gap-4">
48-
<Link
49-
className="text-gray-600 hover:text-gray-900 dark:text-gray-200"
50-
to="/test"
51-
>
52-
Test
53-
</Link>
49+
<Link
50+
className="text-gray-600 hover:text-gray-900 dark:text-gray-200"
51+
to="/test"
52+
>
53+
Test
54+
</Link>
5455
{!isProUser && (
5556
<Link
5657
className="text-gray-600 hover:text-gray-900 dark:text-gray-200"
@@ -160,12 +161,15 @@ export default function Component() {
160161
</main>
161162
</div>
162163
</div>
163-
<Button
164+
{/* <Button
164165
className="fixed bottom-7 left-10 object-cover w-fit shadow-2xl bg-gradient-to-r from-purple-400 to-fuchsia-600"
165166
variant={"destructive"}
166167
>
167168
{isProUser ? "Manage Subscriptions" : "Go Pro"}
168-
</Button>
169+
</Button> */}
170+
<div className="fixed bottom-7 left-10">
171+
<SubscriptionButton />
172+
</div>
169173
</div>
170174
);
171175
}

src/redux-store/slices/subscriptionslice.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { axiosClient } from "@/api/axiosclient";
22
import { createAsyncThunk, createSlice } from "@reduxjs/toolkit";
33
import { AxiosError } from "axios";
4-
const DAY_IN_MS = 86_400_400;
54
export interface SubscriptionData {
65
id: number;
76
userID: number;
@@ -43,7 +42,7 @@ const resultSlice = createSlice({
4342
state.isLoadingSubscription = false;
4443
const response = action.payload.data;
4544
state.subscriptionData = response.data;
46-
if (state.subscriptionData?.stripePriceId && state.subscriptionData?.stripeCurrentPeriodEnd.getTime() + DAY_IN_MS > Date.now()) {
45+
if (state.subscriptionData?.stripePriceId && new Date(state.subscriptionData?.stripeCurrentPeriodEnd)> new Date()) {
4746
state.isProUser = true;
4847
}
4948
});

0 commit comments

Comments
 (0)