@hef2024/llmasaservice-ui 0.20.3 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AICHATPANEL-PORT-INVENTORY.md +2 -0
- package/CONTROLLED-COLLAPSE-IMPLEMENTATION.md +274 -0
- package/DEBUG-ERROR-HANDLING.md +2 -0
- package/FIX-APPLIED.md +2 -0
- package/IMPLEMENTATION-COMPLETE.md +2 -0
- package/dist/index.d.mts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +78 -37
- package/dist/index.mjs +78 -37
- package/docs/CHANGELOG-ERROR-HANDLING.md +2 -0
- package/docs/CONTROLLED-COLLAPSE-QUICK-START.md +147 -0
- package/docs/CONTROLLED-COLLAPSE-STATE.md +651 -0
- package/docs/CONVERSATION-HISTORY.md +2 -0
- package/docs/ERROR-HANDLING-413.md +2 -0
- package/docs/ERROR-HANDLING-SUMMARY.md +2 -0
- package/package.json +1 -1
- package/src/AIAgentPanel.tsx +119 -53
- package/src/components/ui/Button.tsx +2 -0
- package/src/components/ui/Dialog.tsx +2 -0
- package/src/components/ui/Input.tsx +2 -0
- package/src/components/ui/Select.tsx +2 -0
- package/src/components/ui/ToolInfoModal.tsx +2 -0
- package/src/components/ui/Tooltip.tsx +2 -0
- package/src/components/ui/index.ts +2 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Controlled Collapse State - Quick Start Guide
|
|
2
|
+
|
|
3
|
+
## TL;DR
|
|
4
|
+
|
|
5
|
+
The `AIAgentPanel` now supports controlled collapse state, allowing you to persist the panel's collapsed/expanded state across page navigations.
|
|
6
|
+
|
|
7
|
+
## Quick Examples
|
|
8
|
+
|
|
9
|
+
### Before (Uncontrolled - state resets on navigation)
|
|
10
|
+
```tsx
|
|
11
|
+
<AIAgentPanel
|
|
12
|
+
defaultCollapsed={false}
|
|
13
|
+
agents={agents}
|
|
14
|
+
customerId={customerId}
|
|
15
|
+
apiKey={apiKey}
|
|
16
|
+
/>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### After (Controlled - state persists)
|
|
20
|
+
```tsx
|
|
21
|
+
const [collapsed, setCollapsed] = useState(() =>
|
|
22
|
+
localStorage.getItem('aiPanelCollapsed') === 'true'
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
const handleCollapsedChange = (isCollapsed: boolean) => {
|
|
26
|
+
setCollapsed(isCollapsed);
|
|
27
|
+
localStorage.setItem('aiPanelCollapsed', String(isCollapsed));
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
<AIAgentPanel
|
|
31
|
+
isCollapsed={collapsed}
|
|
32
|
+
onCollapsedChange={handleCollapsedChange}
|
|
33
|
+
agents={agents}
|
|
34
|
+
customerId={customerId}
|
|
35
|
+
apiKey={apiKey}
|
|
36
|
+
/>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## New Props
|
|
40
|
+
|
|
41
|
+
| Prop | Type | Description |
|
|
42
|
+
|------|------|-------------|
|
|
43
|
+
| `isCollapsed` | `boolean?` | Controlled collapse state |
|
|
44
|
+
| `onCollapsedChange` | `(isCollapsed: boolean) => void?` | Callback when state changes |
|
|
45
|
+
|
|
46
|
+
## Common Use Cases
|
|
47
|
+
|
|
48
|
+
### 1. Persist Across Page Navigation (localStorage)
|
|
49
|
+
```tsx
|
|
50
|
+
const [collapsed, setCollapsed] = useState(() =>
|
|
51
|
+
localStorage.getItem('aiPanelCollapsed') === 'true'
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
<AIAgentPanel
|
|
55
|
+
isCollapsed={collapsed}
|
|
56
|
+
onCollapsedChange={(isCollapsed) => {
|
|
57
|
+
setCollapsed(isCollapsed);
|
|
58
|
+
localStorage.setItem('aiPanelCollapsed', String(isCollapsed));
|
|
59
|
+
}}
|
|
60
|
+
/>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### 2. Sync Across Devices (Database)
|
|
64
|
+
```tsx
|
|
65
|
+
const { data } = useUserPreferences();
|
|
66
|
+
const { mutate } = useUpdateUserPreferences();
|
|
67
|
+
|
|
68
|
+
<AIAgentPanel
|
|
69
|
+
isCollapsed={data?.aiPanelCollapsed ?? false}
|
|
70
|
+
onCollapsedChange={(isCollapsed) => {
|
|
71
|
+
mutate({ aiPanelCollapsed: isCollapsed });
|
|
72
|
+
}}
|
|
73
|
+
/>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 3. Track for Analytics (Uncontrolled + Callback)
|
|
77
|
+
```tsx
|
|
78
|
+
<AIAgentPanel
|
|
79
|
+
defaultCollapsed={false}
|
|
80
|
+
onCollapsedChange={(isCollapsed) => {
|
|
81
|
+
analytics.track('panel_collapsed', { isCollapsed });
|
|
82
|
+
}}
|
|
83
|
+
/>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 4. Programmatic Control
|
|
87
|
+
```tsx
|
|
88
|
+
const [collapsed, setCollapsed] = useState(false);
|
|
89
|
+
|
|
90
|
+
<div>
|
|
91
|
+
<button onClick={() => setCollapsed(true)}>Collapse Panel</button>
|
|
92
|
+
|
|
93
|
+
<AIAgentPanel
|
|
94
|
+
isCollapsed={collapsed}
|
|
95
|
+
onCollapsedChange={setCollapsed}
|
|
96
|
+
/>
|
|
97
|
+
</div>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Key Points
|
|
101
|
+
|
|
102
|
+
✅ **Backward Compatible** - Existing code works without changes
|
|
103
|
+
✅ **Opt-in** - Only use controlled mode when you need it
|
|
104
|
+
✅ **Standard React Pattern** - Works like `<input value={...} onChange={...} />`
|
|
105
|
+
✅ **Flexible** - Works with localStorage, database, Redux, etc.
|
|
106
|
+
|
|
107
|
+
## Common Mistakes
|
|
108
|
+
|
|
109
|
+
### ❌ Missing Callback
|
|
110
|
+
```tsx
|
|
111
|
+
// Panel won't respond to user clicks
|
|
112
|
+
<AIAgentPanel isCollapsed={collapsed} />
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### ✅ Correct
|
|
116
|
+
```tsx
|
|
117
|
+
<AIAgentPanel
|
|
118
|
+
isCollapsed={collapsed}
|
|
119
|
+
onCollapsedChange={setCollapsed}
|
|
120
|
+
/>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### ❌ Conflicting Props
|
|
124
|
+
```tsx
|
|
125
|
+
// defaultCollapsed is ignored in controlled mode
|
|
126
|
+
<AIAgentPanel
|
|
127
|
+
isCollapsed={collapsed}
|
|
128
|
+
onCollapsedChange={setCollapsed}
|
|
129
|
+
defaultCollapsed={false} // Remove this
|
|
130
|
+
/>
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### ✅ Correct
|
|
134
|
+
```tsx
|
|
135
|
+
<AIAgentPanel
|
|
136
|
+
isCollapsed={collapsed}
|
|
137
|
+
onCollapsedChange={setCollapsed}
|
|
138
|
+
/>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Full Documentation
|
|
142
|
+
|
|
143
|
+
For complete documentation, see:
|
|
144
|
+
- [Controlled Collapse State Guide](./CONTROLLED-COLLAPSE-STATE.md)
|
|
145
|
+
- [Examples](../examples/controlled-collapse-example.tsx)
|
|
146
|
+
- [Demo App](../examples/demo-app/src/App.tsx)
|
|
147
|
+
|