sare26 commited on
Commit
d35f572
·
verified ·
1 Parent(s): 58562f0

Update artifacts/fb-publisher/src/App.tsx

Browse files
Files changed (1) hide show
  1. artifacts/fb-publisher/src/App.tsx +83 -98
artifacts/fb-publisher/src/App.tsx CHANGED
@@ -1,35 +1,36 @@
1
  import { useEffect, useState } from "react";
2
- import { initializeApp } from "firebase/app";
3
- import { getAuth, GoogleAuthProvider, signInWithPopup, onAuthStateChanged, signOut, getIdToken } from "firebase/auth";
 
4
  import { setAuthTokenGetter } from "@workspace/api-client-react";
5
- import { Switch, Route, Router as WouterRouter, Redirect } from "wouter";
 
 
 
 
 
6
  import { QueryClientProvider, useQueryClient } from "@tanstack/react-query";
7
  import { queryClient } from "./lib/queryClient";
8
  import { Toaster } from "@/components/ui/toaster";
9
  import { TooltipProvider } from "@/components/ui/tooltip";
10
- import UpdateBanner from "@/components/UpdateBanner"; // ✅ أضف هذا
11
  import Publisher from "@/pages/Publisher";
 
 
 
 
 
 
12
 
13
- const firebaseConfig = {
14
- apiKey: "AIzaSyBMZV3pjYNxpMWbkyJbp1anaE2p1YCRWcg",
15
- authDomain: "fb-publisher-pro.firebaseapp.com",
16
- projectId: "fb-publisher-pro",
17
- storageBucket: "fb-publisher-pro.firebasestorage.app",
18
- messagingSenderId: "1003179857534",
19
- appId: "1:1003179857534:web:8ede54d5d8c22685ad2a2f",
20
- };
21
-
22
- const app = initializeApp(firebaseConfig);
23
- const auth = getAuth(app);
24
- const googleProvider = new GoogleAuthProvider();
25
  const basePath = import.meta.env.BASE_URL?.replace(/\/$/, "") || "";
26
 
