Story 2.4: Session Details Modal - Wireframe

Story: Epic 2, Story 4 - Current Event Landing Page (Session Details Modal)

Last updated: October 22, 2025 Reading time: 19 minutes File size: 31.86 KB

Visual Wireframe

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                                                         [βœ•] β”‚
β”‚                                                                             β”‚
β”‚  β”Œβ”€β”€β”€ SESSION DETAILS ──────────────────────────────────────────────────┐  β”‚
β”‚  β”‚                                                                        β”‚  β”‚
β”‚  β”‚  09:45 - 10:30 AM                                     πŸ•’ 45 minutes   β”‚  β”‚
β”‚  β”‚                                                                        β”‚  β”‚
β”‚  β”‚  KUBERNETES BEST PRACTICES: FROM DEV TO PRODUCTION                    β”‚  β”‚
β”‚  β”‚                                                                        β”‚  β”‚
β”‚  β”‚  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  β”‚  β”‚
β”‚  β”‚                                                                        β”‚  β”‚
β”‚  β”‚  πŸ“ Main Hall                       🎯 Technical Deep Dive            β”‚  β”‚
β”‚  β”‚  Kursaal Bern                       ⭐ Advanced Level                 β”‚  β”‚
β”‚  β”‚  πŸ‘₯ 87/150 registered               πŸ”΄ Filling up fast!               β”‚  β”‚
β”‚  β”‚                                                                        β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                                                             β”‚
β”‚  β”Œβ”€β”€β”€ SPEAKER ──────────────────────────────────────────────────────────┐  β”‚
β”‚  β”‚                                                                        β”‚  β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                         β”‚  β”‚
β”‚  β”‚  β”‚          β”‚  Peter MΓΌller                                           β”‚  β”‚
β”‚  β”‚  β”‚ [Photo]  β”‚  Senior Cloud Architect @ TechCorp AG                   β”‚  β”‚
β”‚  β”‚  β”‚          β”‚                                                          β”‚  β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  10+ years Kubernetes experience β€’ CNCF Ambassador      β”‚  β”‚
β”‚  β”‚                                                                        β”‚  β”‚
β”‚  β”‚                [View Full Profile β†’]                                  β”‚  β”‚
β”‚  β”‚                                                                        β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                                                             β”‚
β”‚  β”Œβ”€β”€β”€ SESSION DESCRIPTION ──────────────────────────────────────────────┐  β”‚
β”‚  β”‚                                                                        β”‚  β”‚
β”‚  β”‚  Learn how to design, deploy, and manage Kubernetes clusters that    β”‚  β”‚
β”‚  β”‚  scale from development environments to production-ready systems.     β”‚  β”‚
β”‚  β”‚  This session covers:                                                 β”‚  β”‚
β”‚  β”‚                                                                        β”‚  β”‚
β”‚  β”‚  β€’ Infrastructure as Code with GitOps workflows                       β”‚  β”‚
β”‚  β”‚  β€’ Security hardening and RBAC best practices                         β”‚  β”‚
β”‚  β”‚  β€’ High availability and disaster recovery strategies                 β”‚  β”‚
β”‚  β”‚  β€’ Monitoring, logging, and observability patterns                    β”‚  β”‚
β”‚  β”‚  β€’ Cost optimization techniques for cloud providers                   β”‚  β”‚
β”‚  β”‚                                                                        β”‚  β”‚
β”‚  β”‚  You'll leave with actionable strategies and real-world examples      β”‚  β”‚
β”‚  β”‚  from production deployments at scale.                                β”‚  β”‚
β”‚  β”‚                                                                        β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                                                             β”‚
β”‚  β”Œβ”€β”€β”€ KEY TAKEAWAYS ────────────────────────────────────────────────────┐  β”‚
β”‚  β”‚                                                                        β”‚  β”‚
β”‚  β”‚  βœ“ Production-ready Kubernetes architecture patterns                  β”‚  β”‚
β”‚  β”‚  βœ“ Security best practices and compliance requirements                β”‚  β”‚
β”‚  β”‚  βœ“ Monitoring and troubleshooting strategies                          β”‚  β”‚
β”‚  β”‚  βœ“ GitOps workflow implementation guide                               β”‚  β”‚
β”‚  β”‚                                                                        β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                                                             β”‚
β”‚  β”Œβ”€β”€β”€ TARGET AUDIENCE ──────────────────────────────────────────────────┐  β”‚
β”‚  β”‚                                                                        β”‚  β”‚
β”‚  β”‚  πŸ‘₯ DevOps Engineers β€’ Cloud Architects β€’ Platform Engineers          β”‚  β”‚
β”‚  β”‚                                                                        β”‚  β”‚
β”‚  β”‚  Prerequisites: Basic Kubernetes knowledge and container experience   β”‚  β”‚
β”‚  β”‚                                                                        β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                                                             β”‚
β”‚  β”Œβ”€β”€β”€ RELATED SESSIONS ─────────────────────────────────────────────────┐  β”‚
β”‚  β”‚                                                                        β”‚  β”‚
β”‚  β”‚  β†’ Service Mesh Architecture (11:00 AM)                               β”‚  β”‚
β”‚  β”‚  β†’ GitOps Implementation (11:45 AM)                                   β”‚  β”‚
β”‚  β”‚  β†’ Container Orchestration Workshop (15:00 PM)                        β”‚  β”‚
β”‚  β”‚                                                                        β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                                                             β”‚
β”‚  β”Œβ”€β”€β”€ ACTIONS ──────────────────────────────────────────────────────────┐  β”‚
β”‚  β”‚                                                                        β”‚  β”‚
β”‚  β”‚  [πŸ“… Add to My Schedule]  [πŸ”— Share Session]  [πŸ“„ Download Slides*]  β”‚  β”‚
β”‚  β”‚                                                                        β”‚  β”‚
β”‚  β”‚  * Available after the event                                          β”‚  β”‚
β”‚  β”‚                                                                        β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                                                             β”‚
β”‚              [← Back to Agenda]          [Register for Event β†’]            β”‚
β”‚                                                                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Key Interactive Elements

  • [βœ•] Close button: Closes modal and returns to current event landing page

  • [View Full Profile β†’] link: Navigates to speaker profile detail view (opens in new modal or page)

  • [πŸ“… Add to My Schedule] button:

    • For authenticated users: Adds session to personal schedule
    • For unauthenticated users: Opens login/registration modal with message β€œRegister to build your personal schedule”
  • [πŸ”— Share Session] button: Opens native share menu (mobile) or shows share options modal (desktop)

    • Options: Copy link, Twitter, LinkedIn, Email
    • Generates shareable deep link to this session
  • [πŸ“„ Download Slides] button:

    • Disabled with tooltip before event: β€œAvailable after the event”
    • After event: Downloads presentation PDF directly
    • Tracks download analytics
  • [← Back to Agenda] link: Closes modal and scrolls to agenda section on landing page

  • [Register for Event β†’] button: Navigates to event registration page (story-2.4-event-registration.md)

  • Related session links: Clicking any related session closes current modal and opens that session’s detail modal (no modal stacking)

  • Real-time attendance counter: Shows live registration count (e.g., β€œ87/150 registered”) with status indicator (β€œFilling up fast” when >50% full)


