App.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { useEffect } from 'react';
  2. import { Header } from './components/Header';
  3. import { Footer } from './components/Footer';
  4. import { LanguageProvider } from './contexts/LanguageContext';
  5. import { RouterProvider, useRouter } from './contexts/RouterContext';
  6. import { Toaster } from './components/ui/sonner';
  7. import { Home } from './components/pages/Home';
  8. import { About } from './components/pages/About';
  9. import { Blog } from './components/pages/Blog';
  10. import { Careers } from './components/pages/Careers';
  11. import { PrivacyPolicy } from './components/pages/PrivacyPolicy';
  12. import { TermsOfService } from './components/pages/TermsOfService';
  13. import { FAQPage } from './components/pages/FAQPage';
  14. import { ContactPage } from './components/pages/ContactPage';
  15. function AppContent() {
  16. const { currentPage, navigateTo } = useRouter();
  17. const _page = window.location.hash.split('#')?.[1] ?? currentPage
  18. // Ensure hash scrolling works even after page is fully loaded
  19. useEffect(() => {
  20. // Wait for all images and resources to load
  21. if (document.readyState === 'complete') {
  22. handleHashScroll();
  23. } else {
  24. window.addEventListener('load', handleHashScroll);
  25. return () => window.removeEventListener('load', handleHashScroll);
  26. }
  27. function handleHashScroll() {
  28. const hash = window.location.hash.replace('#', '');
  29. if (hash) {
  30. setTimeout(() => {
  31. const element = document.getElementById(hash);
  32. if (element) {
  33. element.scrollIntoView({ behavior: 'smooth', block: 'start' });
  34. }
  35. }, 100);
  36. }
  37. }
  38. }, [currentPage]);
  39. useEffect(()=> {
  40. navigateTo(_page)
  41. }, [])
  42. const renderPage = () => {
  43. switch (_page) {
  44. case 'home':
  45. return <Home />;
  46. case 'about':
  47. return <About />;
  48. case 'blog':
  49. return <Blog />;
  50. case 'careers':
  51. return <Careers />;
  52. case 'privacy':
  53. return <PrivacyPolicy />;
  54. case 'terms':
  55. return <TermsOfService />;
  56. case 'faq':
  57. return <FAQPage />;
  58. case 'contact':
  59. return <ContactPage />;
  60. default:
  61. return <Home />;
  62. }
  63. };
  64. return (
  65. <div className="min-h-screen flex flex-col">
  66. <Header />
  67. <main className="flex-1">
  68. {renderPage()}
  69. </main>
  70. <Footer />
  71. <Toaster />
  72. </div>
  73. );
  74. }
  75. export default function App() {
  76. return (
  77. <LanguageProvider>
  78. <RouterProvider>
  79. <AppContent />
  80. </RouterProvider>
  81. </LanguageProvider>
  82. );
  83. }