Skip to content

Commit d54f0cf

Browse files
committed
feat: append widget for show charts with currency (#39)
1 parent 410ea95 commit d54f0cf

File tree

12 files changed

+1844
-4
lines changed

12 files changed

+1844
-4
lines changed

mobile/package-lock.json

Lines changed: 21 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mobile/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"@trpc/client": "^10.45.2",
3737
"@trpc/server": "^10.45.2",
3838
"@zxing/browser": "^0.1.5",
39+
"chart.js": "^4.5.1",
3940
"html5-qrcode": "^2.3.8",
4041
"ionicons": "^7.0.0",
4142
"jsqr": "^1.4.0",

web/WIDGETS_DOCUMENTATION.md

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,164 @@ interface CalendarWidgetOptions {
178178
}
179179
```
180180

181+
### Currency Charts Widget
181182

183+
The Currency Charts Widget displays interactive financial charts for cryptocurrency and forex pairs using **real-time data from Yahoo Finance API** with Chart.js professional visualization.
184+
185+
#### Widget Features:
186+
187+
1. **Dual View System**:
188+
- **Dashboard Panel**: Shows configurable number of charts (default: 3)
189+
- **Modal View**: Displays all configured currency pairs in detail
190+
- Click maximize button to view all charts
191+
192+
2. **Multiple Currency Support**:
193+
- **Cryptocurrency**: BTC/USD, ETH/USD, BNB/USD, ADA/USD, SOL/USD, XRP/USD, DOT/USD, DOGE/USD, AVAX/USD, MATIC/USD
194+
- **Forex**: EUR/USD, GBP/USD, USD/JPY, USD/CAD, AUD/USD, USD/CHF, NZD/USD, USD/SGD
195+
- Custom display names for each pair
196+
197+
3. **Chart Features**:
198+
- Professional Chart.js implementation
199+
- Point styling with circular markers and white borders
200+
- Green/red color coding based on price movement
201+
- Interactive tooltips showing exact prices
202+
- Smooth curved lines (tension: 0.4)
203+
- Responsive design for all screen sizes
204+
205+
4. **Real-time Data Features**:
206+
- **Yahoo Finance API Integration**: Fetches live market data
207+
- **Automatic Symbol Conversion**: Converts BTC/USD → BTC-USD, EUR/USD → EURUSD=X
208+
- **30-second Updates**: Automatic periodic data refresh
209+
- **Smart Fallback**: Uses mock data when API is unavailable
210+
- **Error Handling**: Graceful degradation on API failures
211+
212+
5. **Configuration Options**:
213+
- Chart time periods: 1h, 4h, 1d, 1w, 1m
214+
- Dashboard charts limit (1-6 charts)
215+
- Volume bars toggle
216+
- Custom widget name
217+
- Individual pair display names
218+
219+
#### Technical Implementation:
220+
221+
##### Implementation Files:
222+
- `web/src/server/widgets/currency-widget.ts` - Main widget class with Zod schemas and Chart.js integration
223+
- `web/src/server/widgets/currency-widget.utils.ts` - Client-side utilities and window functions
224+
- `web/src/server/services/yahoo-finance-api.ts` - Yahoo Finance API service for real-time data
225+
226+
##### Data Structure:
227+
```typescript
228+
interface CurrencyPair {
229+
symbol: string;
230+
name: string;
231+
displayName?: string;
232+
}
233+
234+
interface CurrencyWidgetOptions {
235+
type: 'currency';
236+
name: string;
237+
currencyPairs: CurrencyPair[];
238+
chartPeriod: '1h' | '4h' | '1d' | '1w' | '1m';
239+
maxDashboardCharts: number;
240+
}
241+
```
242+
243+
##### Main Functions:
244+
- `showCurrencyModal(modalId)` - Display detailed charts modal
245+
- `hideCurrencyModal(modalId)` - Hide charts modal
246+
- `updateCurrencyCharts(widgetId)` - Refresh chart data
247+
248+
#### System Integration:
249+
250+
The widget integrates with the general widget system and uses:
251+
- Chart.js v4.5.1 for professional chart rendering
252+
- Zod schemas for data validation
253+
- Formly for widget configuration form
254+
- Lucide Icons for UI elements
255+
- Tailwind CSS for styling
256+
- **Yahoo Finance API** for real-time market data
257+
- **Rate limiting**: 50 requests per minute per user/session
258+
- **Rate limiting implementation**: Uses sliding window algorithm with in-memory store
259+
- **Identification priority**: Session ID → x-session-id header → IP address → 'unknown'
260+
- **Error handling**: Returns TOO_MANY_REQUESTS TRPC error with retry information
261+
- **Automatic cleanup**: Expired rate limit entries cleaned up every minute
262+
- Periodic data updates (every 30 seconds)
263+
- Smart fallback to mock data on API failures
264+
- Point styling according to Chart.js official samples
265+
266+
#### Widget Configuration Example:
267+
268+
```json
269+
{
270+
"type": "currency",
271+
"name": "Market Overview",
272+
"chartPeriod": "1d",
273+
"maxDashboardCharts": 3,
274+
"currencyPairs": [
275+
{
276+
"symbol": "BTC/USD",
277+
"name": "Bitcoin to US Dollar",
278+
"displayName": "Bitcoin Price"
279+
},
280+
{
281+
"symbol": "ETH/USD",
282+
"name": "Ethereum to US Dollar",
283+
"displayName": "Ethereum Price"
284+
}
285+
]
286+
}
287+
```
288+
289+
290+
291+
## Finance API
292+
293+
The Finance API provides real-time financial data through TRPC endpoints with built-in rate limiting protection.
294+
295+
### API Endpoints
296+
297+
#### `finance.getCurrencyData`
298+
- **Purpose**: Fetch currency data for multiple symbols
299+
- **Input**: Array of symbols, period, optional interval
300+
- **Output**: Array of currency data with chart information
301+
- **Rate Limited**: Yes (50 requests/minute)
302+
303+
#### `finance.getSingleCurrencyData`
304+
- **Purpose**: Fetch data for a single currency pair
305+
- **Input**: Symbol, period, optional interval
306+
- **Output**: Detailed currency data for one pair
307+
- **Rate Limited**: Yes (50 requests/minute)
308+
309+
### Rate Limiting Details
310+
311+
- **Algorithm**: Sliding window with 1-minute intervals
312+
- **Limit**: 50 requests per minute per user/session
313+
- **Identification**: Session ID → x-session-id header → IP address
314+
- **Error Response**: `TOO_MANY_REQUESTS` with retry time information
315+
- **Storage**: In-memory Map with automatic cleanup
316+
317+
### Implementation Files
318+
319+
- `web/src/server/trpc/routers/finance.ts` - Main finance router with rate limiting
320+
- `web/src/server/services/yahoo-finance-api.ts` - Yahoo Finance data fetching service
321+
- `web/src/server/middleware/rate-limit.ts` - Generic rate limiting utilities
322+
323+
### Error Handling
324+
325+
When rate limits are exceeded, clients receive:
326+
```json
327+
{
328+
"code": "TOO_MANY_REQUESTS",
329+
"message": "Rate limit exceeded. Maximum 50 requests per minute allowed. Try again in X seconds."
330+
}
331+
```
332+
333+
### Best Practices
334+
335+
1. Cache responses when possible to reduce API calls
336+
2. Implement exponential backoff for retry logic
337+
3. Monitor rate limit headers in responses
338+
4. Handle rate limit errors gracefully in client applications
182339

183340
## Widgets Development Roadmap
184341

web/WIDGETS_DOCUMENTATION_RU.md

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,118 @@ interface CalendarWidgetOptions {
184184
}
185185
```
186186

187+
### Виджет графиков курсов валют (Currency Charts Widget)
187188

189+
Виджет графиков курсов валют отображает интерактивные финансовые графики для криптовалютных и форекс пар с использованием **реальных данных из API Yahoo Finance**.
190+
191+
#### Особенности виджета:
192+
193+
1. **Двойная система отображения**:
194+
- **Панель дашборда**: Показывает настраиваемое количество графиков (по умолчанию: 3)
195+
- **Модальный просмотр**: Отображает все настроенные валютные пары детально
196+
- Кнопка максимизации для просмотра всех графиков
197+
198+
2. **Поддержка множества валют**:
199+
- **Криптовалюты**: BTC/USD, ETH/USD, BNB/USD, ADA/USD, SOL/USD, XRP/USD, DOT/USD, DOGE/USD, AVAX/USD, MATIC/USD
200+
- **Форекс**: EUR/USD, GBP/USD, USD/JPY, USD/CAD, AUD/USD, USD/CHF, NZD/USD, USD/SGD
201+
- Пользовательские названия для каждой пары
202+
203+
3. **Функции графиков**:
204+
- Профессиональная реализация Chart.js
205+
- Стилизация точек с круглыми маркерами и белыми границами
206+
- Цветовое кодирование зеленый/красный в зависимости от движения цены
207+
- Интерактивные подсказки с точными ценами
208+
- Плавные изогнутые линии
209+
- Адаптивный дизайн для всех размеров экранов
210+
211+
4. **Реальные данные в реальном времени**:
212+
- **Интеграция с API Yahoo Finance**: Получение актуальных рыночных данных
213+
- **Автоматическое преобразование символов**: Конвертация BTC/USD → BTC-USD, EUR/USD → EURUSD=X
214+
- **Обновление каждые 30 секунд**: Автоматическое периодическое обновление данных
215+
- **Умный запасной вариант**: Использование имитационных данных при недоступности API
216+
- **Обработка ошибок**: Гладкое восстановление при сбоях API
217+
218+
5. **Параметры настройки**:
219+
- Периоды графиков: 1ч, 4ч, 1д, 1н, 1м
220+
- Лимит графиков на дашборде (1-6 графиков)
221+
- Переключатель объемных баров
222+
- Пользовательское имя виджета
223+
- Индивидуальные названия пар
224+
225+
#### Техническая реализация:
226+
227+
##### Файлы реализации:
228+
- `web/src/server/widgets/currency-widget.ts` - Основной класс виджета с Zod схемами и интеграцией Chart.js
229+
- `web/src/server/widgets/currency-widget.utils.ts` - Вспомогательные утилиты на стороне клиента и функции окна
230+
- `web/src/server/services/yahoo-finance-api.ts` - Сервис API Yahoo Finance для получения данных в реальном времени
231+
232+
#### Интеграция с системой:
233+
234+
Виджет интегрирован с общей системой виджетов и использует:
235+
- Chart.js v4.5.1 для профессионального рендеринга графиков
236+
- Zod схемы для валидации данных
237+
- Formly для формы настройки виджета
238+
- Lucide Icons для элементов интерфейса
239+
- Tailwind CSS для стилизации
240+
- **API Yahoo Finance** для получения рыночных данных в реальном времени
241+
- **Ограничение частоты запросов**: 50 запросов в минуту на пользователя/сессию
242+
- **Реализация ограничения частоты**: Использует алгоритм скользящего окна с хранением в памяти
243+
- **Приоритет идентификации**: ID сессии → заголовок x-session-id → IP адрес → 'unknown'
244+
- **Обработка ошибок**: Возвращает ошибку TOO_MANY_REQUESTS TRPC с информацией о повторной попытке
245+
- **Автоматическая очистка**: Истекшие записи ограничения частоты очищаются каждую минуту
246+
- Периодические обновления данных (каждые 30 секунд)
247+
- Умный запасной вариант на имитационные данные при сбоях API
248+
- Стилизация точек согласно официальным примерам Chart.js
249+
250+
251+
## API Финансовых Данных
252+
253+
API финансовых данных предоставляет информацию о курсах валют в реальном времени через TRPC эндпоинты со встроенной защитой от превышения частоты запросов.
254+
255+
### Эндпоинты API
256+
257+
#### `finance.getCurrencyData`
258+
- **Назначение**: Получение данных по нескольким валютным парам
259+
- **Входные данные**: Массив символов, период, опциональный интервал
260+
- **Выходные данные**: Массив данных о валютах с информацией для графиков
261+
- **Ограничение частоты**: Да (50 запросов/минуту)
262+
263+
#### `finance.getSingleCurrencyData`
264+
- **Назначение**: Получение данных по одной валютной паре
265+
- **Входные данные**: Символ, период, опциональный интервал
266+
- **Выходные данные**: Подробные данные по одной паре
267+
- **Ограничение частоты**: Да (50 запросов/минуту)
268+
269+
### Детали Ограничения Частоты Запросов
270+
271+
- **Алгоритм**: Скользящее окно с интервалами по 1 минуте
272+
- **Лимит**: 50 запросов в минуту на пользователя/сессию
273+
- **Идентификация**: ID сессии → заголовок x-session-id → IP адрес
274+
- **Ответ при ошибке**: `TOO_MANY_REQUESTS` с информацией о времени повторной попытки
275+
- **Хранение**: Map в памяти с автоматической очисткой
276+
277+
### Файлы Реализации
278+
279+
- `web/src/server/trpc/routers/finance.ts` - Основной маршрутизатор финансов с ограничением частоты
280+
- `web/src/server/services/yahoo-finance-api.ts` - Сервис получения данных от Yahoo Finance
281+
- `web/src/server/middleware/rate-limit.ts` - Универсальные утилиты ограничения частоты
282+
283+
### Обработка Ошибок
284+
285+
При превышении лимита частоты запросов клиенты получают:
286+
```json
287+
{
288+
"code": "TOO_MANY_REQUESTS",
289+
"message": "Превышен лимит запросов. Максимум 50 запросов в минуту разрешено. Попробуйте снова через X секунд."
290+
}
291+
```
292+
293+
### Рекомендации
294+
295+
1. Кэшируйте ответы когда это возможно для уменьшения количества вызовов API
296+
2. Реализуйте экспоненциальную задержку для логики повторных попыток
297+
3. Отслеживайте заголовки ограничения частоты в ответах
298+
4. Корректно обрабатывайте ошибки ограничения частоты в клиентских приложениях
188299

189300
## План развития виджетов
190301

0 commit comments

Comments
 (0)