Functional Requirements Met

  • FR6 (Current Event Prominence): Provides detailed session information for the current event with complete logistics (time, location, level)

  • FR15 (Mobile-Optimized Experience): Modal design adapts for mobile with scrollable content, touch-friendly buttons, and native share integration

  • FR14 (Personal Engagement): β€œAdd to My Schedule” enables personal schedule management for authenticated attendees

  • NFR1 (Responsive Design): Modal layout optimized for mobile, tablet, and desktop with appropriate sizing and scrolling


Technical Notes

  • Modal implementation: Use React portal for overlay rendering outside DOM hierarchy
  • Scroll behavior: Modal body scrollable while backdrop prevents page scroll (overflow: hidden on body)
  • No deep linking support: Modal only opens via user interaction on event landing page (no direct URL access to modal state)
  • Keyboard navigation: ESC key closes modal, Tab key cycles through interactive elements
  • Focus management: Focus trap within modal, return focus to trigger element on close
  • Animation: Smooth fade-in/scale animation for modal appearance (300ms transition)
  • Mobile optimization: Full-screen modal on mobile (<768px), centered with max-width on desktop
  • Share API: Use native Web Share API on mobile devices when available
  • Calendar integration: β€œAdd to My Schedule” saves to user’s personal schedule in BATbern platform only (no external calendar app integration)
  • Analytics tracking: Track modal views, share actions, and slide downloads for session popularity metrics
  • Lazy loading: Speaker photo loaded only when modal opens (not on initial page load)
  • State persistence: If user closes modal and reopens, scroll position resets to top

API Requirements

Initial Modal Load APIs

