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.
Files changed (61) hide show
  1. package/README.md +75 -78
  2. package/dist/NewsFeed.d.ts +8 -54
  3. package/dist/NewsFeed.d.ts.map +1 -0
  4. package/dist/NewsFeed.js +118 -324
  5. package/dist/NewsFeed.js.map +1 -0
  6. package/dist/components/Chip.d.ts +9 -0
  7. package/dist/components/Chip.d.ts.map +1 -0
  8. package/dist/components/Chip.js +10 -0
  9. package/dist/components/Chip.js.map +1 -0
  10. package/dist/components/icons.d.ts +23 -0
  11. package/dist/components/icons.d.ts.map +1 -0
  12. package/dist/components/icons.js +22 -0
  13. package/dist/components/icons.js.map +1 -0
  14. package/dist/constants/market-events.d.ts +6 -0
  15. package/dist/constants/market-events.d.ts.map +1 -0
  16. package/dist/constants/market-events.js +28 -0
  17. package/dist/constants/market-events.js.map +1 -0
  18. package/dist/constants/mock-news.d.ts +3 -0
  19. package/dist/constants/mock-news.d.ts.map +1 -0
  20. package/dist/constants/mock-news.js +85 -0
  21. package/dist/constants/mock-news.js.map +1 -0
  22. package/dist/filters/FiltersOverlay.d.ts +13 -0
  23. package/dist/filters/FiltersOverlay.d.ts.map +1 -0
  24. package/dist/filters/FiltersOverlay.js +51 -0
  25. package/dist/filters/FiltersOverlay.js.map +1 -0
  26. package/dist/hooks/useFeedData.d.ts +18 -0
  27. package/dist/hooks/useFeedData.d.ts.map +1 -0
  28. package/dist/hooks/useFeedData.js +85 -0
  29. package/dist/hooks/useFeedData.js.map +1 -0
  30. package/dist/hooks/useFilters.d.ts +11 -0
  31. package/dist/hooks/useFilters.d.ts.map +1 -0
  32. package/dist/hooks/useFilters.js +35 -0
  33. package/dist/hooks/useFilters.js.map +1 -0
  34. package/dist/index.d.ts +16 -2
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +11 -1
  37. package/dist/index.js.map +1 -0
  38. package/dist/newsfeed.css +80 -168
  39. package/dist/snippets/NewsSnippet.d.ts +13 -22
  40. package/dist/snippets/NewsSnippet.d.ts.map +1 -0
  41. package/dist/snippets/NewsSnippet.js +52 -72
  42. package/dist/snippets/NewsSnippet.js.map +1 -0
  43. package/dist/snippets/components/NewsActionBar.d.ts +2 -5
  44. package/dist/snippets/components/NewsActionBar.js +22 -9
  45. package/dist/types/index.d.ts +72 -0
  46. package/dist/types/index.d.ts.map +1 -0
  47. package/dist/types/index.js +2 -0
  48. package/dist/types/index.js.map +1 -0
  49. package/dist/utils/formatTimestamp.d.ts +5 -0
  50. package/dist/utils/formatTimestamp.d.ts.map +1 -0
  51. package/dist/utils/formatTimestamp.js +29 -0
  52. package/dist/utils/formatTimestamp.js.map +1 -0
  53. package/dist/utils/theme.d.ts +13 -0
  54. package/dist/utils/theme.d.ts.map +1 -0
  55. package/dist/utils/theme.js +12 -0
  56. package/dist/utils/theme.js.map +1 -0
  57. package/package.json +3 -3
  58. package/LICENSE +0 -22
  59. package/dist/SegmentControl.d.ts +0 -13
  60. package/dist/SegmentControl.js +0 -5
  61. package/dist/styles.css +0 -33
package/README.md CHANGED
@@ -1,107 +1,104 @@
1
- # FinSignal Feed Explore
1
+ # @limex/integration-feed
2
2
 
3
- Компоненты для отображения новостной ленты и навигации для React веб-приложений.
3
+ News feed widget library for Limex Co-pilot integration
4
4
 
5
- ## Установка
5
+ ## Installation
6
6
 
7
7
  ```bash
8
- npm install finsignal-feed-explore
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 { SegmentControl } from 'finsignal-feed-explore';
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
- <SegmentControl
25
- options={[
26
- { value: 'option1', label: 'Опция 1' },
27
- { value: 'option2', label: 'Опция 2' },
28
- { value: 'option3', label: 'Опция 3' },
29
- ]}
30
- value={selectedValue}
31
- onValueChange={setSelectedValue}
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
- ### NewsFeed
38
-
39
- Компонент новостной ленты с красивыми снипеттами.
40
-
41
- ```tsx
42
- import { NewsFeed } from 'finsignal-feed-explore';
35
+ ## Features
43
36
 
44
- function App() {
45
- return (
46
- <NewsFeed
47
- onItemClick={(item) => console.log('Clicked:', item)}
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
- ### SegmentControlProps
76
-
77
- | Prop | Тип | Обязательно | Описание |
78
- |------|-----|-------------|----------|
79
- | `options` | `SegmentOption[]` | Да | Массив опций для отображения |
80
- | `value` | `string` | Да | Текущее выбранное значение |
81
- | `onValueChange` | `(value: string) => void` | Да | Callback при изменении значения |
82
- | `className` | `string` | Нет | Дополнительные CSS классы |
83
-
84
- ### SegmentOption
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
- Компонент использует CSS классы:
94
- - `.segment-control` - контейнер
95
- - `.segment-option` - кнопка опции
96
- - `.segment-option.active` - активная опция
89
+ ## Development
97
90
 
98
- Можно переопределить стили или добавить свой className.
91
+ ```bash
92
+ # Install dependencies
93
+ yarn install
99
94
 
100
- ## Требования
95
+ # Build
96
+ yarn build
101
97
 
102
- - React >= 18.0.0
98
+ # Watch mode
99
+ yarn dev
100
+ ```
103
101
 
104
- ## Лицензия
102
+ ## License
105
103
 
106
104
  MIT
107
-
@@ -1,55 +1,9 @@
1
- import './newsfeed.css';
2
- export interface FeedItem {
3
- content_id: string;
4
- author_id?: string | null;
5
- title?: string | null;
6
- body?: string | null;
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 interface FeedListProps {
48
- feedType?: 'trending' | 'personal' | 'hot';
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"}