|
1 | | -import { useCallback, useEffect, useState, useRef } from 'react' |
| 1 | +import { useCallback, useEffect, useState, useRef, lazy, Suspense } from 'react' |
2 | 2 | import { ToastContainer } from './components/Notifications/ToastContainer' |
3 | 3 | import { ApiKeyInput } from './components/Auth/ApiKeyInput' |
4 | 4 | import { ApiKeyStatus } from './components/Auth/ApiKeyStatus' |
5 | 5 | import { FilterBar } from './components/Filters/FilterBar' |
6 | 6 | import { Board } from './components/Board/Board' |
7 | 7 | import { EmptyBoardWelcome } from './components/Board/EmptyBoardWelcome' |
8 | 8 | import { ApplyChangesButton } from './components/Board/ApplyChangesButton' |
9 | | -import { FAQModal } from './components/FAQ/FaqModal' |
10 | | -import { OriginStoryModal } from './components/OriginStory/OriginStoryModal' |
| 9 | + |
| 10 | +// Lazy load modals to improve initial bundle size |
| 11 | +const FAQModal = lazy(() => |
| 12 | + import('./components/FAQ/FaqModal').then((m) => ({ default: m.FAQModal })), |
| 13 | +) |
| 14 | +const OriginStoryModal = lazy(() => |
| 15 | + import('./components/OriginStory/OriginStoryModal').then((m) => ({ |
| 16 | + default: m.OriginStoryModal, |
| 17 | + })), |
| 18 | +) |
11 | 19 | import { useStore } from './store' |
12 | 20 | import { useUrlFilters } from './hooks/use-url-filters' |
13 | 21 | import { saveFilters, getFilters } from './lib/storage/filter-storage' |
@@ -388,12 +396,14 @@ function App() { |
388 | 396 | <ApiKeyInput isOpen={true} onClose={() => {}} onOpenFAQ={handleOpenFAQ} /> |
389 | 397 |
|
390 | 398 | {/* FAQ Modal */} |
391 | | - <FAQModal |
392 | | - isOpen={showFAQModal} |
393 | | - onClose={() => { |
394 | | - setShowFAQModal(false) |
395 | | - }} |
396 | | - /> |
| 399 | + <Suspense fallback={null}> |
| 400 | + <FAQModal |
| 401 | + isOpen={showFAQModal} |
| 402 | + onClose={() => { |
| 403 | + setShowFAQModal(false) |
| 404 | + }} |
| 405 | + /> |
| 406 | + </Suspense> |
397 | 407 |
|
398 | 408 | <ToastContainer toasts={toasts} removeToast={removeToast} /> |
399 | 409 | </div> |
@@ -553,20 +563,24 @@ function App() { |
553 | 563 | <ApiKeyInput isOpen={showApiKeyModal} onClose={handleCloseModal} onOpenFAQ={handleOpenFAQ} /> |
554 | 564 |
|
555 | 565 | {/* FAQ Modal */} |
556 | | - <FAQModal |
557 | | - isOpen={showFAQModal} |
558 | | - onClose={() => { |
559 | | - setShowFAQModal(false) |
560 | | - }} |
561 | | - /> |
| 566 | + <Suspense fallback={null}> |
| 567 | + <FAQModal |
| 568 | + isOpen={showFAQModal} |
| 569 | + onClose={() => { |
| 570 | + setShowFAQModal(false) |
| 571 | + }} |
| 572 | + /> |
| 573 | + </Suspense> |
562 | 574 |
|
563 | 575 | {/* Origin Story Modal (easter egg) */} |
564 | | - <OriginStoryModal |
565 | | - isOpen={showOriginStoryModal} |
566 | | - onClose={() => { |
567 | | - setShowOriginStoryModal(false) |
568 | | - }} |
569 | | - /> |
| 576 | + <Suspense fallback={null}> |
| 577 | + <OriginStoryModal |
| 578 | + isOpen={showOriginStoryModal} |
| 579 | + onClose={() => { |
| 580 | + setShowOriginStoryModal(false) |
| 581 | + }} |
| 582 | + /> |
| 583 | + </Suspense> |
570 | 584 | </div> |
571 | 585 | ) |
572 | 586 | } |
|
0 commit comments