All files / src/components AppGuard.tsx

87.5% Statements 7/8
100% Branches 7/7
50% Functions 1/2
100% Lines 7/7

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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                        1x   4x 4x   4x   4x 4x   4x                                                  
// src/components/AppGuard.tsx
import React, { useCallback } from 'react';
import { Toaster } from 'react-hot-toast';
import { useAppInitialization } from '../hooks/useAppInitialization';
import { useModal } from '../hooks/useModal';
import { WhatsNewModal } from './WhatsNewModal';
import config from '../config';
 
interface AppGuardProps {
  children: React.ReactNode;
}
 
export const AppGuard: React.FC<AppGuardProps> = ({ children }) => {
  // This hook handles OAuth tokens, version checks, and returns theme state.
  const { isDarkMode } = useAppInitialization();
  const { isModalOpen, closeModal } = useModal();
 
  const handleCloseWhatsNew = useCallback(() => closeModal('whatsNew'), [closeModal]);
 
  const appVersion = config.app.version;
  const commitMessage = config.app.commitMessage;
 
  return (
    <div className="bg-gray-100 dark:bg-gray-950 min-h-screen font-sans text-gray-800 dark:text-gray-200">
      {/* Toaster component for displaying notifications. It's placed at the top level. */}
      <Toaster position="top-center" reverseOrder={false} />
      {/* Add CSS variables for toast theming based on dark mode */}
      <style>{`
        :root {
          --toast-bg: ${isDarkMode ? '#4B5563' : '#FFFFFF'};
          --toast-color: ${isDarkMode ? '#F9FAFB' : '#1F2937'};
        }
      `}</style>
 
      {appVersion && commitMessage && (
        <WhatsNewModal
          isOpen={isModalOpen('whatsNew')}
          onClose={handleCloseWhatsNew}
          version={appVersion}
          commitMessage={commitMessage}
        />
      )}
 
      {children}
    </div>
  );
};