diff --git a/external/resume b/external/resume index 1a781e0..40bdfde 160000 --- a/external/resume +++ b/external/resume @@ -1 +1 @@ -Subproject commit 1a781e0566d0ac6f73d7e0d5d04c6b668aefc7d8 +Subproject commit 40bdfde2d2461bb0d530d84c32cc1a7531d7b344 diff --git a/scripts/copy-resume.js b/scripts/copy-resume.js index f99618a..d22349b 100644 --- a/scripts/copy-resume.js +++ b/scripts/copy-resume.js @@ -7,10 +7,10 @@ const destDir = 'public/resume'; // Ensure destination directory exists fs.mkdirSync(destDir, { recursive: true }); -// Copy PDF and HTML files +// Copy PDF files const files = fs.readdirSync(srcDir); for (const file of files) { - if (file.endsWith('.pdf') || file.endsWith('.html')) { + if (file.endsWith('.pdf')) { fs.copyFileSync(path.join(srcDir, file), path.join(destDir, file)); console.log(`Copied ${file}`); } diff --git a/src/__tests__/components/TerminalEmulator.test.tsx b/src/__tests__/components/TerminalEmulator.test.tsx index ea761f3..3b10606 100644 --- a/src/__tests__/components/TerminalEmulator.test.tsx +++ b/src/__tests__/components/TerminalEmulator.test.tsx @@ -1,6 +1,12 @@ import { fireEvent, render, screen } from '@testing-library/react'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import TerminalEmulator from '@/components/terminal/TerminalEmulator'; +import { $isAppReady } from '@/stores/app-store'; +import { + $terminalHistory, + $terminalHistoryVisibleIdx, + $terminalPromptRef, +} from '@/stores/terminal-store'; import type { CommandEntry } from '@/types/terminal'; import { Command } from '@/types/terminal'; @@ -21,6 +27,12 @@ vi.mock('@/stores/terminal-store', () => ({ initializeTerminal: vi.fn(), })); +vi.mock('@/stores/app-store', () => ({ + $isAppReady: { + get: vi.fn(() => true), + }, +})); + vi.mock('next-intl', () => ({ useTranslations: vi.fn(() => (key: string) => key), })); @@ -43,23 +55,17 @@ vi.mock('@/components/cmd-outputs/UnknownCmdOutput', () => ({ )), })); -import { - $terminalHistory, - $terminalHistoryVisibleIdx, - $terminalPromptRef, - initializeTerminal, -} from '@/stores/terminal-store'; - describe('TerminalEmulator', () => { const mockHistoryGet = vi.mocked($terminalHistory.get); const mockHistoryVisibleIdxGet = vi.mocked($terminalHistoryVisibleIdx.get); const mockPromptRefSet = vi.mocked($terminalPromptRef.set); - const _mockInitializeTerminal = vi.mocked(initializeTerminal); + const mockIsAppReadyGet = vi.mocked($isAppReady.get); beforeEach(() => { vi.clearAllMocks(); mockHistoryGet.mockReturnValue([]); mockHistoryVisibleIdxGet.mockReturnValue(0); + mockIsAppReadyGet.mockReturnValue(true); }); afterEach(() => { diff --git a/src/components/LoadSequence.tsx b/src/components/LoadSequence.tsx index b90af41..56d9ea6 100644 --- a/src/components/LoadSequence.tsx +++ b/src/components/LoadSequence.tsx @@ -2,6 +2,7 @@ import { useStore } from '@nanostores/react'; import { useEffect, useMemo, useState } from 'react'; +import { $isAppMounted, $isAppReady } from '@/stores/app-store'; import { $isDarkMode } from '@/stores/theme-store'; interface LoadSequenceProps { @@ -10,13 +11,22 @@ interface LoadSequenceProps { export default function LoadSequence({ children }: LoadSequenceProps) { const [currentStep, setCurrentStep] = useState(0); - const [isLoading, setIsLoading] = useState(true); + const [animationDone, setAnimationDone] = useState(false); const isDarkMode = useStore($isDarkMode); + const isAppMounted = useStore($isAppMounted); + + const isLoading = !animationDone || !isAppMounted; useEffect(() => { document.body.style.visibility = 'visible'; }, []); + useEffect(() => { + if (!isLoading) { + $isAppReady.set(true); + } + }, [isLoading]); + const steps = useMemo( () => [ { message: '> Detecting theme preference...', delay: 600 }, @@ -40,7 +50,7 @@ export default function LoadSequence({ children }: LoadSequenceProps) { return () => clearTimeout(timer); } else { - setIsLoading(false); + setAnimationDone(true); } }, [currentStep, steps]); @@ -48,47 +58,53 @@ export default function LoadSequence({ children }: LoadSequenceProps) { 'opacity-0 animate-[showInstant_0s_ease-in-out_forwards]'; const stepHeight = 'h-[24px] leading-6'; - if (!isLoading && children) { - return <>{children}>; - } - return ( -