Skip to content

Conversation

@govargas
Copy link

@govargas govargas commented Nov 3, 2025

🎓 Web dev spring 2025 Final Project Submission

This is my final project for the Technigo Fullstack JavaScript Bootcamp. BADA is a web application that helps people in Sweden find safe beaches with real-time water quality data.

🎯 What I Built

A full-stack application featuring:

  • Frontend: React + TypeScript, MapLibre maps, i18next multi-language support
  • Backend: Express API with MongoDB, JWT authentication, caching layer
  • Features: Interactive beach map, geolocation, favorites with drag-drop sorting, dark mode
  • Lighthouse Scores: 100% Accessibility, SEO, and Best Practices

🚀 Key Achievements

  • Integrated official Swedish Agency for Marine and Water Management (Havs- och vatten­myndigheten) API with intelligent caching
  • Built custom React hooks for geolocation, dark mode, and outside-click detection
  • Implemented server-side caching to reduce API load and improve performance
  • Achieved full accessibility compliance (WCAG standards)
  • Created seamless UX with search autocomplete, toast notifications, and smooth animations
  • Deployed frontend (Netlify) and backend (Vercel) with CI/CD

💡 Technical Highlights

  • Type Safety: Full TypeScript implementation across frontend and backend
  • State Management: Zustand for global state, TanStack Query for server state
  • Performance: Optimized API calls with intelligent caching and query invalidation
  • Accessibility: Keyboard navigation, ARIA labels, screen reader support
  • UX Polish: Dark mode, i18n (Swedish/English), error boundaries, loading states

🎨 Design Decisions

  • Mobile-first responsive design with Tailwind CSS
  • Clean, minimal, easy to read and navigate UI
  • Consistent design tokens for colors, spacing, and typography
  • Dark mode that respects system preferences

📚 What I Learned

Building BADA taught me how to architect a real-world full-stack application, integrate external APIs, implement authentication, and focus on user experience and accessibility. I'm proud of the result and I'm looking forward to read your feedback!


Live Demo: https://badaweb.netlify.app/
Test Account: [email protected] / Test1234

See README.md for full documentation and setup instructions.

- Implement i18next for multi-language support (Swedish/English)
- Localize all user-facing strings across pages and components
- Add translation files for common UI elements (auth, navigation, beaches, favorites)
- Add dynamic HTML lang attribute based on selected language
- Implement language switcher in header
- Add accessibility improvements:
  - Skip to main content navigation link
  - ARIA labels for interactive elements
  - Reduced motion support for animations
- Improve UX with toast notifications for user feedback
- Update favorites layout to full-width cards
- Enhance SEO with comprehensive meta tags (Open Graph, Twitter)
- Add error boundary for graceful error handling
- Add Swedish translations for About, Terms, Contact, and EU Beach pages
- Implement responsive grid for beach cards (1/2/4 columns)
- Update favorites to full-width layout
- Bypass map radius/viewport filters when user is searching
- Disable map auto-fit when search is active to keep map static
- Improve empty state messaging for search vs map filters
- Reset to default mode when clicking "Use current location" to ensure map fits
- Clear bounds when switching to nearby mode to prevent stale state
- Add onFitBounds callback to switch to viewport after programmatic f
- Copy _redirects file to dist directory for proper SPA routing
- Cache HaV v2 latest sample date requests (5min TTL)

Resolves beach detail page 404 errors on page reload by ensuring
the redirect rules are deployed. Also reduces external API load
by caching v2 results endpoint responses.
- Add navigation logic to search input handler
- Automatically route users to home page when typing search query
- Ensures beach list results are visible when filtering

Fixes issue where search bar was functional but results were not
displayed when searching from beach detail or other pages.
- Show dropdown with up to 10 filtered beaches while typing
- Click any result to navigate directly to beach detail page
- Add "View all results on map" link for full search view
- Implement outside-click detection to close dropdown
- Add translations for "viewAllResults" (EN/SV)

Allows users to search and navigate to beaches from any page
without leaving their current context, improving UX.
- Add translation keys for all classification states (inProgress, notClassified)
- Create getClassificationKey() utility to map API classification data to i18n keys
- Update BeachDetailPage and FavoritesPage to translate classification badges
- Remove NUTS code field from beach detail page for cleaner UI

Fixes issue where classification badges like "Klassificering pågår" displayed in Swedish even when using English language setting. All classification badges now properly translate based on user's selected language.
…luster click handler, update focus zoom limits
Copy link
Contributor

@HIPPIEKICK HIPPIEKICK left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great job finalising your final project, Talo!

Love that you implemented i18n and the outside-click-detection! Found a tiny styling bug though, I suppose you'd want the dropdown to be on top of the search field here:
Image

It would also be lovely if the hamburger menu closed when the user selects a page.

The only thing you need to "fix" however to be approved is the a11y:
Image

@HIPPIEKICK
Copy link
Contributor

Another thing I forgot to mention is that your dist folder doesn't need to be pushed to GitHub.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants