JavaScript Architecture
The plugin uses modern JavaScript patterns organized by functionality across different contexts (public, management, and blocks).
Organization
Gutenberg Block System (React)
Location: src/blocks/
Modern React-based components providing five Gutenberg blocks for comprehensive platform management:
1. Link Page Editor Block
Location: src/blocks/link-page-editor/
Complete React-based component for Gutenberg block editor providing link page editing interface with live preview.
Component Structure:
- Editor.js: Main editor container managing tabs and state
- Preview.js: Live preview component showing real-time updates
- JumpToPreview.js: Mobile navigation button to jump to preview panel
- Tab Components (
tabs/):TabInfo.js: Artist info, title, and biography editingTabLinks.js: Link management with drag-and-drop reorderingTabCustomize.js: Styling options (fonts, colors, backgrounds)TabAdvanced.js: Advanced settings (tracking, expiration, YouTube)TabSocials.js: Social platform link management
- Shared Components (
shared/): ColorPicker, ImageUploader, DraggableList, LinkPageUrl, QRCodeModal - Context System: EditorContext and PreviewContext for state management
- Custom Hooks: useArtist, useLinks, useMediaUpload, useSocials
- REST API Integration: Centralized API client for all block requests
2. Link Page Analytics Block
Location: src/blocks/artist-analytics/
Separate analytics dashboard block providing comprehensive performance metrics for link pages.
Features:
- Chart.js-powered analytics dashboard
- Daily page view aggregation
- Link click tracking and breakdown
- Date range filtering
- Visual performance metrics
- Standalone block registration for dedicated analytics interface
Component Structure:
- Analytics.js: Main analytics dashboard component
- ArtistSwitcher.js: Artist context switching for multi-artist management
- Context System: AnalyticsContext for data management
- Custom Hooks: useAnalytics for analytics data
- REST API Integration: API client for analytics data endpoints
3. Artist Manager Block
Location: src/blocks/artist-manager/
Complete artist profile management interface providing profile editing, roster management, and subscriber administration.
Features:
- Artist information and biography editing
- Profile image upload and management
- Roster/member management with invitation system
- Subscriber list management and export
- Social link management
- Tab-based interface for organized management
Build Configuration:
- Webpack:
webpack.config.js– Compiles React and SCSS for all blocks - wp-scripts: WordPress build tooling for React/Webpack integration
- Compiled Output:
build/blocks/*/– Generated assets for each block - Asset Enqueuing: Auto-detected via
register_block_type()manifest for each block - Build Process:
npm run buildcompiles all blocks to production bundle
Public Interface Scripts
Location: inc/link-pages/live/assets/js/
link-page-public-tracking.js– Analytics and click trackinglink-page-subscribe.js– Subscription form functionalitylink-page-youtube-embed.js– YouTube video embed handlingextrch-share-modal.js– Native Web Share API with social fallbackslink-page-edit-button.js– Permission check and button rendering
Artist Profile Management
Artist profile management is handled exclusively via the Artist Manager block (src/blocks/artist-manager/).
Location: inc/artist-profiles/assets/js/
artist-members-admin.js– Backend member administration
Global Components
Location: assets/js/
artist-platform.js– Core plugin functionalityartist-platform-home.js– Homepage-specific features
Join Flow Interface
Location: inc/join/assets/js/
join-flow-ui.js– Modal handling for existing vs new account selection
Advanced Features
Location: src/blocks/link-page-editor/
- Link expiration scheduling
- Temporary redirect configuration
- YouTube embed settings
- Subscription form configuration
- Google Tag Manager and Meta Pixel integration
Core Patterns
REST API Integration
Client Pattern (Gutenberg blocks):
// Centralized API client in src/blocks/shared/api/client.js
const response = await apiClient.post( '/extrachill/v1/link-pages/{id}', data );
Form Serialization
Complex data structures handled via:
- Gutenberg block attributes (primary modern approach)
- JSON meta fields (persistent storage)
Build System
Webpack Configuration (webpack.config.js):
- Compiles React JSX and modern JavaScript
- SCSS preprocessing for component styles
- Production and development modes
Build Commands:
npm run build # Production bundle
npm run start # Development with watch mode
npm run lint # Code linting
npm run format # Code formatting
Output:
- Compiled assets:
build/blocks/link-page-editor/ - Block manifest:
build/blocks/link-page-editor/block.json - Auto-enqueued by WordPress via
register_block_type()
Performance Optimization
Conditional Asset Loading
Assets loaded based on context:
- Join flow assets: Only on login page with
from_joinparameter - Management assets: Only on artist/link page management pages
- Public assets: Only on public link pages
Code Splitting
Gutenberg block system provides natural code splitting via:
- Separate block registration and enqueuing
- Context-specific component loading
- Lazy hook initialization
Browser Compatibility
Modern API Usage:
- Fetch API: For modern browsers (no IE support)
- Native Web Share: Fallback to clipboard copy
- Intersection Observer: For lazy loading
- ES6 modules: Via Webpack transpilation
Fallbacks:
- Clipboard copy fallback for Web Share API
- Traditional form submission fallback