bug: loginform + header navigation adjusted

This commit is contained in:
DeathKaioken 2025-11-17 17:19:11 +01:00
parent aa447348b2
commit 9e194da309
2 changed files with 101 additions and 79 deletions

View File

@ -54,6 +54,8 @@ export default function Header() {
// NEW: permission flag
const [hasReferralPerm, setHasReferralPerm] = useState(false)
// NEW: admin management dropdown state
const [adminMgmtOpen, setAdminMgmtOpen] = useState(false)
const handleLogout = async () => {
try {
@ -405,31 +407,58 @@ export default function Header() {
>
Dashboard
</button>
<button
onClick={() => { console.log('🧭 Admin: navigate to /admin/user-management'); router.push('/admin/user-management') }}
className="text-sm font-semibold text-[#0F1D37] hover:text-[#7A5E1A]"
>
User Management
</button>
{/* MOVED: User Verify now before Management */}
<button
onClick={() => { console.log('🧭 Admin: navigate to /admin/user-verify'); router.push('/admin/user-verify') }}
className="text-sm font-semibold text-[#0F1D37] hover:text-[#7A5E1A]"
>
User Verify
</button>
{/* Management dropdown (unchanged) */}
<div
className="relative"
onMouseLeave={() => setAdminMgmtOpen(false)}
>
<button
onClick={() => { console.log('🧭 Admin: navigate to /admin/matrix-management'); router.push('/admin/matrix-management') }}
className="text-sm font-semibold text-[#0F1D37] hover:text-[#7A5E1A]"
onClick={() => setAdminMgmtOpen(o => !o)}
className="text-sm font-semibold text-[#0F1D37] hover:text-[#7A5E1A] flex items-center gap-1"
>
Management
<ChevronDownIcon
className={`h-4 w-4 transition-transform ${adminMgmtOpen ? 'rotate-180' : ''}`}
/>
</button>
{adminMgmtOpen && (
<div className="absolute left-1/2 -translate-x-1/2 mt-2 min-w-[15rem] rounded-md bg-white shadow-lg ring-1 ring-black/10 z-50">
<div className="py-2">
<button
onClick={() => { router.push('/admin/user-management'); setAdminMgmtOpen(false); }}
className="w-full text-left px-4 py-2 text-sm text-[#0F1D37] hover:bg-[#F5F3EE]"
>
User Management
</button>
<button
onClick={() => { router.push('/admin/matrix-management'); setAdminMgmtOpen(false); }}
className="w-full text-left px-4 py-2 text-sm text-[#0F1D37] hover:bg-[#F5F3EE]"
>
Matrix Management
</button>
{/* Contract Management only for admin */}
<button
onClick={() => { console.log('🧭 Admin: navigate to /admin/contract-management'); router.push('/admin/contract-management') }}
className="text-sm font-semibold text-[#0F1D37] hover:text-[#7A5E1A]"
onClick={() => { router.push('/admin/contract-management'); setAdminMgmtOpen(false); }}
className="w-full text-left px-4 py-2 text-sm text-[#0F1D37] hover:bg-[#F5F3EE]"
>
Contract Management
</button>
<button
onClick={() => { router.push('/admin/subscriptions'); setAdminMgmtOpen(false); }}
className="w-full text-left px-4 py-2 text-sm text-[#0F1D37] hover:bg-[#F5F3EE]"
>
Coffee Subscription Management
</button>
</div>
</div>
)}
</div>
</div>
</div>
</div>

View File

@ -13,28 +13,25 @@ export default function LoginForm() {
password: '',
rememberMe: false
})
const [viewportWidth, setViewportWidth] = useState<number>(
typeof window !== 'undefined' ? window.innerWidth : 1200
)
const router = useRouter()
const { login, error, setError, loading } = useLogin()
// Responsive ball visibility
useEffect(() => {
const handleResize = () => {
setShowBall(window.innerWidth >= 768)
}
handleResize()
window.addEventListener('resize', handleResize)
return () => window.removeEventListener('resize', handleResize)
const handleResizeBall = () => setShowBall(window.innerWidth >= 768)
handleResizeBall()
window.addEventListener('resize', handleResizeBall)
return () => window.removeEventListener('resize', handleResizeBall)
}, [])
// Prevent body scrolling when component mounts
// Track viewport width for dynamic scaling
useEffect(() => {
document.body.style.overflow = 'hidden'
document.documentElement.style.overflow = 'hidden'
return () => {
document.body.style.overflow = 'unset'
document.documentElement.style.overflow = 'unset'
}
const handleResize = () => setViewportWidth(window.innerWidth)
window.addEventListener('resize', handleResize)
return () => window.removeEventListener('resize', handleResize)
}, [])
const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
@ -82,63 +79,59 @@ export default function LoginForm() {
})
}
const screenWidth = typeof window !== 'undefined' ? window.innerWidth : 1200
const isMobile = screenWidth < 768
const isTablet = screenWidth >= 768 && screenWidth <= 1024
const isSmallLaptop = screenWidth > 1024 && screenWidth <= 1366
// Dynamic breakpoints
const isMobile = viewportWidth < 640
const isTablet = viewportWidth >= 640 && viewportWidth < 1024
const isSmallLaptop = viewportWidth >= 1024 && viewportWidth < 1366
// Calculate responsive values
const getFormWidth = () => {
if (isMobile) return '98vw'
if (isTablet) return '85vw'
if (isSmallLaptop) return '50vw'
return '40vw'
}
// Dynamic width & scale
const formWidth = isMobile
? '98vw'
: isTablet
? '85vw'
: isSmallLaptop
? '50vw'
: '40vw'
const getFormScale = () => {
if (isMobile) return undefined
if (isTablet) return 'scale(0.95)'
if (isSmallLaptop) return 'scale(0.9)'
return 'scale(0.85)'
}
const formMaxWidth = isMobile
? 'none'
: isTablet
? '620px'
: isSmallLaptop
? '660px'
: '720px'
const getFormMaxWidth = () => {
if (isMobile) return 'none'
if (isTablet) return '600px'
if (isSmallLaptop) return '650px'
return '700px'
}
const formScale = (() => {
if (isMobile) return 1
if (isTablet) return 0.95
if (isSmallLaptop) return 0.9
if (viewportWidth >= 1366 && viewportWidth < 1680) return 0.85
return 0.82
})()
return (
<div
className="w-full flex justify-center items-center relative"
className="w-full flex justify-center items-start relative"
style={{
minHeight: '100vh',
height: '100vh',
overflowY: 'hidden',
overflowX: 'hidden',
paddingTop: isMobile ? '0.25rem' : '5rem',
paddingBottom: isMobile ? '2.5rem' : '2.5rem',
// Removed fixed 100vh + overflow hidden to allow scrolling
minHeight: 'auto',
paddingTop: isMobile ? '0.75rem' : '4rem',
paddingBottom: '3rem',
backgroundImage: 'url(/images/misc/marble_bluegoldwhite_BG.jpg)',
backgroundSize: 'cover',
backgroundPosition: 'center',
backgroundRepeat: 'no-repeat'
backgroundPosition: 'center'
}}
>
<div
className="bg-white rounded-2xl shadow-2xl flex flex-col items-center relative border-t-4 border-[#8D6B1D]"
style={{
width: getFormWidth(),
maxWidth: getFormMaxWidth(),
width: formWidth,
maxWidth: formMaxWidth,
minWidth: isMobile ? '0' : '400px',
minHeight: isMobile ? '320px' : '320px',
padding: isMobile ? '0.5rem' : '2rem',
padding: isMobile ? '0.75rem' : '2rem',
marginTop: isMobile ? '0.5rem' : undefined,
transform: getFormScale(),
transformOrigin: 'top center',
display: 'flex',
flexDirection: 'column',
justifyContent: 'flex-start'
transform: formScale !== 1 ? `scale(${formScale})` : undefined,
transformOrigin: 'top center'
}}
>
{/* Animated Ball - Desktop Only */}