Update artifacts/fb-publisher/src/App.tsx
Browse files
artifacts/fb-publisher/src/App.tsx
CHANGED
|
@@ -8,12 +8,6 @@ import { queryClient } from "./lib/queryClient";
|
|
| 8 |
import { Toaster } from "@/components/ui/toaster";
|
| 9 |
import { TooltipProvider } from "@/components/ui/tooltip";
|
| 10 |
import Publisher from "@/pages/Publisher";
|
| 11 |
-
import Subscription from "@/pages/Subscription";
|
| 12 |
-
import SubscriptionReturn from "@/pages/SubscriptionReturn";
|
| 13 |
-
import InstallExtension from "@/pages/InstallExtension";
|
| 14 |
-
import Admin from "@/pages/Admin";
|
| 15 |
-
import NotFound from "@/pages/not-found";
|
| 16 |
-
import UpdateBanner from "@/components/UpdateBanner";
|
| 17 |
|
| 18 |
const firebaseConfig = {
|
| 19 |
apiKey: "AIzaSyBMZV3pjYNxpMWbkyJbp1anaE2p1YCRWcg",
|
|
@@ -42,44 +36,70 @@ function FirebaseAuthTokenSetter() {
|
|
| 42 |
}
|
| 43 |
|
| 44 |
function HomePage() {
|
| 45 |
-
const [user, setUser] = useState<any>(
|
| 46 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 47 |
|
| 48 |
useEffect(() => {
|
| 49 |
const unsubscribe = onAuthStateChanged(auth, (firebaseUser) => {
|
| 50 |
console.log("🔥 Firebase user:", firebaseUser?.email);
|
| 51 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 52 |
setLoading(false);
|
| 53 |
});
|
| 54 |
return () => unsubscribe();
|
| 55 |
}, []);
|
| 56 |
|
| 57 |
-
useEffect(() => {
|
| 58 |
-
if (user) {
|
| 59 |
-
console.log("📡 إرسال للميرفر...");
|
| 60 |
-
fetch(`/api/me?userId=${user.uid}&userEmail=${user.email}`, { credentials: 'include' })
|
| 61 |
-
.then(res => res.json())
|
| 62 |
-
.then(data => console.log("✅ Supabase:", data))
|
| 63 |
-
.catch(err => console.error("❌", err));
|
| 64 |
-
}
|
| 65 |
-
}, [user]);
|
| 66 |
-
|
| 67 |
const handleLogin = async () => {
|
| 68 |
try {
|
| 69 |
const result = await signInWithPopup(auth, googleProvider);
|
| 70 |
console.log("✅ تسجيل دخول ناجح:", result.user.email);
|
| 71 |
-
// المستخدم سيتم تحديثه تلقائياً عبر onAuthStateChanged
|
| 72 |
} catch (error) {
|
| 73 |
console.error("❌ خطأ في تسجيل الدخول:", error);
|
|
|
|
| 74 |
}
|
| 75 |
};
|
| 76 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 77 |
if (loading) {
|
| 78 |
return <div className="min-h-screen bg-[#0f0f1e] flex items-center justify-center text-white text-xl">جاري التحميل...</div>;
|
| 79 |
}
|
| 80 |
|
| 81 |
if (user) {
|
| 82 |
-
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 83 |
}
|
| 84 |
|
| 85 |
return (
|
|
@@ -94,12 +114,27 @@ function HomePage() {
|
|
| 94 |
}
|
| 95 |
|
| 96 |
function ProtectedPublisher() {
|
| 97 |
-
const [user, setUser] = useState<any>(
|
|
|
|
|
|
|
|
|
|
| 98 |
const [loading, setLoading] = useState(true);
|
| 99 |
|
| 100 |
useEffect(() => {
|
| 101 |
const unsubscribe = onAuthStateChanged(auth, (firebaseUser) => {
|
| 102 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 103 |
setLoading(false);
|
| 104 |
});
|
| 105 |
return () => unsubscribe();
|
|
@@ -120,11 +155,6 @@ export default function App() {
|
|
| 120 |
<Switch>
|
| 121 |
<Route path="/" component={HomePage} />
|
| 122 |
<Route path="/app" component={ProtectedPublisher} />
|
| 123 |
-
<Route path="/subscription" component={Subscription} />
|
| 124 |
-
<Route path="/subscription/return" component={SubscriptionReturn} />
|
| 125 |
-
<Route path="/extension" component={InstallExtension} />
|
| 126 |
-
<Route path="/admin" component={Admin} />
|
| 127 |
-
<Route component={NotFound} />
|
| 128 |
</Switch>
|
| 129 |
<UpdateBanner />
|
| 130 |
<Toaster />
|
|
|
|
| 8 |
import { Toaster } from "@/components/ui/toaster";
|
| 9 |
import { TooltipProvider } from "@/components/ui/tooltip";
|
| 10 |
import Publisher from "@/pages/Publisher";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
|
| 12 |
const firebaseConfig = {
|
| 13 |
apiKey: "AIzaSyBMZV3pjYNxpMWbkyJbp1anaE2p1YCRWcg",
|
|
|
|
| 36 |
}
|
| 37 |
|
| 38 |
function HomePage() {
|
| 39 |
+
const [user, setUser] = useState<any>(() => {
|
| 40 |
+
// ✅ استعادة المستخدم من localStorage
|
| 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 |
+
// ✅ إرسال للميرفر
|
| 60 |
+
fetch(`/api/me?userId=${firebaseUser.uid}&userEmail=${firebaseUser.email}`, { credentials: 'include' })
|
| 61 |
+
.then(res => res.json())
|
| 62 |
+
.then(data => console.log("✅ Supabase:", data))
|
| 63 |
+
.catch(err => console.error("❌", err));
|
| 64 |
+
} else {
|
| 65 |
+
setUser(null);
|
| 66 |
+
localStorage.removeItem("firebase_user");
|
| 67 |
+
}
|
| 68 |
setLoading(false);
|
| 69 |
});
|
| 70 |
return () => unsubscribe();
|
| 71 |
}, []);
|
| 72 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 73 |
const handleLogin = async () => {
|
| 74 |
try {
|
| 75 |
const result = await signInWithPopup(auth, googleProvider);
|
| 76 |
console.log("✅ تسجيل دخول ناجح:", result.user.email);
|
|
|
|
| 77 |
} catch (error) {
|
| 78 |
console.error("❌ خطأ في تسجيل الدخول:", error);
|
| 79 |
+
setLoading(false);
|
| 80 |
}
|
| 81 |
};
|
| 82 |
|
| 83 |
+
const handleLogout = () => {
|
| 84 |
+
signOut(auth);
|
| 85 |
+
localStorage.removeItem("firebase_user");
|
| 86 |
+
setUser(null);
|
| 87 |
+
};
|
| 88 |
+
|
| 89 |
if (loading) {
|
| 90 |
return <div className="min-h-screen bg-[#0f0f1e] flex items-center justify-center text-white text-xl">جاري التحميل...</div>;
|
| 91 |
}
|
| 92 |
|
| 93 |
if (user) {
|
| 94 |
+
return (
|
| 95 |
+
<div className="min-h-screen bg-[#0f0f1e] flex flex-col items-center justify-center gap-4">
|
| 96 |
+
<h1 className="text-white text-2xl font-bold">✅ تم التسجيل!</h1>
|
| 97 |
+
<p className="text-gray-400">مرحباً، {user.displayName || user.email}</p>
|
| 98 |
+
<p className="text-gray-500">UID: {user.uid}</p>
|
| 99 |
+
<button onClick={handleLogout} className="bg-red-600 text-white px-6 py-3 rounded-lg">تسجيل خروج</button>
|
| 100 |
+
<a href="/app" className="bg-[#bb86fc] text-white px-8 py-4 rounded-xl text-lg font-bold">اذهب للتطبيق</a>
|
| 101 |
+
</div>
|
| 102 |
+
);
|
| 103 |
}
|
| 104 |
|
| 105 |
return (
|
|
|
|
| 114 |
}
|
| 115 |
|
| 116 |
function ProtectedPublisher() {
|
| 117 |
+
const [user, setUser] = useState<any>(() => {
|
| 118 |
+
const saved = localStorage.getItem("firebase_user");
|
| 119 |
+
return saved ? JSON.parse(saved) : null;
|
| 120 |
+
});
|
| 121 |
const [loading, setLoading] = useState(true);
|
| 122 |
|
| 123 |
useEffect(() => {
|
| 124 |
const unsubscribe = onAuthStateChanged(auth, (firebaseUser) => {
|
| 125 |
+
if (firebaseUser) {
|
| 126 |
+
const userData = {
|
| 127 |
+
uid: firebaseUser.uid,
|
| 128 |
+
email: firebaseUser.email,
|
| 129 |
+
displayName: firebaseUser.displayName,
|
| 130 |
+
photoURL: firebaseUser.photoURL,
|
| 131 |
+
};
|
| 132 |
+
setUser(userData);
|
| 133 |
+
localStorage.setItem("firebase_user", JSON.stringify(userData));
|
| 134 |
+
} else {
|
| 135 |
+
setUser(null);
|
| 136 |
+
localStorage.removeItem("firebase_user");
|
| 137 |
+
}
|
| 138 |
setLoading(false);
|
| 139 |
});
|
| 140 |
return () => unsubscribe();
|
|
|
|
| 155 |
<Switch>
|
| 156 |
<Route path="/" component={HomePage} />
|
| 157 |
<Route path="/app" component={ProtectedPublisher} />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 158 |
</Switch>
|
| 159 |
<UpdateBanner />
|
| 160 |
<Toaster />
|