@aslaluroba/help-center
Version:
A powerful and customizable help center widget for Angular applications with real-time chat functionality, AI assistance, multi-language support, and user feedback collection.
412 lines (306 loc) • 13.8 kB
Markdown
# @aslaluroba/help-center
A powerful and customizable help center widget for Angular applications with real-time chat functionality, AI assistance, multi-language support, and user feedback collection.
## Installation
```bash
yarn add @aslaluroba/help-center
npm install @aslaluroba/help-center
```
## Styles Setup
**Important:** You must import the library's styles in your application for the widget to display correctly.
This library is built with **TailwindCSS v4** and uses utility-first CSS for all styling. The stylesheet contains CSS custom properties for theming and Tailwind configuration.
### Import the stylesheet
Add this import to your application's main `styles.css` file:
```css
@import '@aslaluroba/help-center/styles/styles.css';
```
Or add it to your `angular.json`:
```json
{
"projects": {
"your-app": {
"architect": {
"build": {
"options": {
"styles": [
"src/styles.css",
"node_modules/@aslaluroba/help-center/styles/styles.css"
]
}
}
}
}
}
}
```
**Note:** The stylesheet is pre-compiled and ready to use. No SCSS preprocessor or additional build configuration is required.
## Assets setup (when using as npm package)
When you use the library as an npm package, the loading screen uses an animated logo from `/assets/animatedLogo.gif`. You must copy the library's assets into your app's build so that path resolves.
In your `angular.json`, add this to your project's `build` → `options` → `assets` array:
```json
{
"glob": "**/*",
"input": "node_modules/@aslaluroba/help-center/assets",
"output": "assets"
}
```
Alternatively, you can provide your own logo URL via the `HELP_CENTER_LOADING_LOGO_URL` token:
```typescript
import { HELP_CENTER_LOADING_LOGO_URL } from '@aslaluroba/help-center';
bootstrapApplication(AppComponent, {
providers: [
{ provide: HELP_CENTER_LOADING_LOGO_URL, useValue: 'assets/my-loading-logo.gif' },
],
});
```
📚 **Helpful Resources:**
- [Integration Example](./INTEGRATION_EXAMPLE.md) - Complete step-by-step integration guide
- [Stylesheet Export Guide](./STYLESHEET_EXPORT_GUIDE.md) - Detailed information about TailwindCSS styling and the build process
## Setup and Configuration
1. Provide `ApiService` once (e.g., in `main.ts`) and use the standalone component in your app:
```typescript
import { bootstrapApplication } from "@angular/platform-browser";
import { Component, OnInit, inject } from "@angular/core";
import { ApiService, ApiConfig, Language, HelpCenterWidgetComponent } from "@aslaluroba/help-center";
bootstrapApplication(AppComponent, {
providers: [ApiService],
});
@Component({
selector: "app-root",
standalone: true,
imports: [HelpCenterWidgetComponent],
template: ` <app-help-center-widget [getToken]="getToken" [helpScreenId]="helpScreenId" [currentLang]="currentLang" [showArrow]="true" [primaryColor]="primaryColor" [logoUrl]="logoUrl"> </app-help-center-widget> `,
})
export class AppComponent implements OnInit {
private apiService = inject(ApiService);
helpScreenId = "your-help-screen-id";
currentLang: Language = "en";
primaryColor = "#ad49e1";
logoUrl = "assets/logo.svg";
ngOnInit() {
const apiConfig: ApiConfig = {
getToken: this.getToken,
// Optional: baseUrl override (default: https://babylai.net/api)
// baseUrl: 'https://your-custom-api.com'
};
this.apiService.initialize(apiConfig);
}
getToken = async () => {
const response = await fetch("your-auth-endpoint");
const data = await response.json();
return data.token;
};
}
```
## User Feedback System
The widget includes a comprehensive user feedback system that collects ratings and comments after meaningful chat interactions:
### Review Dialog Features
- **Star Rating**: 1-5 star rating system with visual feedback
- **Comment Collection**: Text area for detailed feedback (10-500 characters)
- **Smart Display**: Only appears after meaningful chat interactions (not just welcome messages)
- **Validation**: Real-time validation with error messages
- **API Integration**: Automatically submits reviews to your backend
- **Multi-language**: Fully translated interface
### Review API Endpoint
Reviews are submitted to: `POST /Client/ClientChatSession/{sessionId}/review`
```typescript
// Review payload structure
{
"rating": 5, // 1-5 stars
"comment": "Great help!" // 10-500 characters
}
```
### Review Dialog Behavior
- **Triggers**: Only after ending a chat with meaningful interaction
- **Skips**: If user just opens chat without interaction
- **Validation**: Client-side validation with real-time feedback
- **Submission**: Closes chat session first, then submits review
- **Error Handling**: Graceful handling of submission failures
## Smart Session Management
The widget includes intelligent chat session management to provide a seamless user experience:
### Confirmation Dialogs
- **End Chat Confirmation**: Prevents accidental loss of active conversations
- **Start New Chat Confirmation**: Warns users when switching between chat sessions
- **Smart Detection**: Distinguishes between welcome messages and meaningful interactions
### Session Persistence
- **Back Navigation**: Chat state maintained when navigating back to help screen
- **Return to Chat**: Users can return to their previous conversation
- **Duplicate Prevention**: Intelligent message handling prevents duplicate welcome messages
### Session States
- **Active Session**: User has meaningful interaction (not just welcome message)
- **Welcome Only**: User opened chat but didn't interact meaningfully
- **Clean State**: No previous session or messages
### Attachments
- Users can add files; uploads are presigned and stored via S3
- Pending files are uploaded after the first message creates a session
- Attachment IDs are sent with messages and delivered in Ably payloads
## Language Support
The widget supports multiple languages with built-in RTL support. Currently available languages:
- English (en) - Default
- Arabic (ar) - With RTL support
### Changing Languages
1. Simple language switch:
```typescript
import { Component } from "@angular/core";
import { Language } from "@aslaluroba/help-center";
@Component({
selector: "app-root",
template: `
<div>
<!-- Language Switcher -->
<div class="language-buttons">
<button (click)="currentLang = 'en'">English</button>
<button (click)="currentLang = 'ar'">العربية</button>
</div>
<!-- Widget -->
<app-help-center-widget [getToken]="getToken" [helpScreenId]="helpScreenId" [currentLang]="currentLang" [primaryColor]="primaryColor" [logoUrl]="logoUrl"> </app-help-center-widget>
</div>
`,
})
export class AppComponent {
helpScreenId = "your-help-screen-id";
currentLang: Language = "en";
primaryColor = "#ad49e1";
logoUrl = "assets/logo.svg";
getToken = async () => {
// Your token implementation
return "your-token";
};
}
```
2. Using Translation Service (for advanced usage):
```typescript
import { Component } from "@angular/core";
import { TranslationService, Language } from "@aslaluroba/help-center";
@Component({
selector: "app-root",
})
export class AppComponent {
constructor(private translationService: TranslationService) {
// Subscribe to language changes
this.translationService.currentLang.subscribe((lang: Language) => {
console.log("Current language:", lang);
});
// Change language
this.translationService.setLanguage("ar");
}
}
```
## Theming and Customization
**Prerequisites:** Make sure you have imported the library styles as described in the [Styles Setup](#styles-setup) section above. The theming system relies on CSS variables defined in the stylesheet.
The help center widget supports dynamic theming through two main properties:
### Primary Color
The `primaryColor` property allows you to customize the color scheme throughout the widget. The theming system automatically generates color variations based on your primary color.
```typescript
// Example usage
export class AppComponent {
primaryColor = "#3b82f6"; // Blue theme
// or
primaryColor = "#10b981"; // Green theme
// or
primaryColor = "#ff6b35"; // Orange theme
}
```
**Supported Color Formats:**
- Hex colors: `#3b82f6`, `#10b981`
- RGB: `rgb(59, 130, 246)`
- HSL: `hsl(217, 91%, 60%)`
**Auto-Generated Color Variations:**
The system automatically creates 10 color shades (100-950) based on your primary color for consistent theming across all components.
### Logo Customization
The `logoUrl` property allows you to display your custom logo in the help button.
```typescript
// Example usage
export class AppComponent {
logoUrl = "/assets/my-logo.png"; // Local asset
// or
logoUrl = "https://example.com/logo.png"; // External URL
// or
logoUrl = "assets/logo.svg"; // Default logo (fallback)
}
```
**Logo Requirements:**
- **Format**: PNG, JPG, SVG, or any web-compatible image format
- **Size**: Recommended 50x50px for optimal display
- **Fallback**: If the provided logo fails to load, it will fallback to the default logo
### Complete Theming Example
```typescript
import { Component } from "@angular/core";
@Component({
selector: "app-root",
template: ` <app-help-center-widget [getToken]="getToken" [helpScreenId]="helpScreenId" [primaryColor]="primaryColor" [logoUrl]="logoUrl" [currentLang]="currentLang" [showArrow]="true"> </app-help-center-widget> `,
})
export class AppComponent {
helpScreenId = "your-help-screen-id";
currentLang = "en";
primaryColor = "#3b82f6"; // Blue theme
logoUrl = "/assets/company-logo.png";
getToken = async () => {
// Your token implementation
return "your-token";
};
// Dynamic theme switching
switchToGreenTheme() {
this.primaryColor = "#10b981";
this.logoUrl = "/assets/green-logo.png";
}
switchToPurpleTheme() {
this.primaryColor = "#ad49e1";
this.logoUrl = "/assets/purple-logo.png";
}
}
```
## Features
- **Real-time Chat**: WebSocket-based messaging with Ably integration
- **AI Assistant**: Intelligent responses and conversation management
- **Multi-language Support**: English and Arabic with RTL support
- **User Feedback**: Review dialog for collecting ratings and comments
- **Smart Session Management**: Intelligent chat session handling with confirmation dialogs
- **Customizable Theming**: Dynamic color schemes and logo customization
- **Responsive Design**: Mobile-first approach with accessibility features
- **Duplicate Prevention**: Smart message handling to prevent duplicate content
- **File Attachments**: Presigned uploads with attachment IDs delivered to the assistant
## Props
| Prop | Type | Required | Default | Description |
| -------------------- | -------- | -------- | ----------- | ------------------------------------------------ |
| getToken | function | Yes | - | Function that returns a Promise<string> for auth |
| helpScreenId | string | Yes | - | Unique help screen identifier |
| currentLang | Language | No | 'en' | UI language ('en' \| 'ar') |
| showArrow | boolean | No | true | Show/hide floating arrow |
| messageLabel | string | No | null | Custom message for the help button |
| primaryColor | string | No | '#ad49e1' | Primary color for theming (hex format) |
| logoUrl | string | No | '/logo.svg' | URL path to custom logo image |
## Quick Reference
### Basic Usage
```html
<app-help-center-widget [getToken]="getToken" [helpScreenId]="helpScreenId"> </app-help-center-widget>
```
### With Custom Theme
```html
<app-help-center-widget [getToken]="getToken" [helpScreenId]="helpScreenId" [primaryColor]="'#3b82f6'" [logoUrl]="'/my-logo.png'"> </app-help-center-widget>
```
### With All Options
```html
<app-help-center-widget [getToken]="getToken" [helpScreenId]="helpScreenId" [currentLang]="'en'" [showArrow]="true" [messageLabel]="'Need help?'" [primaryColor]="'#3b82f6'" [logoUrl]="'/my-logo.png'"> </app-help-center-widget>
```
## Troubleshooting
### Common Issues
1. **Duplicate Welcome Messages**
- **Fixed**: The widget now intelligently detects and prevents duplicate welcome messages
- **Cause**: Previously occurred when starting new chat after going back
- **Solution**: Smart session detection and proper session clearing
2. **Review Dialog Not Showing**
- **Expected**: Review dialog only appears after meaningful chat interactions
- **Not Showing**: If user only sees welcome message without interaction
- **Solution**: This is intentional behavior to avoid unnecessary review prompts
3. **Chat Session Issues**
- **Session Persistence**: Chat state is maintained when navigating back
- **Confirmation Dialogs**: Prevent accidental loss of conversations
- **Smart Detection**: System distinguishes between welcome messages and real interactions
4. **API Integration**
- **Review Endpoint**: Ensure your backend supports `POST /Client/ClientChatSession/{id}/review`
- **Token Authentication**: Verify `getToken` function returns valid JWT
- **Error Handling**: Review submission failures are handled gracefully
## Support
For issues and feature requests, please visit our [GitHub repository](https://github.com/aslaluroba/help-center/issues).
## License
MIT License - see the [LICENSE](LICENSE) file for details.