Ignore:
Timestamp:
01/30/26 01:40:27 (8 months ago)
Author:
Stefan-Saveski <stefansaveski19@…>
Branches:
master
Children:
ba52069
Parents:
298f9b3
Message:

Added dual language feature.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/components/header.tsx

    r298f9b3 r50f2fb4  
    11"use client"
     2
    23import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
    34import { faUser } from '@fortawesome/free-solid-svg-icons';
    45import Image from 'next/image';
    56
     7import { useEffect, useState } from 'react';
     8import { getAccessToken, clearAuthTokens } from '@/lib/auth';
     9import { useTranslation } from 'react-i18next';
     10import LanguageSwitcher from './LanguageSwitcher';
     11
    612const Header = () => {
     13
     14  const [userName, setUserName] = useState<string>('');
     15  const { t } = useTranslation();
     16
     17  useEffect(() => {
     18    async function fetchUser() {
     19      const token = getAccessToken();
     20      if (!token) return;
     21      try {
     22        const response = await fetch('https://iknow-api.onrender.com/api/user/getUser', {
     23          method: 'GET',
     24          headers: { Authorization: `Bearer ${token}` },
     25        });
     26        if (!response.ok) return;
     27        const data = await response.json();
     28        // Try both student and professor shape
     29        if (data?.personalInfo) {
     30          const p = data.personalInfo;
     31          setUserName([p.firstName, p.middleName, p.lastName].filter(Boolean).join(' '));
     32        }
     33      } catch {}
     34    }
     35    fetchUser();
     36    return () => {};
     37  }, []);
     38
     39  const handleLogout = () => {
     40    clearAuthTokens();
     41    if (typeof window !== 'undefined') {
     42      window.location.href = '/';
     43    }
     44  };
     45
    746  return (
    847    <header className="bg-white shadow-sm border-b border-gray-200">
    948      <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
    10         <div className="flex justify-between items-center py-4">
     49        <div className="flex flex-col sm:flex-row sm:justify-between sm:items-center py-4 gap-4 sm:gap-0">
    1150          {/* Left side - Logos and University Info */}
    12           <div className="flex items-center gap-4">
     51          <div className="flex items-center gap-2 justify-center sm:justify-start">
    1352            {/* UKIM Logo */}
    1453            <div className="flex-shrink-0">
     
    2160              />
    2261            </div>
    23            
    2462            {/* FINKI Logo */}
    2563            <div className="flex-shrink-0">
     
    3270              />
    3371            </div>
    34            
    3572            {/* University Text */}
    3673            <div className="hidden sm:block">
    3774              <div className="text-gray-900 font-medium text-sm">
    38                 Универзитет „Св. КИРИЛ И МЕТОДИЈ“ - Скопје
     75                {t('university')}
    3976              </div>
    4077              <div className="text-gray-700 text-sm">
    41                 Факултет за информатички науки и компјутерско инженерство
     78                {t('faculty')}
    4279              </div>
    4380            </div>
    4481          </div>
    45 
    4682          {/* Right side - User Profile */}
    47           <div className="flex items-center gap-4">
    48             <div className="flex items-center gap-3">
     83          <div className="flex flex-col sm:flex-row items-center gap-2 sm:gap-4 w-full sm:w-auto justify-center sm:justify-end">
     84            {/* Language Switcher - now left of user info */}
     85            <div className="sm:mr-2 w-full sm:w-auto flex justify-center sm:justify-end">
     86              <LanguageSwitcher />
     87            </div>
     88            <div className="flex items-center gap-2 sm:gap-3 w-full sm:w-auto justify-center sm:justify-end">
    4989              {/* User Avatar */}
    50               <div className="flex items-center justify-center w-10 h-10 bg-gray-800 text-white rounded-full">
     90              <div className="hidden sm:flex items-center justify-center w-10 h-10 bg-gray-800 text-white rounded-full">
    5191                <FontAwesomeIcon icon={faUser} className="text-sm" />
    5292              </div>
    53              
    5493              {/* User Name */}
    5594              <div className="hidden sm:block text-gray-900 font-medium">
    56                 Стефан Савески
     95                {userName || '...'}
    5796              </div>
    58              
    59               {/* Logout Button */}
    60               <button className="text-blue-600 hover:text-blue-800 font-medium text-sm transition-colors duration-200">
    61                 Logout
     97              {/* Logout Button - more stylish and full width on mobile */}
     98              <button
     99                className="w-full sm:w-auto ml-0 sm:ml-2 px-4 py-2 border-2 border-primary text-primary bg-white rounded-lg font-semibold flex items-center justify-center gap-2 hover:bg-blue-50 transition-all duration-200 shadow-sm"
     100                onClick={handleLogout}
     101              >
     102                <svg xmlns='http://www.w3.org/2000/svg' className='h-4 w-4' fill='none' viewBox='0 0 24 24' stroke='currentColor'><path strokeLinecap='round' strokeLinejoin='round' strokeWidth={2} d='M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a2 2 0 01-2 2H7a2 2 0 01-2-2V7a2 2 0 012-2h4a2 2 0 012 2v1' /></svg>
     103                {t('logout')}
    62104              </button>
    63105            </div>
Note: See TracChangeset for help on using the changeset viewer.