When the Session Details Modal opens, the following APIs are called:

  1. GET /api/v1/events/{eventId}/sessions/{sessionId}?include=speaker,relatedSessions
    • Query params: include=speaker,relatedSessions (consolidated resource expansion)
    • Returns: Complete session details with expanded speaker and related sessions
      json
      {
        "sessionId": "uuid",
        "title": "string",
        "description": "string",
        "startTime": "ISO-8601 datetime",
        "endTime": "ISO-8601 datetime",
        "duration": "integer (minutes)",
        "location": "string (Main Hall)",
        "venueDetails": "string (Kursaal Bern)",
        "sessionType": "enum (Keynote, Technical Deep Dive, Workshop, Panel)",
        "level": "enum (Beginner, Intermediate, Advanced)",
        "abstract": "string (max 1000 chars)",
        "keyTakeaways": ["string[]"],
        "targetAudience": "string",
        "prerequisites": "string",
        "capacity": "integer",
        "registeredCount": "integer",
        "registrationStatus": "enum (Open, Filling Fast, Almost Full, Full)",
        "tags": ["string[]"],
        "slidesAvailable": "boolean",
        "slidesUrl": "string | null",
        "speaker": {
          "speakerId": "uuid",
          "firstName": "string",
          "lastName": "string",
          "profilePhoto": "string (URL)",
          "company": "string",
          "position": "string",
          "bio": "string",
          "expertiseAreas": ["string[]"],
          "yearsExperience": "integer",
          "certifications": ["string[]"],
          "socialLinks": {
            "linkedin": "string | null",
            "twitter": "string | null",
            "github": "string | null"
          }
        },
        "relatedSessions": [
          {
            "sessionId": "uuid",
            "title": "string",
            "startTime": "ISO-8601 datetime",
            "sessionType": "string"
          }
        ]
      }
      
    • Used for: Display all session details including speaker info and related sessions in a single API call
    • Performance: Single API call replaces 3 separate calls (session + speaker + related sessions)

User Action APIs

  1. PATCH /api/v1/attendees/me

    • Triggered by: User clicks [πŸ“… Add to My Schedule] (authenticated users only)
    • Payload:
      json
      {
        "schedule": {
          "add": [
            {
              "sessionId": "uuid",
              "eventId": "uuid",
              "source": "session_modal"
            }
          ]
        }
      }
      
    • Returns: Updated attendee profile with schedule confirmation
      json
      {
        "scheduleId": "uuid",
        "addedAt": "ISO-8601 datetime",
        "conflictingSessions": ["sessionId[]"] // empty if no conflicts
      }
      
    • Used for: Adds session to user’s personal schedule using consolidated Attendees API (Story 1.25), shows success toast message, handles conflicts if any
  2. GET /api/v1/events/{eventId}/share-link (Event-level sharing, not session-specific)

    • Triggered by: User clicks [πŸ”— Share Session]
    • Returns: Shareable event landing page URL
      json
      {
        "shareUrl": "string (https://batbern.ch/events/{eventId})",
        "title": "string (event title for share preview)",
        "description": "string (includes session reference in share text: 'Check out this session: [Session Title]')",
        "imageUrl": "string (event banner)"
      }
      
    • Used for: Generates shareable event URL for social media, email, or copy to clipboard (no session-specific deep linking)
  3. GET /api/v1/events/{eventId}/sessions/{sessionId}/slides

    • Triggered by: User clicks [πŸ“„ Download Slides] (only if slidesAvailable = true)
    • Returns: PDF file or redirect URL to S3/CloudFront
    • Used for: Downloads session presentation slides, tracks download analytics
  4. POST /api/v1/analytics/session-view

    • Triggered by: Modal opens (automatic, no user action)
    • Payload:
      json
      {
        "sessionId": "uuid",
        "eventId": "uuid",
        "userId": "uuid | null",
        "source": "landing_page",
        "timestamp": "ISO-8601 datetime"
      }
      
    • Returns: 204 No Content
    • Used for: Track session popularity, modal view analytics, inform recommendations

