4.1 KiB
4.1 KiB
CLAUDE: webapp/channels/
Purpose
- Main Mattermost web client workspace; almost every UI or Redux change flows through this package.
- Runs as an npm workspace – use
--workspace=channelswhen installing deps or running scripts. - Builds a federated bundle consumed by the server and plugins.
Local Commands
npm run dev-server --workspace=channels– hot-reload development server.npm run build --workspace=channels– production bundle (invokes webpack config in this folder).npm run test --workspace=channels/npm run test:watch --workspace=channels.npm run check --workspace=channelsandnpm run fix --workspace=channelsfor lint/style fixes.
Directory Structure (src/)
src/
├── components/ # React components organized by feature (300+ subdirectories)
├── actions/ # Redux action creators (sync and async thunks)
├── selectors/ # Redux selectors for deriving state
├── reducers/ # Redux reducers for state management
├── utils/ # Utility functions and helpers
├── tests/ # Test utilities and helpers
├── i18n/ # Internationalization files
├── sass/ # Global SCSS styles and theme variables
├── types/ # TypeScript type definitions specific to the web app
├── store/ # Redux store configuration with redux-persist
├── plugins/ # Plugin integration points
├── packages/
│ └── mattermost-redux/ # Core Redux layer (actions, reducers, selectors)
├── entry.tsx # Application entry point
└── root.tsx # Root React component
State Management
- Redux + Redux Thunk: Central state management using Redux with thunk middleware for async actions.
- Redux Persist: State persistence using localForage with cross-tab synchronization.
- Mattermost Redux: Core Redux logic (
state.entities.*for server data). - State Views:
state.views.*for UI state (modals, sidebars, preferences). - Client4: Singleton HTTP client for API requests. Should only be used in Redux actions.
Key Files
package.json– workspace-specific scripts, env vars, and browserlist targets.webpack.config.js– module federation + alias map; update remotes or exposes here only when necessary.jest.config.js– test roots, transformers, moduleNameMapper for workspace aliases.tsconfig.json– project references forsrc,tests, and embedded packages.
TypeScript Configuration
- Strict Mode: TypeScript strict mode enabled with
strictNullChecks - Path Aliases: Configured for
@mattermost/*packages andmattermost-redux/* - Composite Projects: Uses TypeScript project references for workspace packages
- No Any: Avoid
anytypes; legacy code may have them but new code should be typed
Module Federation Notes
- Use
channels/src/module_registry.tsto register async chunks; never import plugin remotes synchronously. - Exposed modules must stay backward compatible; document any break in
webapp/README.md. - When adding a new remote, coordinate with server config (see
webpack.config.js→remotes). - Prefer wrapping plugin surfaces in adapter components so that federated boundaries remain stable.
Dependencies & UI Stack
- React 18, Redux 5, React Router 5, React Intl, Floating UI, Compass Icons, Monaco.
- Follow
webapp/STYLE_GUIDE.md → Dependencies & Packagesbefore introducing new libs. @mattermost/types,@mattermost/client, andplatform/componentsare first-party packages; import via full package names, not deep relative paths.
Common Gotchas
- Postinstall builds platform packages—if TypeScript types feel stale, re-run
npm installat repo root. - Use
npm add <pkg> --workspace=channelsto avoid polluting other workspaces. - Environment-specific overrides live in
config/on the server side; do not hard-code URLs or feature flags here. - Webpack aliases mirror tsconfig paths; keep both in sync when adding a new alias.
References
webapp/STYLE_GUIDE.md → Automated Style Checking,Dependencies & Packages.webapp/README.mdfor high-level architecture and release info.