File size: 2,570 Bytes
56c7b6d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import React from 'react';
import { AnimatePresence } from 'framer-motion';
import { useJobStore } from '@/store/appStore';
import { HomePage, WorkflowPage, JobListPage, SettingsModal } from '@/components/pages';
import Toast from '@/components/common/Toast';
import { jobsAPI } from '@/utils/api';

const App: React.FC = () => {
  const [isSettingsOpen, setIsSettingsOpen] = React.useState(false);
  const { 
    currentPage, 
    navigateToHome, 
    navigateToWorkflow, 
    navigateToJobList,
    setTailoringMode,
    setLLMProvider,
    setEnableProfessionalSummary,
    setIncludeCoverLetters,
    notification, 
    setNotification 
  } = useJobStore();

  React.useEffect(() => {
    const syncConfig = async () => {
      try {
        const config = await jobsAPI.getConfig();
        setTailoringMode(config.tailoring_mode);
        setLLMProvider(config.llm_provider);
        setEnableProfessionalSummary(!!config.enable_professional_summary);
        setIncludeCoverLetters(!!config.include_cover_letters);
      } catch {
        // Keep existing defaults if backend config is unavailable.
      }
    };

    void syncConfig();
  }, [setEnableProfessionalSummary, setIncludeCoverLetters, setLLMProvider, setTailoringMode]);

  return (
    <div className="min-h-screen bg-gradient-saas">
      <AnimatePresence mode="wait">
        {currentPage === 'home' && (
          <HomePage
            key="home"
            onGetStarted={navigateToWorkflow}
            onSettingsClick={() => setIsSettingsOpen(true)}
          />
        )}

        {currentPage === 'workflow' && (
          <WorkflowPage
            key="workflow"
            onJobsFound={navigateToJobList}
            onHomeClick={navigateToHome}
            onSettingsClick={() => setIsSettingsOpen(true)}
          />
        )}

        {currentPage === 'joblist' && (
          <JobListPage
            key="joblist"
            onBack={navigateToWorkflow}
            onHomeClick={navigateToHome}
            onSettingsClick={() => setIsSettingsOpen(true)}
          />
        )}
      </AnimatePresence>

      {/* Settings Modal */}
      <SettingsModal
        isOpen={isSettingsOpen}
        onClose={() => setIsSettingsOpen(false)}
      />

      {/* Notification Toast */}
      {notification && (
        <div className="fixed bottom-4 left-4 z-50">
          <Toast
            type={notification.type}
            message={notification.message}
            onClose={() => setNotification(null)}
          />
        </div>
      )}
    </div>
  );
};

export default App;