Primary Navigation Actions

  1. [βœ•] Close button β†’ Closes modal

    • Target: Returns to Current Event Landing Page (same page, modal closes)
    • Context: No state change, scroll position preserved on landing page
    • Behavior: Fade-out animation, remove modal from DOM, restore body scroll
  2. [← Back to Agenda] link β†’ Closes modal and scrolls to agenda

    • Target: Current Event Landing Page, agenda section
    • Context: Closes modal, scrolls page to agenda section
    • Behavior: Modal closes, smooth scroll to #agenda anchor
  3. [Register for Event β†’] button β†’ Navigate to Event Registration page

    • Target: Event Registration Form (story-2.4-event-registration.md)
    • Context: eventId, source: β€œsession_modal”, sessionId (to pre-register interest)
    • Behavior: Full page navigation, modal closes automatically
  4. [View Full Profile β†’] link β†’ Navigate to Speaker Profile Detail View

    • Target: Speaker Profile Detail View (story-7.1-speaker-profile-detail-view.md)
    • Context: speakerId, source: β€œsession_modal”
    • Behavior: Closes current session modal, then navigates to speaker profile page (no modal stacking)

Secondary Navigation (Data Interactions)

  1. Related session link click β†’ Opens Session Details Modal for new session

    • Target: Session Details Modal for related session
    • Context: New sessionId
    • Behavior: Closes current modal first, then opens new session modal (no modal stacking, no content transition)
  2. [πŸ“… Add to My Schedule] button β†’ Inline state update

    • Target: Same modal (no navigation)
    • Context: Updates user’s schedule, changes button state
    • Behavior: Button changes to β€œβœ“ Added to Schedule” with green checkmark, shows success toast
    • Error handling: If conflict, shows conflict modal with options to resolve
  3. [πŸ”— Share Session] button β†’ Opens Share Modal or native share

    • Target: Share modal (desktop) or native share sheet (mobile)
    • Context: Session title, description (no deep link URL - shares event landing page URL only)
    • Behavior: On mobile, triggers Web Share API; on desktop, shows share options modal overlay with event landing page URL

Event-Driven Navigation

  1. User not authenticated + clicks [πŸ“… Add to My Schedule] β†’ Opens Login Modal

    • Target: Login/Registration modal
    • Context: Return action = add session to schedule, sessionId
    • Behavior: Shows login modal overlay with message β€œSign in to add sessions to your schedule”
    • Post-login: Automatically adds session to schedule and shows success message
  2. Slides not available yet (before event) β†’ No navigation, shows tooltip

    • Target: No navigation
    • Behavior: Disabled button shows tooltip β€œSlides available after the event”

Error States & Redirects

  1. Session not found (invalid sessionId) β†’ Close modal, show error toast

    • Target: Returns to Current Event Landing Page
    • Behavior: Modal closes, error toast: β€œSession not found or no longer available”
  2. API failure (500 error) β†’ Show error state in modal

    • Target: Modal remains open with error state
    • Behavior: Shows error message in modal with [Retry] button to reload session data
  3. Session canceled or removed β†’ Show cancellation notice

    • Target: Modal shows cancellation message instead of details
    • Behavior: β€œThis session has been canceled. See updated agenda for alternatives.”
    • Action: [View Updated Agenda] button closes modal and scrolls to agenda

Responsive Design Considerations

Mobile Layout Changes (<768px)

  • Full-screen modal: Modal takes entire viewport (100vw Γ— 100vh) with internal scrolling
  • Close button: Larger tap target (44Γ—44px minimum) positioned in top-right corner
  • Speaker section: Speaker photo smaller (60Γ—60px), info stacks below photo instead of beside
  • Action buttons: Stack vertically, full-width with adequate spacing (16px between)
  • Related sessions: Display as vertical list instead of horizontal
  • Typography: Larger font sizes for readability (16px minimum body text)
  • Share button: Triggers native share sheet on mobile devices

Tablet Layout Changes (768px - 1024px)

  • Centered modal: Max-width 700px, centered with backdrop on sides
  • Two-column layout: Speaker section and key takeaways side-by-side if space permits
  • Action buttons: Remain horizontal but with responsive sizing
  • Scroll behavior: Modal scrolls internally, page scroll disabled

Desktop Layout (>1024px)

  • Centered modal: Max-width 900px, centered with darkened backdrop
  • Hover states: All buttons show hover effects for better affordance
  • Keyboard shortcuts: Display keyboard shortcut hints (ESC to close)

Mobile-Specific Interactions

  • Swipe down gesture: Swipe down from top of modal to close (mobile only)
  • Tap outside modal: Tap on backdrop closes modal (with visual feedback)
  • Share via native sheet: Share button uses Web Share API on mobile for system sharing
  • Add to My Schedule: Saves to BATbern personal schedule only (no native device calendar integration)
  • Speaker photo tap: Tap on speaker photo opens full profile (not just link)

