Czas na podsumowanie wszystkiego, czego nauczylismy sie w tym module! Twoim zadaniem jest zaprojektowanie i zbudowanie Mission Control Dashboard -- panelu kontroli misji kosmicznej, wykorzystując wszystkie poznane wzorce.
Twoj projekt powinien wykorzystywać:
header, sidebar, main)useMission, useCrewFilter)1MissionDashboard/
2 atoms/
3 StatusBadge -- wyświetla status misji (active/completed/failed)
4 ProgressBar -- pasek postepu misji
5 IconButton -- przycisk z ikona
6 molecules/
7 MissionCard -- karta misji (StatusBadge + tytul + ProgressBar)
8 CrewMember -- czlonek zalogi (avatar + imie + rola)
9 organisms/
10 MissionList -- lista misji z filtrowaniem
11 CrewPanel -- panel zalogi z wyszukiwaniem
12 Tabs/Tab/Panel -- compound component z zakladkami
13 hooks/
14 useMission -- logika zarzadzania misjami
15 useFilter -- logika filtrowania
16 useToggle -- przelacznik stanow1function useMission() {
2 const [missions, setMissions] = useState(initialMissions);
3 const [filter, setFilter] = useState('all');
4
5 const filteredMissions = useMemo(() => {
6 if (filter === 'all') return missions;
7 return missions.filter(m => m.status === filter);
8 }, [missions, filter]);
9
10 const updateStatus = (id, status) => {
11 setMissions(prev =>
12 prev.map(m => m.id === id ? { ...m, status } : m)
13 );
14 };
15
16 return { missions: filteredMissions, filter, setFilter, updateStatus };
17}1function MissionControl() {
2 return (
3 <Tabs defaultTab={0}>
4 <Tabs.TabList>
5 <Tabs.Tab index={0}>Misje</Tabs.Tab>
6 <Tabs.Tab index={1}>Zaloga</Tabs.Tab>
7 <Tabs.Tab index={2}>Systemy</Tabs.Tab>
8 </Tabs.TabList>
9
10 <Tabs.TabPanel index={0}>
11 <MissionList />
12 </Tabs.TabPanel>
13 <Tabs.TabPanel index={1}>
14 <CrewPanel />
15 </Tabs.TabPanel>
16 <Tabs.TabPanel index={2}>
17 <SystemsOverview />
18 </Tabs.TabPanel>
19 </Tabs>
20 );
21}1function DashboardLayout({ header, sidebar, children }) {
2 return (
3 <div className="dashboard">
4 <header className="dash-header">{header}</header>
5 <div className="dash-body">
6 <aside className="dash-sidebar">{sidebar}</aside>
7 <main className="dash-content">{children}</main>
8 </div>
9 </div>
10 );
11}
12
13function App() {
14 return (
15 <DashboardLayout
16 header={<TopBar title="Mission Control" />}
17 sidebar={<StatusPanel />}
18 >
19 <MissionControl />
20 </DashboardLayout>
21 );
22}Zacznij od wyodrebnienia logiki do custom hookow. Kazdy hook powinien miec jedna odpowiedzialnosc:
1// useToggle -- prosty przelacznik stanow
2function useToggle(initial = false) {
3 const [value, setValue] = useState(initial);
4 const toggle = useCallback(() => setValue(v => !v), []);
5 return [value, toggle];
6}
7
8// useFilter -- logika filtrowania z debounce
9function useFilter(items, filterFn) {
10 const [query, setQuery] = useState('');
11
12 const filteredItems = useMemo(() => {
13 if (!query) return items;
14 return items.filter(item => filterFn(item, query));
15 }, [items, query, filterFn]);
16
17 return { filteredItems, query, setQuery };
18}Zbuduj proste, wielokrotnego uzytku komponenty:
1// Atom -- StatusBadge
2function StatusBadge({ status }) {
3 const colors = {
4 active: '#00e676',
5 completed: '#64b5f6',
6 failed: '#f44336',
7 };
8 return (
9 <span style={{ background: colors[status], padding: '4px 12px', borderRadius: '20px' }}>
10 {status}
11 </span>
12 );
13}
14
15// Molekula -- MissionCard (laczy atomy)
16function MissionCard({ mission, onStatusChange }) {
17 return (
18 <div className="mission-card">
19 <h3>{mission.name}</h3>
20 <StatusBadge status={mission.status} />
21 <ProgressBar value={mission.progress} />
22 </div>
23 );
24}Polacz molekuly w wieksze struktury:
1// MissionList -- organizm z filtrowaniem
2function MissionList() {
3 const { missions, filter, setFilter, updateStatus } = useMission();
4
5 return (
6 <div>
7 <FilterBar value={filter} onChange={setFilter} />
8 {missions.map(m => (
9 <MissionCard key={m.id} mission={m} onStatusChange={updateStatus} />
10 ))}
11 </div>
12 );
13}Na koncu polacz wszystko w layout z kompozycja.
Powodzenia, pilotze! Pokaz, że potrafisz projektowac architekture React jak prawdziwy inzynier kosmiczny!