27
- function FirebaseAuthTokenSetter() {
28
  useEffect(() => {
29
  setAuthTokenGetter(async () => {
30
- const user = auth.currentUser;
31
- if (user) return await getIdToken(user);
32
- return null;
33
  });
34
  return () => setAuthTokenGetter(null);
35
  }, []);
@@ -37,123 +38,107 @@ function FirebaseAuthTokenSetter() {
37
  }
38
 
39
  function HomePage() {
40
- const [user, setUser] = useState<any>(() => {
41
- const saved = localStorage.getItem("firebase_user");
42
- return saved ? JSON.parse(saved) : null;
43
- });
44
- const [loading, setLoading] = useState(!localStorage.getItem("firebase_user"));
45
 
46
  useEffect(() => {
47
- const unsubscribe = onAuthStateChanged(auth, (firebaseUser) => {
48
- console.log("🔥 Firebase user:", firebaseUser?.email);
49
- if (firebaseUser) {
50
- const userData = {
51
- uid: firebaseUser.uid,
52
- email: firebaseUser.email,
53
- displayName: firebaseUser.displayName,
54
- photoURL: firebaseUser.photoURL,
55
- };
56
- setUser(userData);
57
- localStorage.setItem("firebase_user", JSON.stringify(userData));
58
-
59
- fetch(`/api/me?userId=${firebaseUser.uid}&userEmail=${firebaseUser.email}`, { credentials: 'include' })
60
- .then(res => res.json())
61
- .then(data => console.log("✅ Supabase:", data))
62
- .catch(err => console.error("❌", err));
63
- } else {
64
- setUser(null);
65
- localStorage.removeItem("firebase_user");
66
- }
67
  setLoading(false);
68
  });
69
- return () => unsubscribe();
70
- }, []);
71
 
72
- const handleLogin = async () => {
73
- try {
74
- const result = await signInWithPopup(auth, googleProvider);
75
- console.log("✅ تسجيل دخول ناجح:", result.user.email);
76
- } catch (error) {
77
- console.error("❌ خطأ في تسجيل الدخول:", error);
78
- setLoading(false);
79
- }
80
- };
81
 
82
- const handleLogout = () => {
83
- signOut(auth);
84
- localStorage.removeItem("firebase_user");
85
- setUser(null);
86
- };
87
 
88
  if (loading) {
89
  return <div className="min-h-screen bg-[#0f0f1e] flex items-center justify-center text-white text-xl">جاري التحميل...</div>;
90
  }
91
 
92
- if (user) {
93
- return (
94
- <div className="min-h-screen bg-[#0f0f1e] flex flex-col items-center justify-center gap-4">
95
- <h1 className="text-white text-2xl font-bold">✅ تم التسجيل!</h1>
96
- <p className="text-gray-400">مرحباً، {user.displayName || user.email}</p>
97
- <p className="text-gray-500">UID: {user.uid}</p>
98
- <button onClick={handleLogout} className="bg-red-600 text-white px-6 py-3 rounded-lg">تسجيل خروج</button>
99
- <a href="/app" className="bg-[#bb86fc] text-white px-8 py-4 rounded-xl text-lg font-bold">اذهب للتطبيق</a>
100
- </div>
101
- );
102
  }
103
 
104
  return (
105
- <div className="min-h-screen bg-[#0f0f1e] flex flex-col items-center justify-center gap-4">
106
- <h1 className="text-white text-2xl font-bold">FB Publisher PRO</h1>
107
- <p className="text-gray-400">سجل دخولك للمتابعة</p>
108
- <button onClick={handleLogin} className="bg-[#bb86fc] text-white px-8 py-4 rounded-xl text-lg font-bold hover:bg-[#a070e0] transition-colors">
109
- تسجيل الدخول بـ Google
110
- </button>
 
 
 
 
111
  </div>
112
  );
113
  }
114
 
115
  function ProtectedPublisher() {
116
- const [user, setUser] = useState<any>(() => {
117
- const saved = localStorage.getItem("firebase_user");
118
- return saved ? JSON.parse(saved) : null;
119
- });
120
  const [loading, setLoading] = useState(true);
121
 
122
  useEffect(() => {
123
- const unsubscribe = onAuthStateChanged(auth, (firebaseUser) => {
124
- if (firebaseUser) {
125
- const userData = {
126
- uid: firebaseUser.uid,
127
- email: firebaseUser.email,
128
- displayName: firebaseUser.displayName,
129
- photoURL: firebaseUser.photoURL,
130
- };
131
- setUser(userData);
132
- localStorage.setItem("firebase_user", JSON.stringify(userData));
133
- } else {
134
- setUser(null);
135
- localStorage.removeItem("firebase_user");
136
- }
137
  setLoading(false);
138
  });
139
- return () => unsubscribe();
140
  }, []);
141
 
142
  if (loading) return <div className="min-h-screen bg-[#0f0f1e] flex items-center justify-center text-white">جاري التحميل...</div>;
143
- if (!user) return <Redirect to="/" />;
144
 
145
  return <Publisher />;
146
  }
147
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
148
  export default function App() {
149
  return (
150
  <QueryClientProvider client={queryClient}>
151
  <WouterRouter base={basePath}>
152
- <FirebaseAuthTokenSetter />
153
  <TooltipProvider>
154
  <Switch>
155
  <Route path="/" component={HomePage} />
156
  <Route path="/app" component={ProtectedPublisher} />
 
 
 
 
 
157
  </Switch>
158
  <UpdateBanner />
159
  <Toaster />
 
1
  import { useEffect, useState } from "react";
2
+ import { createClient } from "@supabase/supabase-js";
3
+ import { Auth } from "@supabase/auth-ui-react";
4
+ import { ThemeSupa } from "@supabase/auth-ui-shared";
5
  import { setAuthTokenGetter } from "@workspace/api-client-react";
6
+ import {
7
+ Switch,
8
+ Route,
9
+ Router as WouterRouter,
10
+ Redirect,
11
+ } from "wouter";
12
  import { QueryClientProvider, useQueryClient } from "@tanstack/react-query";
13
  import { queryClient } from "./lib/queryClient";
14
  import { Toaster } from "@/components/ui/toaster";
15
  import { TooltipProvider } from "@/components/ui/tooltip";
 
16
  import Publisher from "@/pages/Publisher";
17
+ import Subscription from "@/pages/Subscription";
18
+ import SubscriptionReturn from "@/pages/SubscriptionReturn";
19
+ import InstallExtension from "@/pages/InstallExtension";
20
+ import Admin from "@/pages/Admin";
21
+ import NotFound from "@/pages/not-found";
22
+ import UpdateBanner from "@/components/UpdateBanner";
23
 
24
+ const supabaseUrl = import.meta.env.VITE_SUPABASE_URL as string;
25
+ const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY as string;
26
+ const supabase = createClient(supabaseUrl, supabaseAnonKey);
 
 
 
 
 
 
 
 
 
27
  const basePath = import.meta.env.BASE_URL?.replace(/\/$/, "") || "";
28
 
29
+ function SupabaseAuthTokenSetter() {
30
  useEffect(() => {
31
  setAuthTokenGetter(async () => {
32
+ const { data } = await supabase.auth.getSession();
33
+ return data.session?.access_token ?? null;
 
34
  });
35
  return () => setAuthTokenGetter(null);
36
  }, []);
 
38
  }
39
 
40
  function HomePage() {
41
+ const [session, setSession] = useState<any>(null);
42
+ const [loading, setLoading] = useState(true);
 
 
 
43
 
44
  useEffect(() => {
45
+ supabase.auth.getSession().then(({ data: { session } }) => {
46
+ setSession(session);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  setLoading(false);
48
  });
 
 
49
 
50
+ const { data: { subscription } } = supabase.auth.onAuthStateChange((_event, session) => {
51
+ setSession(session);
52
+ });
 
 
 
 
 
 
53
 
54
+ return () => subscription.unsubscribe();
55
+ }, []);
 
 
 
56
 
57
  if (loading) {
58
  return <div className="min-h-screen bg-[#0f0f1e] flex items-center justify-center text-white text-xl">جاري التحميل...</div>;
59
  }
60
 
61
+ if (session) {
62
+ fetch(`/api/me?userId=${session.user.id}&userEmail=${session.user.email}`, {
63
+ credentials: 'include',
64
+ headers: { 'Authorization': `Bearer ${session.access_token}` }
65
+ }).catch(() => {});
66
+
67
+ return <Redirect to="/app" />;
 
 
 
68
  }
69
 
70
  return (
71
+ <div className="min-h-screen bg-[#0f0f1e] flex items-center justify-center">
72
+ <div className="w-full max-w-md p-6">
73
+ <h1 className="text-white text-2xl font-bold text-center mb-6">FB Publisher PRO</h1>
74
+ <Auth
75
+ supabaseClient={supabase}
76
+ appearance={{ theme: ThemeSupa }}
77
+ providers={["google"]}
78
+ redirectTo={`${window.location.origin}/app`}
79
+ />
80
+ </div>
81
  </div>
82
  );
83
  }
84
 
85
  function ProtectedPublisher() {
86
+ const [session, setSession] = useState<any>(null);
 
 
 
87
  const [loading, setLoading] = useState(true);
88
 
89
  useEffect(() => {
90
+ supabase.auth.getSession().then(({ data: { session } }) => {
91
+ setSession(session);
 
 
 
 
 
 
 
 
 
 
 
 
92
  setLoading(false);
93
  });
 
94
  }, []);
95
 
96
  if (loading) return <div className="min-h-screen bg-[#0f0f1e] flex items-center justify-center text-white">جاري التحميل...</div>;
97
+ if (!session) return <Redirect to="/" />;
98
 
99
  return <Publisher />;
100
  }
101
 
102
+ function ProtectedSubscription() {
103
+ const [session, setSession] = useState<any>(null);
104
+
105
+ useEffect(() => {
106
+ supabase.auth.getSession().then(({ data: { session } }) => {
107
+ setSession(session);
108
+ });
109
+ }, []);
110
+
111
+ if (!session) return <Redirect to="/" />;
112
+ return <Subscription />;
113
+ }
114
+
115
+ function ProtectedExtension() {
116
+ const [session, setSession] = useState<any>(null);
117
+
118
+ useEffect(() => {
119
+ supabase.auth.getSession().then(({ data: { session } }) => {
120
+ setSession(session);
121
+ });
122
+ }, []);
123
+
124
+ if (!session) return <Redirect to="/" />;
125
+ return <InstallExtension />;
126
+ }
127
+
128
  export default function App() {
129
  return (
130
  <QueryClientProvider client={queryClient}>
131
  <WouterRouter base={basePath}>
132
+ <SupabaseAuthTokenSetter />
133
  <TooltipProvider>
134
  <Switch>
135
  <Route path="/" component={HomePage} />
136
  <Route path="/app" component={ProtectedPublisher} />
137
+ <Route path="/subscription" component={ProtectedSubscription} />
138
+ <Route path="/subscription/return" component={SubscriptionReturn} />
139
+ <Route path="/extension" component={ProtectedExtension} />
140
+ <Route path="/admin" component={Admin} />
141
+ <Route component={NotFound} />
142
  </Switch>
143
  <UpdateBanner />
144
  <Toaster />