Accessibility Notes

  • Focus management:

    • Focus trapped within modal when open
    • First focusable element (close button) receives focus on open
    • Focus returns to trigger element (session card) on close
    • Tab order: Close β†’ Speaker profile β†’ Action buttons β†’ Related sessions β†’ Back/Register
  • Screen reader support:

    • Modal announced as β€œDialog: Session Details” with role="dialog" and aria-modal="true"
    • Close button labeled β€œClose session details dialog”
    • All action buttons have descriptive aria-label attributes
    • Disabled slides button includes aria-disabled="true" and tooltip text in aria-describedby
  • Keyboard navigation:

    • ESC key closes modal
    • TAB cycles through interactive elements
    • SHIFT+TAB cycles backward
    • ENTER/SPACE activates buttons and links
  • Color contrast:

    • All text meets WCAG 2.1 AA standards (4.5:1 for body, 3:1 for large text)
    • Interactive elements have sufficient contrast in all states (default, hover, focus, disabled)
  • Visual indicators:

    • Focus indicators clearly visible (2px solid outline, high contrast color)
    • Loading states announced with ARIA live regions
    • Success/error toasts announced to screen readers
  • Content structure:

    • Proper heading hierarchy (H2 for modal title, H3 for sections)
    • Lists properly marked up with semantic HTML
    • Time displayed in both human-readable and ISO-8601 format for screen readers

State Management

Local Component State

  • isOpen: boolean - Modal open/close state (managed by parent component)
  • isLoadingSession: boolean - Loading state while fetching session details
  • isLoadingSpeaker: boolean - Loading state while fetching speaker info
  • isAddingToSchedule: boolean - Loading state for β€œAdd to Schedule” action
  • isInSchedule: boolean - Whether session is already in user’s schedule
  • slideDownloadInProgress: boolean - Loading state for slide download
  • showShareOptions: boolean - Share modal visibility (desktop only)
  • scrollPosition: number - Track modal scroll for analytics (time spent by section)

Global State (Zustand Store)

  • auth.user - Current user information (null if not authenticated)
  • auth.isAuthenticated - Authentication status
  • attendee.mySchedule - List of sessionIds in user’s personal schedule
  • events.currentEvent - Current event context (eventId, eventDate)

Server State (React Query)

  • sessionDetails - Cached session data with expanded speaker and related sessions (consolidated API)

    • Query key: ['session', eventId, sessionId, 'speaker,relatedSessions']
    • Cache time: 10 minutes
    • Stale time: 5 minutes
    • Refetch on mount: false (modal-specific data)
    • Single API call replaces 3 separate queries (session + speaker + related sessions)
  • userSchedule - User’s personal schedule, invalidated on add/remove

    • Query key: ['attendee', 'me', 'schedule']
    • Cache time: 5 minutes
    • Refetch on window focus: true
    • Managed via PATCH /api/v1/attendees/me (Story 1.25)

Real-Time Updates

  • Attendance count updates: WebSocket subscription to session registration updates

    • Channel: events/${eventId}/sessions/${sessionId}/registrations
    • Events: registration.added, registration.removed
    • Behavior: Live update of β€œX/Y registered” counter and status indicator (β€œFilling up fast”, β€œAlmost full”, β€œFull”)
  • Session changes: WebSocket subscription to session updates (title, time, cancellation)

    • Channel: events/${eventId}/sessions/${sessionId}
    • Events: session.updated, session.canceled, session.time_changed
    • Behavior: Show banner at top of modal with update notification
  • Slide availability: Poll every 30 seconds after event start to check for uploaded slides

    • Condition: Only poll if slidesAvailable === false and event has started
    • Stop polling: When slides become available or modal closes

Edge Cases & Error Handling

  • Empty State (No speaker assigned): Show placeholder: β€œSpeaker to be announced” with generic avatar

  • Loading State (Initial load): Display skeleton screens for session details, speaker info, and related sessions

  • Error State (Session not found): Show error message in modal: β€œSession not found. It may have been removed or rescheduled.” with [View Updated Agenda] button

  • Error State (API failure): Show error message with [Retry] button: β€œUnable to load session details. Please try again.”

  • Session canceled: Show prominent warning banner: β€œβš οΈ This session has been canceled. See updated agenda for alternatives.” Disable registration and schedule buttons

  • Time conflict: When adding to schedule, if another session overlaps, show conflict modal: β€œThis session conflicts with [Session Title] at [Time]. Which would you like to attend?”

  • Not authenticated + Add to Schedule: Show login prompt modal: β€œCreate a free account to build your personal schedule” with [Sign Up] and [Sign In] buttons

  • Slides not available: [Download Slides] button disabled with tooltip: β€œSlides will be available after the event”

  • Share API not supported: Fallback to copy-to-clipboard with confirmation toast: β€œLink copied to clipboard”

  • Session full (capacity reached): Show β€œSession is full” badge (when registeredCount >= capacity), disable β€œAdd to Schedule” button, display message β€œThis session has reached capacity”

  • Related sessions empty: Hide β€œRelated Sessions” section entirely if no related sessions found

  • Mobile landscape mode: Ensure modal scrollable in landscape orientation with proper safe area insets

  • Slow network: Show loading skeleton immediately, timeout after 15 seconds with retry option

  • Speaker photo failed to load: Show fallback initials avatar with speaker’s first and last name initials

  • Long session description: Show truncated text with β€œRead more” link that expands to full description


