import 'package:flutter/material.dart';
import 'package:my_portfolio/constants/colors.dart';
import 'package:my_portfolio/constants/size.dart';
import 'package:my_portfolio/constants/sns_links.dart';
import 'package:my_portfolio/widgets/contact_section.dart';
import 'package:my_portfolio/widgets/drawer_mobile.dart';
import 'package:my_portfolio/widgets/footer_section.dart';
import 'package:my_portfolio/widgets/header_desktop.dart';
import 'package:my_portfolio/widgets/header_mobile.dart';
import 'package:my_portfolio/widgets/main_desktop.dart';
import 'package:my_portfolio/widgets/main_mobile.dart';
import 'package:my_portfolio/widgets/project_section.dart';
import 'package:my_portfolio/widgets/skills_section.dart';
import 'dart:js' as js;
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
final scaffoldKey = GlobalKey<ScaffoldState>();
final scrollController = ScrollController();
final List<GlobalKey> navbarKeys = List.generate(4, (index) => GlobalKey());
@override
Widget build(BuildContext context) {
return LayoutBuilder(
builder: (context, constraints) {
return Scaffold(
key: scaffoldKey,
backgroundColor: CustomColor.scaffoldBg,
endDrawer:
constraints.maxWidth >= kMinDesktopWidth
? null
: DrawerMobile(
onNavItemTap: (int navIndex) {
scaffoldKey.currentState?.closeEndDrawer();
scrollToAction(navIndex);
},
),
body: SingleChildScrollView(
controller: scrollController,
scrollDirection: Axis.vertical,
child: Column(
children: [
SizedBox(key: navbarKeys.first),
// MAIN
if (constraints.maxWidth >= kMinDesktopWidth)
HeaderDesktop(
navMenuTap: (int navIndex) {
//call function
scrollToAction(navIndex);
},
)
else
HeaderMobile(
onLogoTap: () {},
onMenuTap: () {
scaffoldKey.currentState?.openEndDrawer();
},
),
if (constraints.maxWidth >= kMinDesktopWidth)
const MainDesktop()
else
const MainMobile(),
// SKILLS
SkillsSection(key: navbarKeys[1]),
const SizedBox(height: 30),
// PROJECTS
ProjectSection(key: navbarKeys[2]),
const SizedBox(height: 30),
// CONTACT
ContactSection(key: navbarKeys[3]),
const SizedBox(height: 30),
// FOOTER
const FooterSection(),
],
),
),
);
},
);
}
void scrollToAction(int navIndex) {
if (navIndex == 4) {
// open a blog page
js.context.callMethod("open", [SnsLinks.blog]);
return;
}
final key = navbarKeys[navIndex];
Scrollable.ensureVisible(
key.currentContext!,
duration: const Duration(milliseconds: 500),
curve: Curves.easeInOut,
);
}
}