@restnfeel/agentc-starter-kit
Version:
한국어 기업용 CMS 모듈 - Task Master AI와 함께 빠르게 웹사이트를 구현할 수 있는 재사용 가능한 컴포넌트 시스템
799 lines (651 loc) • 17.7 kB
Markdown
# AgentC Customer Chat Library
[](https://github.com/agentc/starter-kit)
[](https://www.typescriptlang.org/)
[](https://reactjs.org/)
[](LICENSE)
한국 기업을 위한 포괄적이고 반응형 고객 채팅 라이브러리입니다. 데스크톱과 모바일 환경을 모두 지원하며, 디바이스 감지, 성능 최적화, 접근성 기능이 내장되어 있습니다.
## 🌟 주요 기능
- **🎯 통합 채팅 시스템**: 모든 채팅 컴포넌트를 하나로 통합
- **📱 반응형 디자인**: 자동 디바이스 감지 및 적응형 UI
- **⚡ 성능 최적화**: 메모리 관리, 가상화, 레이지 로딩
- **🌐 다국어 지원**: 7개 언어 (한국어, 영어, 일본어, 중국어, 스페인어, 프랑스어, 독일어)
- **🎨 테마 시스템**: 기본, 다크, 컴팩트 테마 및 커스텀 테마 지원
- **♿ 접근성**: WCAG 2.1 AA 준수, 스크린 리더 지원
- **🔒 타입 안전성**: 완전한 TypeScript 지원
- **🛡️ 엣지 케이스 처리**: 방향 변경, 키보드 감지, 메모리 관리
## 📦 설치
```bash
npm install agentc-customer-chat
# 또는
yarn add agentc-customer-chat
# 또는
pnpm add agentc-customer-chat
```
## 🚀 빠른 시작
### 기본 사용법
```tsx
import { SimpleCustomerChat } from 'agentc-customer-chat';
function App() {
return (
<SimpleCustomerChat
apiKey="your-api-key"
welcomeMessage="안녕하세요! 무엇을 도와드릴까요?"
language="ko"
theme="default"
onMessage={(message) => console.log('메시지 전송:', message)}
onResponse={(response) => console.log('응답 수신:', response)}
/>
);
}
```
### 고급 사용법
```tsx
import {
UnifiedCustomerChatLibrary,
UnifiedCustomerChatLibraryConfig
} from 'agentc-customer-chat';
const config: Partial<UnifiedCustomerChatLibraryConfig> = {
// API 설정
api: {
baseUrl: 'https://api.example.com',
apiKey: 'your-api-key',
timeout: 10000,
retryAttempts: 3
},
// UI 설정
ui: {
theme: 'dark',
brandName: '내 브랜드',
primaryColor: '#3B82F6',
enableThemeToggle: true
},
// 언어 설정
i18n: {
defaultLanguage: 'ko',
enableLanguageSelector: true,
autoDetectLanguage: true
},
// 기능 설정
features: {
enableSuggestedQuestions: true,
enableTypingIndicator: true,
enableFileUpload: true,
enableChatHistory: true,
enableRealTimeSync: true,
enableNotifications: true
},
// 플로팅 버튼 설정
floatingButton: {
enabled: true,
position: 'bottom-right',
size: 'medium',
showBadge: true
},
// 반응형 설정
mobileBreakpoint: 768,
tabletBreakpoint: 1024,
desktopBreakpoint: 1200,
defaultChatMode: 'auto',
// 성능 설정
performance: {
enableOptimization: true,
enableMemoryManagement: true,
enableGarbageCollection: true,
memoryThreshold: 0.8,
maxCacheSize: 100,
debounceMs: 300,
throttleMs: 100
},
// 접근성 설정
accessibility: {
enableScreenReader: true,
enableKeyboardNavigation: true,
enableHighContrast: false,
enableFocusVisible: true,
ariaLabels: {
chatButton: '채팅 열기',
closeButton: '채팅 닫기',
sendButton: '메시지 전송'
}
}
};
function App() {
return (
<UnifiedCustomerChatLibrary
config={config}
onMessage={(message) => {
console.log('메시지 전송:', message);
}}
onResponse={(response) => {
console.log('응답 수신:', response);
}}
onDeviceChange={(deviceInfo) => {
console.log('디바이스 변경:', deviceInfo);
}}
onError={(error) => {
console.error('에러 발생:', error);
}}
/>
);
}
```
## 🔧 컴포넌트 API
### UnifiedCustomerChatLibrary
메인 통합 채팅 라이브러리 컴포넌트입니다.
#### Props
| Prop | Type | Default | Description |
|------|------|---------|-------------|
| `config` | `Partial<UnifiedCustomerChatLibraryConfig>` | `{}` | 라이브러리 설정 객체 |
| `children` | `ReactNode` | - | 자식 컴포넌트 |
| `onMessage` | `(message: string) => void` | - | 메시지 전송 시 호출 |
| `onResponse` | `(response: string) => void` | - | 응답 수신 시 호출 |
| `onDeviceChange` | `(deviceInfo: DeviceInfo) => void` | - | 디바이스 변경 시 호출 |
| `onError` | `(error: Error) => void` | - | 에러 발생 시 호출 |
| `className` | `string` | - | CSS 클래스명 |
| `style` | `CSSProperties` | - | 인라인 스타일 |
### SimpleCustomerChat
간단한 설정으로 사용할 수 있는 기본 채팅 컴포넌트입니다.
#### Props
| Prop | Type | Default | Description |
|------|------|---------|-------------|
| `apiKey` | `string` | - | API 키 |
| `welcomeMessage` | `string` | - | 환영 메시지 |
| `language` | `SupportedLanguage` | `'ko'` | 언어 설정 |
| `theme` | `string` | `'default'` | 테마 이름 |
| `onMessage` | `(message: string) => void` | - | 메시지 전송 시 호출 |
| `onResponse` | `(response: string) => void` | - | 응답 수신 시 호출 |
### AdvancedCustomerChat
커스터마이징 가능한 고급 채팅 컴포넌트입니다.
#### Props
`UnifiedCustomerChatLibraryProps`의 모든 props 외에:
| Prop | Type | Default | Description |
|------|------|---------|-------------|
| `customComponents` | `CustomComponents` | - | 커스텀 컴포넌트 객체 |
```tsx
interface CustomComponents {
FloatingButton?: ComponentType<any>;
ChatWidget?: ComponentType<any>;
SuggestedQuestions?: ComponentType<any>;
}
```
## 🎣 훅(Hooks)
### useCustomerChat
채팅 상태와 액션을 관리하는 훅입니다.
```tsx
import { useCustomerChat } from 'agentc-customer-chat';
function MyComponent() {
const {
// 상태
deviceInfo,
isMobile,
isTablet,
isDesktop,
isTouchDevice,
isKeyboardVisible,
connectionType,
batteryLevel,
isCharging,
orientation,
theme,
// 메서드
sendMessage,
clearHistory,
changeTheme
} = useCustomerChat();
return (
<div>
<p>현재 디바이스: {deviceInfo.type}</p>
<p>화면 크기: {deviceInfo.screenWidth}x{deviceInfo.screenHeight}</p>
<button onClick={() => changeTheme('dark')}>
다크 테마로 변경
</button>
</div>
);
}
```
### useDeviceDetection
디바이스 정보를 감지하는 훅입니다.
```tsx
import { useDeviceDetection } from 'agentc-customer-chat';
function MyComponent() {
const {
deviceInfo,
isDesktop,
isTablet,
isMobile,
orientation,
breakpoint
} = useDeviceDetection();
return (
<div>
{isMobile && <MobileLayout />}
{isTablet && <TabletLayout />}
{isDesktop && <DesktopLayout />}
</div>
);
}
```
### useResponsiveChatSystem
반응형 채팅 시스템을 관리하는 통합 훅입니다.
```tsx
import { useResponsiveChatSystem } from 'agentc-customer-chat';
function MyComponent() {
const {
// 채팅 상태
isOpen,
isConnected,
isTyping,
messages,
session,
// 디바이스 상태
deviceInfo,
isDesktop,
isMobile,
// 채팅 액션
sendMessage,
openChat,
closeChat,
toggleChat,
clearHistory,
// 설정
chatMode,
setChatMode,
config
} = useResponsiveChatSystem();
return (
<div>
<button onClick={toggleChat}>
{isOpen ? '채팅 닫기' : '채팅 열기'}
</button>
<p>연결 상태: {isConnected ? '연결됨' : '연결 안됨'}</p>
<p>메시지 수: {messages.length}</p>
</div>
);
}
```
## 🎨 테마 시스템
### 기본 테마
```tsx
import { themes, applyTheme } from 'agentc-customer-chat';
// 사용 가능한 테마
const availableThemes = {
default: themes.default,
dark: themes.dark,
compact: themes.compact
};
// 테마 적용
applyTheme('dark');
```
### 커스텀 테마
```tsx
import { ChatbotTheme, applyTheme } from 'agentc-customer-chat';
const customTheme: ChatbotTheme = {
primary: '#FF6B6B',
secondary: '#4ECDC4',
background: '#FFFFFF',
surface: '#F8F9FA',
text: {
primary: '#2D3748',
secondary: '#718096',
inverse: '#FFFFFF'
},
border: '#E2E8F0',
shadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1)',
success: '#48BB78',
warning: '#ED8936',
error: '#F56565',
radius: {
sm: '0.25rem',
md: '0.375rem',
lg: '0.5rem',
full: '9999px'
},
spacing: {
xs: '0.25rem',
sm: '0.5rem',
md: '1rem',
lg: '1.5rem',
xl: '2rem'
},
typography: {
fontFamily: 'Inter, -apple-system, BlinkMacSystemFont, sans-serif',
fontSize: {
xs: '0.75rem',
sm: '0.875rem',
md: '1rem',
lg: '1.125rem',
xl: '1.25rem'
},
fontWeight: {
normal: '400',
medium: '500',
semibold: '600',
bold: '700'
}
}
};
// 커스텀 테마 적용
applyTheme(customTheme);
```
## 🌐 다국어 지원
### 지원 언어
- `ko` - 한국어 (기본)
- `en` - English
- `ja` - 日本語
- `zh` - 中文
- `es` - Español
- `fr` - Français
- `de` - Deutsch
### 사용법
```tsx
import { I18nProvider, useI18n } from 'agentc-customer-chat';
function App() {
return (
<I18nProvider defaultLanguage="ko">
<MyComponent />
</I18nProvider>
);
}
function MyComponent() {
const { t, currentLanguage, changeLanguage } = useI18n();
return (
<div>
<h1>{t('welcome')}</h1>
<button onClick={() => changeLanguage('en')}>
English
</button>
</div>
);
}
```
### 커스텀 번역
```tsx
import { translations } from 'agentc-customer-chat';
// 기존 번역 확장
const customTranslations = {
...translations.ko,
customMessage: '커스텀 메시지',
newFeature: '새로운 기능'
};
// 새로운 언어 추가
const myLanguageTranslations = {
chatbot: 'My Chatbot',
placeholder: 'Type your message...',
send: 'Send',
// ... 기타 번역
};
```
## 📱 반응형 동작
### 디바이스 감지
라이브러리는 다음 방법으로 디바이스를 자동 감지합니다:
- **화면 크기**: 브레이크포인트 기반 감지
- **터치 지원**: 터치 이벤트 지원 여부
- **사용자 에이전트**: 브라우저 문자열 분석
- **방향**: 가로/세로 모드
- **키보드**: 모바일 키보드 표시 여부
### 브레이크포인트
```tsx
const defaultBreakpoints = {
mobile: 768, // 0 ~ 767px
tablet: 1024, // 768 ~ 1023px
desktop: 1200 // 1024px+
};
```
### 조건부 렌더링
```tsx
import { DeviceConditional } from 'agentc-customer-chat';
function MyComponent() {
return (
<>
<DeviceConditional device="mobile">
<MobileOnlyComponent />
</DeviceConditional>
<DeviceConditional device={['tablet', 'desktop']}>
<TabletDesktopComponent />
</DeviceConditional>
</>
);
}
```
## ⚡ 성능 최적화
### 메모리 관리
```tsx
const config = {
performance: {
enableOptimization: true,
enableMemoryManagement: true,
enableGarbageCollection: true,
memoryThreshold: 0.8, // 80% 메모리 사용시 정리
maxCacheSize: 100, // 최대 캐시 아이템 수
debounceMs: 300, // 디바운스 시간
throttleMs: 100 // 스로틀 시간
}
};
```
### 가상화 리스트
```tsx
import { VirtualizedList } from 'agentc-customer-chat';
function MessageList({ messages }) {
return (
<VirtualizedList
items={messages}
itemHeight={60}
containerHeight={400}
renderItem={({ item, index }) => (
<MessageItem key={item.id} message={item} />
)}
/>
);
}
```
### 레이지 로딩
```tsx
import { LazyComponent } from 'agentc-customer-chat';
function App() {
return (
<LazyComponent
fallback={<div>로딩 중...</div>}
rootMargin="100px"
>
<HeavyComponent />
</LazyComponent>
);
}
```
## 🛡️ 타입 안전성
### 타입 가드 사용
```tsx
import {
isMessage,
isChatSession,
validateUnifiedChatLibraryConfig
} from 'agentc-customer-chat';
function handleMessage(data: unknown) {
if (isMessage(data)) {
// data는 이제 Message 타입
console.log('메시지 내용:', data.content);
}
}
function validateConfig(config: any) {
const result = validateUnifiedChatLibraryConfig(config);
if (!result.isValid) {
console.error('설정 오류:', result.errors);
}
}
```
### 런타임 검증
```tsx
import {
assertIsMessage,
sanitizeMessage,
ChatLibraryTypeError
} from 'agentc-customer-chat';
function processMessage(rawMessage: any) {
try {
// 런타임에서 타입 검증
assertIsMessage(rawMessage);
// 이제 rawMessage는 Message 타입
console.log('검증된 메시지:', rawMessage.content);
} catch (error) {
if (error instanceof ChatLibraryTypeError) {
console.error('타입 오류:', error.message);
}
}
}
function sanitizeUserInput(input: Partial<Message>) {
const sanitized = sanitizeMessage(input);
if (sanitized) {
// 안전하게 정제된 메시지 사용
processMessage(sanitized);
}
}
```
## 🔧 고급 기능
### 플러그인 시스템
```tsx
import { ChatPlugin, ChatPluginContext } from 'agentc-customer-chat';
const analyticsPlugin: ChatPlugin = {
name: 'analytics',
version: '1.0.0',
enabled: true,
config: {
trackingId: 'GA-XXXXX-XX'
},
initialize(context: ChatPluginContext) {
// 플러그인 초기화 로직
console.log('Analytics plugin initialized');
},
destroy() {
// 정리 로직
console.log('Analytics plugin destroyed');
}
};
```
### 커스텀 컴포넌트
```tsx
import { AdvancedCustomerChat } from 'agentc-customer-chat';
function CustomFloatingButton() {
return (
<button className="my-custom-button">
💬 채팅하기
</button>
);
}
function CustomChatWidget() {
return (
<div className="my-custom-chat">
<h3>커스텀 채팅 위젯</h3>
{/* 커스텀 UI */}
</div>
);
}
function App() {
return (
<AdvancedCustomerChat
customComponents={{
FloatingButton: CustomFloatingButton,
ChatWidget: CustomChatWidget
}}
/>
);
}
```
### 엣지 케이스 처리
```tsx
import { useEdgeCaseHandler } from 'agentc-customer-chat';
function MyComponent() {
const {
isRapidResizing,
isOrientationChanging,
memoryUsage,
hasMultipleInstances
} = useEdgeCaseHandler({
enableOrientationLock: true,
enableRapidResizeProtection: true,
enableMultipleInstancePrevention: true,
enableMemoryLeakPrevention: true
});
if (hasMultipleInstances) {
return <div>이미 다른 탭에서 채팅이 열려있습니다.</div>;
}
return (
<div>
{isRapidResizing && <div>화면 크기 조정 중...</div>}
{memoryUsage > 0.9 && <div>메모리 사용량이 높습니다.</div>}
</div>
);
}
```
## 🐛 디버깅
### 개발 도구
```tsx
import { ChatLibraryDebugInfo } from 'agentc-customer-chat';
function App() {
return (
<>
<MyApp />
{/* 개발 환경에서만 표시됨 */}
<ChatLibraryDebugInfo />
</>
);
}
```
### 로깅
```tsx
const config = {
enableDebug: true,
debugLevel: 'info' as const, // 'error' | 'warn' | 'info' | 'debug'
};
```
## 🧪 테스트
### 단위 테스트
```tsx
import { render, screen } from '@testing-library/react';
import { SimpleCustomerChat } from 'agentc-customer-chat';
test('채팅 컴포넌트가 렌더링됨', () => {
render(
<SimpleCustomerChat
apiKey="test-key"
welcomeMessage="테스트 메시지"
/>
);
expect(screen.getByText('테스트 메시지')).toBeInTheDocument();
});
```
### 통합 테스트
```tsx
import { render, fireEvent, waitFor } from '@testing-library/react';
import { UnifiedCustomerChatLibrary } from 'agentc-customer-chat';
test('메시지 전송 기능', async () => {
const mockOnMessage = jest.fn();
render(
<UnifiedCustomerChatLibrary
config={{ api: { apiKey: 'test' } }}
onMessage={mockOnMessage}
/>
);
const input = screen.getByPlaceholderText('메시지를 입력하세요...');
const sendButton = screen.getByRole('button', { name: '전송' });
fireEvent.change(input, { target: { value: '테스트 메시지' } });
fireEvent.click(sendButton);
await waitFor(() => {
expect(mockOnMessage).toHaveBeenCalledWith('테스트 메시지');
});
});
```
## 📄 라이선스
MIT License - 자세한 내용은 [LICENSE](LICENSE) 파일을 참조하세요.
## 🤝 기여하기
1. 포크하기
2. 기능 브랜치 생성 (`git checkout -b feature/amazing-feature`)
3. 변경사항 커밋 (`git commit -m 'Add amazing feature'`)
4. 브랜치에 푸시 (`git push origin feature/amazing-feature`)
5. Pull Request 생성
## 📞 지원
- 📧 이메일: support@agentc.kr
- 📚 문서: [https://docs.agentc.kr](https://docs.agentc.kr)
- 🐛 이슈: [GitHub Issues](https://github.com/agentc/starter-kit/issues)
## 📝 변경사항
최신 변경사항은 [CHANGELOG.md](CHANGELOG.md)를 참조하세요.
---
**AgentC Customer Chat Library**는 한국 기업의 고객 서비스를 위해 설계된 포괄적인 채팅 솔루션입니다. 🇰🇷