Change Log

Date Version Description Author
2025-10-02 1.0 Initial wireframe creation for Session Details Modal Sally (UX Expert)
2025-10-04 1.1 Updated with stakeholder decisions: added real-time attendance, removed Q&A, no modal stacking, no calendar integration, no deep linking Sally (UX Expert)
2025-10-04 1.2 Updated to use consolidated APIs from Stories 1.17, 1.19, 1.25: single session endpoint with ?include=speaker,relatedSessions (reduced 3 API calls to 1), schedule management via PATCH /api/v1/attendees/me Winston (Architect)

Review Notes

Stakeholder Feedback

  • βœ… β€œAdd to My Schedule” scope confirmed: Platform schedule only, no external calendar integration
  • βœ… Slides downloadable after event only (Download button disabled until event completion)
  • βœ… Real-time attendance counter approved for display
  • βœ… No modal stacking - close current before opening related session
  • βœ… No deep linking support in MVP
  • βœ… Q&A section, speaker ratings, and β€œother sessions by speaker” deferred to future enhancements

Design Iterations

  • Version 1.0: Initial creation based on current event landing page navigation flows
  • Version 1.1: Updated based on stakeholder decisions:
    • Added real-time attendance counter with status indicators
    • Removed Q&A section (deferred)
    • Clarified no modal stacking for related sessions
    • Removed speaker ratings/reviews (deferred)
    • Removed calendar app integration (platform schedule only)
    • Removed deep linking support
    • Removed β€œother sessions by speaker” feature (deferred)

Open Questions

All open questions have been resolved:

  1. βœ… Real-time attendance count: Should we show real-time attendance count (β€œ120/150 registered”)?

    • DECISION: YES - Show live attendance counter with status indicators
    • Display format: β€œ87/150 registered” with status badge (β€œFilling up fast” when >50%, β€œAlmost full” when >80%, β€œFull” when at capacity)
    • Updates via WebSocket for real-time accuracy
  2. βœ… Q&A section: Do we need a Q&A section for attendees to submit questions in advance?

    • DECISION: NO - Not in MVP scope
    • Q&A functionality deferred to future enhancement
    • Focus on core session information and schedule management
  3. βœ… Related sessions navigation: Should related sessions be clickable from within the modal (modal stacking) or close current modal first?

    • DECISION: Close current modal first - No modal stacking
    • User experience: Click related session β†’ current modal closes β†’ new session modal opens
    • Simpler state management and cleaner UX
  4. βœ… Speaker ratings/reviews: Should we display speaker rating/reviews from past events?

    • DECISION: NO - Not in MVP scope
    • Speaker ratings deferred to future enhancement (Epic 7)
    • Focus on current session details and speaker credentials only
  5. βœ… Calendar app integration: Do we need to integrate with calendar apps for β€œAdd to My Schedule” (beyond authentication)?

    • DECISION: NO - Platform schedule only
    • β€œAdd to My Schedule” saves to BATbern personal schedule only
    • No iCal export, no Google Calendar integration, no device calendar sync in MVP
    • Users can view their schedule in attendee dashboard
  6. βœ… Deep linking support: Should the modal support deep linking (direct URL access)?

    • DECISION: NO - No deep linking in MVP
    • Modal only opens via user interaction on event landing page
    • Share button shares event landing page URL only (not session-specific deep link)
    • Simpler implementation and URL structure
  7. βœ… Other sessions by speaker: What happens if a speaker has multiple sessions at the event - show β€œOther sessions by this speaker”?

    • DECISION: NO - Not in MVP scope
    • Related sessions shown by topic/theme only, not by speaker
    • Speaker’s other sessions could be added in future enhancement
    • Users can find speaker’s sessions via speaker profile page (Story 7.1)