finsignal-feed-explore 1.7.0 → 1.9.1
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/README.md +75 -78
- package/dist/NewsFeed.d.ts +8 -54
- package/dist/NewsFeed.d.ts.map +1 -0
- package/dist/NewsFeed.js +118 -324
- package/dist/NewsFeed.js.map +1 -0
- package/dist/components/Chip.d.ts +9 -0
- package/dist/components/Chip.d.ts.map +1 -0
- package/dist/components/Chip.js +10 -0
- package/dist/components/Chip.js.map +1 -0
- package/dist/components/icons.d.ts +23 -0
- package/dist/components/icons.d.ts.map +1 -0
- package/dist/components/icons.js +22 -0
- package/dist/components/icons.js.map +1 -0
- package/dist/constants/market-events.d.ts +6 -0
- package/dist/constants/market-events.d.ts.map +1 -0
- package/dist/constants/market-events.js +28 -0
- package/dist/constants/market-events.js.map +1 -0
- package/dist/constants/mock-news.d.ts +3 -0
- package/dist/constants/mock-news.d.ts.map +1 -0
- package/dist/constants/mock-news.js +85 -0
- package/dist/constants/mock-news.js.map +1 -0
- package/dist/filters/FiltersOverlay.d.ts +13 -0
- package/dist/filters/FiltersOverlay.d.ts.map +1 -0
- package/dist/filters/FiltersOverlay.js +51 -0
- package/dist/filters/FiltersOverlay.js.map +1 -0
- package/dist/hooks/useFeedData.d.ts +18 -0
- package/dist/hooks/useFeedData.d.ts.map +1 -0
- package/dist/hooks/useFeedData.js +85 -0
- package/dist/hooks/useFeedData.js.map +1 -0
- package/dist/hooks/useFilters.d.ts +11 -0
- package/dist/hooks/useFilters.d.ts.map +1 -0
- package/dist/hooks/useFilters.js +35 -0
- package/dist/hooks/useFilters.js.map +1 -0
- package/dist/index.d.ts +16 -2
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -0
- package/dist/newsfeed.css +80 -168
- package/dist/snippets/NewsSnippet.d.ts +13 -22
- package/dist/snippets/NewsSnippet.d.ts.map +1 -0
- package/dist/snippets/NewsSnippet.js +52 -72
- package/dist/snippets/NewsSnippet.js.map +1 -0
- package/dist/snippets/components/NewsActionBar.d.ts +2 -5
- package/dist/snippets/components/NewsActionBar.js +22 -9
- package/dist/types/index.d.ts +72 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/formatTimestamp.d.ts +5 -0
- package/dist/utils/formatTimestamp.d.ts.map +1 -0
- package/dist/utils/formatTimestamp.js +29 -0
- package/dist/utils/formatTimestamp.js.map +1 -0
- package/dist/utils/theme.d.ts +13 -0
- package/dist/utils/theme.d.ts.map +1 -0
- package/dist/utils/theme.js +12 -0
- package/dist/utils/theme.js.map +1 -0
- package/package.json +3 -3
- package/LICENSE +0 -22
- package/dist/SegmentControl.d.ts +0 -13
- package/dist/SegmentControl.js +0 -5
- package/dist/styles.css +0 -33
package/README.md
CHANGED
|
@@ -1,107 +1,104 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @limex/integration-feed
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
News feed widget library for Limex Co-pilot integration
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Installation
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npm install
|
|
8
|
+
npm install @limex/integration-feed
|
|
9
|
+
# or
|
|
10
|
+
yarn add @limex/integration-feed
|
|
9
11
|
```
|
|
10
12
|
|
|
11
|
-
##
|
|
12
|
-
|
|
13
|
-
### SegmentControl
|
|
14
|
-
|
|
15
|
-
Переключатель вкладок с плавной анимацией.
|
|
13
|
+
## Usage
|
|
16
14
|
|
|
17
15
|
```tsx
|
|
18
|
-
import {
|
|
16
|
+
import { NewsFeed } from '@limex/integration-feed';
|
|
19
17
|
|
|
20
18
|
function App() {
|
|
21
|
-
const [selectedValue, setSelectedValue] = React.useState('option1');
|
|
22
|
-
|
|
23
19
|
return (
|
|
24
|
-
<
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
20
|
+
<NewsFeed
|
|
21
|
+
apiUrl="https://api.example.com"
|
|
22
|
+
onNewsClick={(news) => console.log('Clicked:', news)}
|
|
23
|
+
onFiltersApply={(filters) => console.log('Filters:', filters)}
|
|
24
|
+
// Optional: Hide specific icons
|
|
25
|
+
showShareIcon={true}
|
|
26
|
+
showBookmarkIcon={true}
|
|
27
|
+
showLikeIcon={true}
|
|
28
|
+
showDislikeIcon={false}
|
|
29
|
+
showAIIcon={true}
|
|
32
30
|
/>
|
|
33
31
|
);
|
|
34
32
|
}
|
|
35
33
|
```
|
|
36
34
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
Компонент новостной ленты с красивыми снипеттами.
|
|
40
|
-
|
|
41
|
-
```tsx
|
|
42
|
-
import { NewsFeed } from 'finsignal-feed-explore';
|
|
35
|
+
## Features
|
|
43
36
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
```tsx
|
|
56
|
-
const customNews = [
|
|
57
|
-
{
|
|
58
|
-
id: '1',
|
|
59
|
-
title: 'Заголовок новости',
|
|
60
|
-
snippet: 'Краткое описание новости...',
|
|
61
|
-
source: 'Источник',
|
|
62
|
-
time: '5 мин назад',
|
|
63
|
-
category: 'Категория'
|
|
64
|
-
}
|
|
65
|
-
];
|
|
66
|
-
|
|
67
|
-
<NewsFeed
|
|
68
|
-
items={customNews}
|
|
69
|
-
onItemClick={(item) => console.log(item)}
|
|
70
|
-
/>
|
|
71
|
-
```
|
|
37
|
+
- ✅ Beautiful news snippets based on Limex mobile app design
|
|
38
|
+
- ✅ Filter news by market events
|
|
39
|
+
- ✅ Configurable action buttons
|
|
40
|
+
- ✅ Callbacks for all user interactions
|
|
41
|
+
- ✅ API integration with `/api/v1/content/search`
|
|
42
|
+
- ✅ **Mock data fallback** - Shows 3 example news items when API is unavailable
|
|
43
|
+
- ✅ Infinite scroll support
|
|
44
|
+
- ✅ Light theme (web only)
|
|
45
|
+
- ✅ Responsive design
|
|
46
|
+
- ✅ TypeScript support
|
|
72
47
|
|
|
73
48
|
## API
|
|
74
49
|
|
|
75
|
-
###
|
|
76
|
-
|
|
77
|
-
| Prop |
|
|
78
|
-
|
|
79
|
-
| `
|
|
80
|
-
| `
|
|
81
|
-
| `
|
|
82
|
-
| `
|
|
83
|
-
|
|
84
|
-
|
|
50
|
+
### NewsFeed Props
|
|
51
|
+
|
|
52
|
+
| Prop | Type | Required | Description |
|
|
53
|
+
|------|------|----------|-------------|
|
|
54
|
+
| `apiUrl` | `string` | Yes | Base API URL |
|
|
55
|
+
| `onNewsClick` | `(news: NewsItem) => void` | No | Called when news is clicked |
|
|
56
|
+
| `onShareClick` | `(news: NewsItem) => void` | No | Called when share is clicked |
|
|
57
|
+
| `onBookmarkClick` | `(news: NewsItem) => void` | No | Called when bookmark is clicked |
|
|
58
|
+
| `onLikeClick` | `(news: NewsItem) => void` | No | Called when like is clicked |
|
|
59
|
+
| `onDislikeClick` | `(news: NewsItem) => void` | No | Called when dislike is clicked |
|
|
60
|
+
| `onAIClick` | `(news: NewsItem) => void` | No | Called when AI button is clicked |
|
|
61
|
+
| `onFiltersOpen` | `() => void` | No | Called when filters overlay opens |
|
|
62
|
+
| `onFiltersClose` | `() => void` | No | Called when filters overlay closes |
|
|
63
|
+
| `onFiltersApply` | `(filters: string[]) => void` | No | Called when filters are applied |
|
|
64
|
+
| `showShareIcon` | `boolean` | No | Show/hide share button (default: true) |
|
|
65
|
+
| `showBookmarkIcon` | `boolean` | No | Show/hide bookmark button (default: true) |
|
|
66
|
+
| `showLikeIcon` | `boolean` | No | Show/hide like button (default: true) |
|
|
67
|
+
| `showDislikeIcon` | `boolean` | No | Show/hide dislike button (default: true) |
|
|
68
|
+
| `showAIIcon` | `boolean` | No | Show/hide AI button (default: true) |
|
|
69
|
+
| `showFilterIcon` | `boolean` | No | Show/hide filter button (default: true) |
|
|
70
|
+
| `initialFilters` | `string[]` | No | Initial market events filters |
|
|
71
|
+
| `enableInfiniteScroll` | `boolean` | No | Enable/disable infinite scroll (default: true) |
|
|
72
|
+
| `marketEventsTaxonomy` | `MarketEventTaxonomyItem[]` | No | Custom market events taxonomy |
|
|
73
|
+
|
|
74
|
+
## Mock Data
|
|
75
|
+
|
|
76
|
+
The widget automatically displays 3 example news items when:
|
|
77
|
+
- API is unavailable or returns an error
|
|
78
|
+
- No real news data is loaded yet
|
|
79
|
+
|
|
80
|
+
This ensures users always see content, even during development or API downtime.
|
|
85
81
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
| `value` | `string` | Уникальное значение опции |
|
|
89
|
-
| `label` | `string` | Отображаемый текст |
|
|
82
|
+
```tsx
|
|
83
|
+
import { MOCK_NEWS } from '@limex/integration-feed';
|
|
90
84
|
|
|
91
|
-
|
|
85
|
+
// You can also use mock data directly in your own components
|
|
86
|
+
console.log(MOCK_NEWS); // Array of 3 example news items
|
|
87
|
+
```
|
|
92
88
|
|
|
93
|
-
|
|
94
|
-
- `.segment-control` - контейнер
|
|
95
|
-
- `.segment-option` - кнопка опции
|
|
96
|
-
- `.segment-option.active` - активная опция
|
|
89
|
+
## Development
|
|
97
90
|
|
|
98
|
-
|
|
91
|
+
```bash
|
|
92
|
+
# Install dependencies
|
|
93
|
+
yarn install
|
|
99
94
|
|
|
100
|
-
|
|
95
|
+
# Build
|
|
96
|
+
yarn build
|
|
101
97
|
|
|
102
|
-
|
|
98
|
+
# Watch mode
|
|
99
|
+
yarn dev
|
|
100
|
+
```
|
|
103
101
|
|
|
104
|
-
##
|
|
102
|
+
## License
|
|
105
103
|
|
|
106
104
|
MIT
|
|
107
|
-
|
package/dist/NewsFeed.d.ts
CHANGED
|
@@ -1,55 +1,9 @@
|
|
|
1
|
-
import '
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
type: 'post' | 'signal' | 'news' | 'strategies' | 'trigger' | 'market_vibe' | 'guides';
|
|
8
|
-
source: 'user' | 'provider' | 'api';
|
|
9
|
-
created_at: string;
|
|
10
|
-
score: number;
|
|
11
|
-
thumbnail_url?: string | null;
|
|
12
|
-
metadata: {
|
|
13
|
-
ai_processed?: boolean;
|
|
14
|
-
processing_status?: string;
|
|
15
|
-
ai_processing?: {
|
|
16
|
-
status: string;
|
|
17
|
-
message: string;
|
|
18
|
-
};
|
|
19
|
-
news?: {
|
|
20
|
-
recommendation?: {
|
|
21
|
-
text: string;
|
|
22
|
-
priceRange: string;
|
|
23
|
-
};
|
|
24
|
-
stocks?: Array<{
|
|
25
|
-
symbol: string;
|
|
26
|
-
price: string;
|
|
27
|
-
change: string;
|
|
28
|
-
changeType: 'positive' | 'negative';
|
|
29
|
-
}>;
|
|
30
|
-
};
|
|
31
|
-
signal?: {
|
|
32
|
-
symbol: string;
|
|
33
|
-
companyName: string;
|
|
34
|
-
metrics: {
|
|
35
|
-
buy: string;
|
|
36
|
-
entry: string;
|
|
37
|
-
takeProfit: string;
|
|
38
|
-
stopLoss: string;
|
|
39
|
-
};
|
|
40
|
-
};
|
|
41
|
-
ai_categorization?: {
|
|
42
|
-
primaryCategory: string;
|
|
43
|
-
tags: string[];
|
|
44
|
-
};
|
|
45
|
-
};
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { WidgetConfig } from './types';
|
|
3
|
+
import './NewsFeed.css';
|
|
4
|
+
export interface NewsFeedProps extends WidgetConfig {
|
|
5
|
+
initialFilters?: string[];
|
|
6
|
+
enableInfiniteScroll?: boolean;
|
|
46
7
|
}
|
|
47
|
-
export
|
|
48
|
-
|
|
49
|
-
items?: FeedItem[];
|
|
50
|
-
onItemClick?: (item: FeedItem) => void;
|
|
51
|
-
className?: string;
|
|
52
|
-
feedApiUrl?: string;
|
|
53
|
-
useMockData?: boolean;
|
|
54
|
-
}
|
|
55
|
-
export declare function FeedList({ feedType, items: itemsProp, onItemClick, className, feedApiUrl, useMockData }: FeedListProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export declare const NewsFeed: React.FC<NewsFeedProps>;
|
|
9
|
+
//# sourceMappingURL=NewsFeed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NewsFeed.d.ts","sourceRoot":"","sources":["../src/NewsFeed.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAMxE,OAAO,EAAE,YAAY,EAAY,MAAM,SAAS,CAAC;AAGjD,OAAO,gBAAgB,CAAC;AAExB,MAAM,WAAW,aAAc,SAAQ,YAAY;IACjD,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CA4O5C,CAAC"}
|