@gravity-ui/blog-constructor 3.4.0 → 4.0.0-alpha.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/CHANGELOG.md +0 -7
- package/build/cjs/blocks/Feed/Feed.js +37 -47
- package/build/cjs/blocks/Feed/reducer.d.ts +5 -0
- package/build/cjs/blocks/Feed/reducer.js +4 -1
- package/build/cjs/blocks/YFM/YFM.js +1 -1
- package/build/cjs/blocks/YFM/__tests__/YFM.test.d.ts +1 -0
- package/build/cjs/blocks/YFM/__tests__/YFM.test.js +16 -0
- package/build/cjs/components/FeedHeader/FeedHeader.js +2 -2
- package/build/cjs/components/FeedHeader/components/Controls/Controls.d.ts +3 -2
- package/build/cjs/components/FeedHeader/components/Controls/Controls.js +16 -24
- package/build/cjs/components/Paginator/Paginator.d.ts +1 -1
- package/build/cjs/components/Paginator/Paginator.js +2 -2
- package/build/cjs/components/Paginator/types.d.ts +1 -0
- package/build/cjs/components/Posts/Posts.css +0 -25
- package/build/cjs/components/Posts/Posts.d.ts +1 -0
- package/build/cjs/components/Posts/Posts.js +4 -5
- package/build/cjs/components/Search/Search.js +1 -1
- package/build/cjs/containers/BlogPostPage/BlogPostPage.css +0 -12
- package/build/cjs/counters/metrika.d.ts +62 -0
- package/build/cjs/counters/metrika.js +173 -0
- package/build/cjs/models/common.d.ts +1 -5
- package/build/cjs/utils/common.d.ts +1 -1
- package/build/cjs/utils/common.js +1 -1
- package/build/esm/blocks/Feed/Feed.js +37 -47
- package/build/esm/blocks/Feed/reducer.d.ts +5 -0
- package/build/esm/blocks/Feed/reducer.js +4 -1
- package/build/esm/blocks/YFM/YFM.js +1 -1
- package/build/esm/blocks/YFM/__tests__/YFM.test.d.ts +1 -0
- package/build/esm/blocks/YFM/__tests__/YFM.test.js +11 -0
- package/build/esm/components/FeedHeader/FeedHeader.js +2 -2
- package/build/esm/components/FeedHeader/components/Controls/Controls.d.ts +3 -2
- package/build/esm/components/FeedHeader/components/Controls/Controls.js +17 -25
- package/build/esm/components/Paginator/Paginator.d.ts +1 -1
- package/build/esm/components/Paginator/Paginator.js +2 -2
- package/build/esm/components/Paginator/types.d.ts +1 -0
- package/build/esm/components/Posts/Posts.css +0 -25
- package/build/esm/components/Posts/Posts.d.ts +1 -0
- package/build/esm/components/Posts/Posts.js +4 -5
- package/build/esm/components/Search/Search.js +1 -1
- package/build/esm/containers/BlogPostPage/BlogPostPage.css +0 -12
- package/build/esm/counters/metrika.d.ts +62 -0
- package/build/esm/counters/metrika.js +169 -0
- package/build/esm/models/common.d.ts +1 -5
- package/build/esm/utils/common.d.ts +1 -1
- package/build/esm/utils/common.js +1 -1
- package/package.json +5 -2
- package/server/data/sanitizeMeta.d.ts +0 -2
- package/server/data/sanitizeMeta.js +0 -2
- package/server/data/transformPageContent.js +16 -3
- package/server/models/common.d.ts +1 -5
package/CHANGELOG.md
CHANGED
@@ -1,12 +1,5 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
-
## [3.4.0](https://github.com/gravity-ui/blog-constructor/compare/v3.3.0...v3.4.0) (2023-05-24)
|
4
|
-
|
5
|
-
|
6
|
-
### Features
|
7
|
-
|
8
|
-
* new loading UI (shimmer) ([#50](https://github.com/gravity-ui/blog-constructor/issues/50)) ([ccdf08c](https://github.com/gravity-ui/blog-constructor/commit/ccdf08ccc62dd9930ab8c994601c787b03897f05))
|
9
|
-
|
10
3
|
## [3.3.0](https://github.com/gravity-ui/blog-constructor/compare/v3.2.1...v3.3.0) (2023-05-16)
|
11
4
|
|
12
5
|
|
@@ -56,10 +56,11 @@ const Feed = ({ image }) => {
|
|
56
56
|
const { posts, totalCount, tags, services, pinnedPost, getPosts, pageCountForShowSupportButtons, } = (0, react_1.useContext)(FeedContext_1.FeedContext);
|
57
57
|
const router = (0, react_1.useContext)(RouterContext_1.RouterContext);
|
58
58
|
const handleAnalytics = (0, page_constructor_1.useAnalytics)(common_1.DefaultEventNames.ShowMore);
|
59
|
-
const [{ errorLoad, errorShowMore, isFetching, isShowMoreVisible, lastLoadedCount, postCountOnPage, postsOnPage, pinnedPostOnPage, currentPage, queryParams, }, dispatch,] = (0, react_1.useReducer)(reducer_1.reducer, {
|
59
|
+
const [{ errorLoad, errorShowMore, isFetching, isShowMoreFetching, isShowMoreVisible, lastLoadedCount, postCountOnPage, postsOnPage, pinnedPostOnPage, currentPage, queryParams, }, dispatch,] = (0, react_1.useReducer)(reducer_1.reducer, {
|
60
60
|
errorLoad: false,
|
61
61
|
errorShowMore: false,
|
62
62
|
isFetching: false,
|
63
|
+
isShowMoreFetching: false,
|
63
64
|
isShowMoreVisible: true,
|
64
65
|
lastLoadedCount: (posts === null || posts === void 0 ? void 0 : posts.length) || 0,
|
65
66
|
postCountOnPage: totalCount || 0,
|
@@ -74,36 +75,36 @@ const Feed = ({ image }) => {
|
|
74
75
|
const pageChange = (value) => {
|
75
76
|
dispatch({ type: reducer_1.ActionTypes.PageChange, payload: value });
|
76
77
|
};
|
77
|
-
const
|
78
|
-
dispatch({ type: reducer_1.ActionTypes.SetIsFetching, payload: value });
|
79
|
-
};
|
80
|
-
const setErrorLoad = (value) => {
|
81
|
-
dispatch({ type: reducer_1.ActionTypes.SetErrorLoad, payload: value });
|
82
|
-
};
|
83
|
-
const handleChangeQueryParams = (0, react_1.useCallback)((value) => {
|
78
|
+
const handleChangeQueryParams = (value) => {
|
84
79
|
dispatch({ type: reducer_1.ActionTypes.QueryParamsChange, payload: value });
|
85
80
|
const hasFirstPageQuery = Object.keys(value).some((queryKey) => queryKey === PAGE_QUERY && value[queryKey] === FIRST_PAGE);
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
81
|
+
if (hasFirstPageQuery) {
|
82
|
+
// eslint-disable-next-line no-not-accumulator-reassign/no-not-accumulator-reassign
|
83
|
+
value[PAGE_QUERY] = null;
|
84
|
+
}
|
85
|
+
router.updateQueryCallback(value);
|
86
|
+
};
|
87
|
+
const handlePageChange = async (value) => {
|
88
|
+
pageChange(value);
|
89
|
+
handleChangeQueryParams({ page: value });
|
90
|
+
};
|
91
|
+
const fetchData = (0, react_1.useCallback)(async (pageNumber) => {
|
92
|
+
if (queryParams && getPosts) {
|
93
|
+
const query = (0, common_2.getFeedQueryParams)(queryParams, pageNumber);
|
94
|
+
const data = await getPosts(query);
|
94
95
|
return data;
|
95
96
|
}
|
96
97
|
else {
|
97
98
|
throw new Error('cant get request');
|
98
99
|
}
|
99
100
|
}, [getPosts, queryParams]);
|
100
|
-
const
|
101
|
-
|
102
|
-
|
101
|
+
const setIsFetching = (value) => {
|
102
|
+
dispatch({ type: reducer_1.ActionTypes.SetIsFetching, payload: value });
|
103
|
+
};
|
104
|
+
const fetchAndReplaceData = (0, react_1.useCallback)(async (pageNumber) => {
|
103
105
|
try {
|
104
|
-
|
105
|
-
|
106
|
-
const fetchedData = await fetchData({ page: pageNumber, query });
|
106
|
+
dispatch({ type: reducer_1.ActionTypes.SetErrorLoad, payload: false });
|
107
|
+
const fetchedData = await fetchData(pageNumber);
|
107
108
|
if (fetchedData) {
|
108
109
|
dispatch({
|
109
110
|
type: reducer_1.ActionTypes.SetPosts,
|
@@ -117,35 +118,22 @@ const Feed = ({ image }) => {
|
|
117
118
|
}
|
118
119
|
}
|
119
120
|
catch (err) {
|
120
|
-
|
121
|
+
dispatch({ type: reducer_1.ActionTypes.SetErrorLoad, payload: true });
|
121
122
|
}
|
122
123
|
(0, common_2.scrollOnPageChange)(CONTAINER_ID);
|
123
124
|
setIsFetching(false);
|
124
|
-
}, [fetchData
|
125
|
-
const handlePageChange = async (value) => {
|
126
|
-
pageChange(value);
|
127
|
-
handleLoad({
|
128
|
-
page: value,
|
129
|
-
query: Object.assign(Object.assign({}, queryParams), { page: value }),
|
130
|
-
});
|
131
|
-
};
|
125
|
+
}, [fetchData]);
|
132
126
|
const handleShowMore = async () => {
|
127
|
+
dispatch({ type: reducer_1.ActionTypes.SetIsShowMoreFetching, payload: true });
|
133
128
|
/**
|
134
129
|
* @deprecated Metrika will be deleted after launch of analyticsEvents
|
135
130
|
*/
|
136
131
|
metrika_js_1.default.reachGoal(utils_1.MetrikaCounter.CrossSite, constants_1.BlogMetrikaGoalIds.showMore);
|
137
132
|
handleAnalytics();
|
138
|
-
const nextPage = currentPage + 1;
|
139
133
|
try {
|
140
|
-
|
141
|
-
const fetchedData = await fetchData({
|
142
|
-
page: nextPage,
|
143
|
-
query: {
|
144
|
-
page: nextPage,
|
145
|
-
},
|
146
|
-
});
|
134
|
+
const fetchedData = await fetchData(currentPage + 1);
|
147
135
|
handleChangeQueryParams({
|
148
|
-
page:
|
136
|
+
page: currentPage + 1,
|
149
137
|
});
|
150
138
|
if (fetchedData) {
|
151
139
|
dispatch({
|
@@ -153,7 +141,7 @@ const Feed = ({ image }) => {
|
|
153
141
|
payload: {
|
154
142
|
posts: (postsOnPage !== null && postsOnPage !== void 0 ? postsOnPage : []).concat(fetchedData.posts),
|
155
143
|
count: fetchedData.count,
|
156
|
-
currentPage:
|
144
|
+
currentPage: currentPage + 1,
|
157
145
|
lastLoadedCount: fetchedData.posts.length,
|
158
146
|
},
|
159
147
|
});
|
@@ -162,11 +150,13 @@ const Feed = ({ image }) => {
|
|
162
150
|
catch (err) {
|
163
151
|
dispatch({ type: reducer_1.ActionTypes.SetErrorShowMore, payload: true });
|
164
152
|
}
|
165
|
-
|
153
|
+
dispatch({ type: reducer_1.ActionTypes.SetIsShowMoreFetching, payload: false });
|
166
154
|
};
|
167
|
-
|
168
|
-
|
169
|
-
|
155
|
+
(0, react_1.useEffect)(() => {
|
156
|
+
if (isFetching) {
|
157
|
+
fetchAndReplaceData(Number(queryParams.page || constants_2.DEFAULT_PAGE));
|
158
|
+
}
|
159
|
+
}, [fetchAndReplaceData, isFetching, queryParams.page]);
|
170
160
|
(0, react_1.useEffect)(() => {
|
171
161
|
const loadedPostsCount = currentPage * perPageInQuery;
|
172
162
|
dispatch({
|
@@ -184,11 +174,11 @@ const Feed = ({ image }) => {
|
|
184
174
|
icon: tag.icon && react_1.default.createElement(uikit_1.Icon, { data: tag.icon }),
|
185
175
|
})), [tags]);
|
186
176
|
return (react_1.default.createElement("div", null,
|
187
|
-
react_1.default.createElement(FeedHeader_1.FeedHeader, { verticalOffset: "s", tags: tagItems, services: serviceItems,
|
177
|
+
react_1.default.createElement(FeedHeader_1.FeedHeader, { verticalOffset: "s", tags: tagItems, services: serviceItems, setIsFetching: setIsFetching, handleChangeQuery: handleChangeQueryParams, queryParams: queryParams, background: {
|
188
178
|
fullWidth: true,
|
189
179
|
url: image,
|
190
180
|
disableCompress: true,
|
191
181
|
} }),
|
192
|
-
errorLoad ? (react_1.default.createElement(PostsError_1.PostsError, { onButtonClick:
|
182
|
+
errorLoad ? (react_1.default.createElement(PostsError_1.PostsError, { onButtonClick: () => fetchAndReplaceData(Number(queryParams.page || constants_2.DEFAULT_PAGE)) })) : (react_1.default.createElement(Posts_1.Posts, { containerId: CONTAINER_ID, currentPage: currentPage, isShowMoreVisible: isShowMoreVisible, errorShowMore: errorShowMore, postCountOnPage: postCountOnPage, perPageInQuery: perPageInQuery, handleShowMore: handleShowMore, handlePageChange: handlePageChange, postsOnPage: postsOnPage, pinnedPostOnPage: pinnedPostOnPage, isFetching: isFetching, isShowMoreFetching: isShowMoreFetching, pageCountForShowSupportButtons: pageCountForShowSupportButtons }))));
|
193
183
|
};
|
194
184
|
exports.Feed = Feed;
|
@@ -6,6 +6,7 @@ export declare enum ActionTypes {
|
|
6
6
|
SetPosts = "setPosts",
|
7
7
|
SetShowMore = "setShowMore",
|
8
8
|
SetIsFetching = "setIsFetching",
|
9
|
+
SetIsShowMoreFetching = "setIsShowMoreFetching",
|
9
10
|
PageChange = "pageChange",
|
10
11
|
QueryParamsChange = "queryParamsChange"
|
11
12
|
}
|
@@ -14,6 +15,7 @@ export type State = {
|
|
14
15
|
errorLoad: boolean;
|
15
16
|
errorShowMore: boolean;
|
16
17
|
isFetching: boolean;
|
18
|
+
isShowMoreFetching: boolean;
|
17
19
|
isShowMoreVisible: boolean;
|
18
20
|
lastLoadedCount: number;
|
19
21
|
pinnedPostOnPage?: PostData;
|
@@ -27,6 +29,9 @@ type Action = {
|
|
27
29
|
} | {
|
28
30
|
type: ActionTypes.SetIsFetching;
|
29
31
|
payload: boolean;
|
32
|
+
} | {
|
33
|
+
type: ActionTypes.SetIsShowMoreFetching;
|
34
|
+
payload: boolean;
|
30
35
|
} | {
|
31
36
|
type: ActionTypes.SetPosts;
|
32
37
|
payload: {
|
@@ -9,6 +9,7 @@ var ActionTypes;
|
|
9
9
|
ActionTypes["SetPosts"] = "setPosts";
|
10
10
|
ActionTypes["SetShowMore"] = "setShowMore";
|
11
11
|
ActionTypes["SetIsFetching"] = "setIsFetching";
|
12
|
+
ActionTypes["SetIsShowMoreFetching"] = "setIsShowMoreFetching";
|
12
13
|
ActionTypes["PageChange"] = "pageChange";
|
13
14
|
ActionTypes["QueryParamsChange"] = "queryParamsChange";
|
14
15
|
})(ActionTypes = exports.ActionTypes || (exports.ActionTypes = {}));
|
@@ -19,9 +20,11 @@ const reducer = (state, { type, payload }) => {
|
|
19
20
|
case ActionTypes.SetPosts:
|
20
21
|
return Object.assign(Object.assign({}, state), { lastLoadedCount: payload.count, postCountOnPage: payload.count, pinnedPostOnPage: payload.pinnedPost, postsOnPage: payload.posts, currentPage: payload.page });
|
21
22
|
case ActionTypes.SetShowMore:
|
22
|
-
return Object.assign(Object.assign({}, state), { lastLoadedCount: payload.lastLoadedCount, postCountOnPage: payload.count, currentPage: payload.currentPage, postsOnPage: payload.posts, errorShowMore: false });
|
23
|
+
return Object.assign(Object.assign({}, state), { lastLoadedCount: payload.lastLoadedCount, postCountOnPage: payload.count, currentPage: payload.currentPage, postsOnPage: payload.posts, errorShowMore: false, isShowMoreFetching: true });
|
23
24
|
case ActionTypes.SetIsFetching:
|
24
25
|
return Object.assign(Object.assign({}, state), { isFetching: payload });
|
26
|
+
case ActionTypes.SetIsShowMoreFetching:
|
27
|
+
return Object.assign(Object.assign({}, state), { isShowMoreFetching: payload });
|
25
28
|
case ActionTypes.PageChange:
|
26
29
|
return Object.assign(Object.assign({}, state), { currentPage: payload, isFetching: true });
|
27
30
|
case ActionTypes.SetErrorLoad:
|
@@ -5,8 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
exports.YFM = void 0;
|
7
7
|
const react_1 = __importDefault(require("react"));
|
8
|
-
const page_constructor_1 = require("@gravity-ui/page-constructor");
|
9
8
|
const bem_cn_lite_1 = __importDefault(require("bem-cn-lite"));
|
9
|
+
const page_constructor_1 = require("@gravity-ui/page-constructor");
|
10
10
|
const Wrapper_1 = require("../../components/Wrapper/Wrapper");
|
11
11
|
const paddings_1 = require("../../models/paddings");
|
12
12
|
const b = (0, bem_cn_lite_1.default)('yfm');
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,16 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const react_1 = __importDefault(require("react"));
|
7
|
+
const react_2 = require("@testing-library/react");
|
8
|
+
const YFM_1 = require("../YFM");
|
9
|
+
const text = 'YFM block';
|
10
|
+
describe('YFM', () => {
|
11
|
+
test('Has id', async () => {
|
12
|
+
(0, react_2.render)(react_1.default.createElement(YFM_1.YFM, { text: text }));
|
13
|
+
const yfm = react_2.screen.getByText(text);
|
14
|
+
expect(yfm).toHaveClass('yfm');
|
15
|
+
});
|
16
|
+
});
|
@@ -9,7 +9,7 @@ const page_constructor_1 = require("@gravity-ui/page-constructor");
|
|
9
9
|
const cn_1 = require("../../utils/cn");
|
10
10
|
const Controls_1 = require("./components/Controls/Controls");
|
11
11
|
const b = (0, cn_1.block)('feed-header');
|
12
|
-
const FeedHeader = ({ tags, services,
|
12
|
+
const FeedHeader = ({ tags, services, setIsFetching, offset = 'default', background, theme = 'default', verticalOffset = 'l', className, handleChangeQuery, queryParams, }) => {
|
13
13
|
const backgroundThemed = background && (0, page_constructor_1.getThemedValue)(background, theme);
|
14
14
|
return (react_1.default.createElement("header", { className: b('header', { ['has-background']: Boolean(background) }, className) },
|
15
15
|
(backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.color) ? (react_1.default.createElement(page_constructor_1.FullWidthBackground, { style: { backgroundColor: backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.color }, theme: "rounded" })) : null,
|
@@ -19,6 +19,6 @@ const FeedHeader = ({ tags, services, handleLoadData, offset = 'default', backgr
|
|
19
19
|
? ''
|
20
20
|
: backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.color,
|
21
21
|
}, disableCompress: backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.disableCompress })) : null,
|
22
|
-
react_1.default.createElement(Controls_1.Controls, { tags: tags, services: services,
|
22
|
+
react_1.default.createElement(Controls_1.Controls, { tags: tags, services: services, setIsFetching: setIsFetching, handleChangeQuery: handleChangeQuery, queryParams: queryParams }))));
|
23
23
|
};
|
24
24
|
exports.FeedHeader = FeedHeader;
|
@@ -1,14 +1,15 @@
|
|
1
1
|
import React, { ReactNode } from 'react';
|
2
|
-
import {
|
2
|
+
import { HandleChangeQueryParams, Query, SetQueryType } from '../../../../models/common';
|
3
3
|
export type SelectItem = {
|
4
4
|
content: string;
|
5
5
|
value: string;
|
6
6
|
icon?: ReactNode;
|
7
7
|
};
|
8
8
|
export type ControlsProps = {
|
9
|
-
|
9
|
+
setIsFetching: (value: boolean) => void;
|
10
10
|
tags?: SelectItem[];
|
11
11
|
services?: SelectItem[];
|
12
|
+
handleChangeQuery: HandleChangeQueryParams;
|
12
13
|
queryParams: Query;
|
13
14
|
setQuery?: SetQueryType;
|
14
15
|
};
|
@@ -47,7 +47,7 @@ const b = (0, cn_1.block)('feed-controls');
|
|
47
47
|
const ICON_SIZE = 16;
|
48
48
|
const DEFAULT_PAGE = 1;
|
49
49
|
const VIRTUALIZATION_THRESHOLD = 1000;
|
50
|
-
const Controls = ({
|
50
|
+
const Controls = ({ setIsFetching, tags = [], services = [], handleChangeQuery, queryParams, }) => {
|
51
51
|
const { hasLikes } = (0, react_1.useContext)(LikesContext_1.LikesContext);
|
52
52
|
const handleAnalyticsTag = (0, page_constructor_1.useAnalytics)(common_1.DefaultEventNames.Tag);
|
53
53
|
const handleAnalyticsService = (0, page_constructor_1.useAnalytics)(common_1.DefaultEventNames.Service);
|
@@ -56,25 +56,21 @@ const Controls = ({ handleLoadData, tags = [], services = [], queryParams, }) =>
|
|
56
56
|
const [savedOnly, setSavedOnly] = (0, react_1.useState)(savedOnlyInitial === 'true');
|
57
57
|
const [search, setSearch] = (0, react_1.useState)(searchInitial);
|
58
58
|
const handleSavedOnly = () => {
|
59
|
-
|
60
|
-
|
61
|
-
|
59
|
+
handleChangeQuery({
|
60
|
+
savedOnly: savedOnly ? '' : 'true',
|
61
|
+
search: '',
|
62
|
+
tags: '',
|
62
63
|
page: DEFAULT_PAGE,
|
63
|
-
|
64
|
-
savedOnly: savedOnly ? '' : 'true',
|
65
|
-
search: '',
|
66
|
-
tags: '',
|
67
|
-
page: DEFAULT_PAGE,
|
68
|
-
services: '',
|
69
|
-
},
|
64
|
+
services: '',
|
70
65
|
});
|
66
|
+
handleAnalyticsSaveOnly();
|
67
|
+
setSavedOnly(!savedOnly);
|
68
|
+
setIsFetching(true);
|
71
69
|
};
|
72
70
|
const handleSearch = (searchValue) => {
|
71
|
+
handleChangeQuery({ search: searchValue, page: DEFAULT_PAGE });
|
73
72
|
setSearch(searchValue);
|
74
|
-
|
75
|
-
page: DEFAULT_PAGE,
|
76
|
-
query: { search: searchValue, page: DEFAULT_PAGE },
|
77
|
-
});
|
73
|
+
setIsFetching(true);
|
78
74
|
};
|
79
75
|
const handleTagSelect = (selectedTags) => {
|
80
76
|
/**
|
@@ -87,13 +83,11 @@ const Controls = ({ handleLoadData, tags = [], services = [], queryParams, }) =>
|
|
87
83
|
theme: selectedTags[0],
|
88
84
|
});
|
89
85
|
const isEmptyTag = selectedTags.some((tag) => tag === 'empty');
|
90
|
-
|
86
|
+
handleChangeQuery({
|
87
|
+
tags: isEmptyTag ? '' : selectedTags[0],
|
91
88
|
page: DEFAULT_PAGE,
|
92
|
-
query: {
|
93
|
-
tags: isEmptyTag ? '' : selectedTags[0],
|
94
|
-
page: DEFAULT_PAGE,
|
95
|
-
},
|
96
89
|
});
|
90
|
+
setIsFetching(true);
|
97
91
|
};
|
98
92
|
const handleServicesSelect = (selectedServices) => {
|
99
93
|
const forMetrikaServices = services.filter((service) => {
|
@@ -110,10 +104,8 @@ const Controls = ({ handleLoadData, tags = [], services = [], queryParams, }) =>
|
|
110
104
|
service: metrikaAsString,
|
111
105
|
});
|
112
106
|
const servicesAsString = selectedServices.join(',');
|
113
|
-
|
114
|
-
|
115
|
-
query: { services: servicesAsString, page: DEFAULT_PAGE },
|
116
|
-
});
|
107
|
+
handleChangeQuery({ services: servicesAsString, page: DEFAULT_PAGE });
|
108
|
+
setIsFetching(true);
|
117
109
|
};
|
118
110
|
const tagsItems = (0, react_1.useMemo)(() => [{ value: 'empty', content: (0, i18n_1.i18)(i18n_1.Keyset.AllTags) }, ...tags], [tags]);
|
119
111
|
const servicesItems = (0, react_1.useMemo)(() => (servicesInitial ? [...servicesInitial.split(',')] : []), [servicesInitial]);
|
@@ -1,2 +1,2 @@
|
|
1
1
|
import { PaginatorProps } from './types';
|
2
|
-
export declare const Paginator: ({ itemsPerPage, totalItems, maxPages, page, className, onPageChange, pageCountForShowSupportButtons, }: PaginatorProps) => JSX.Element | null;
|
2
|
+
export declare const Paginator: ({ itemsPerPage, totalItems, maxPages, page, className, loading, onPageChange, pageCountForShowSupportButtons, }: PaginatorProps) => JSX.Element | null;
|
@@ -54,7 +54,7 @@ const types_1 = require("./types");
|
|
54
54
|
const utils_2 = require("./utils");
|
55
55
|
const b = (0, cn_1.block)('paginator');
|
56
56
|
const DEFAULT_PAGE_COUNT_FOR_SHOW_SUPPORT_BUTTONS = 6;
|
57
|
-
const Paginator = ({ itemsPerPage, totalItems, maxPages, page, className, onPageChange, pageCountForShowSupportButtons = DEFAULT_PAGE_COUNT_FOR_SHOW_SUPPORT_BUTTONS, }) => {
|
57
|
+
const Paginator = ({ itemsPerPage, totalItems, maxPages, page, className, loading, onPageChange, pageCountForShowSupportButtons = DEFAULT_PAGE_COUNT_FOR_SHOW_SUPPORT_BUTTONS, }) => {
|
58
58
|
const [pagesCount, setPagesCount] = (0, react_1.useState)((0, utils_2.getPagesCount)({ itemsPerPage, totalItems, maxPages }));
|
59
59
|
(0, react_1.useEffect)(() => {
|
60
60
|
const count = (0, utils_2.getPagesCount)({ itemsPerPage, totalItems, maxPages });
|
@@ -123,7 +123,7 @@ const Paginator = ({ itemsPerPage, totalItems, maxPages, page, className, onPage
|
|
123
123
|
}
|
124
124
|
const renderPaginatorItem = (item) => {
|
125
125
|
const { key } = item, rest = __rest(item, ["key"]);
|
126
|
-
return react_1.default.createElement(PaginatorItem_1.PaginatorItem, Object.assign({ key: `page_${key}` }, rest));
|
126
|
+
return react_1.default.createElement(PaginatorItem_1.PaginatorItem, Object.assign({ key: `page_${key}` }, rest, { loading: loading }));
|
127
127
|
};
|
128
128
|
return (react_1.default.createElement("div", { className: b('pagination') },
|
129
129
|
page > 1 && (react_1.default.createElement("div", { className: b('pagination-block') },
|
@@ -1,15 +1,9 @@
|
|
1
1
|
/* use this for style redefinitions to awoid problems with
|
2
2
|
unpredictable css rules order in build */
|
3
|
-
.bc-posts {
|
4
|
-
position: relative;
|
5
|
-
}
|
6
3
|
.bc-posts__cards-container, .bc-posts__pinned-container {
|
7
4
|
padding-top: 24px;
|
8
5
|
scroll-margin: 48px;
|
9
6
|
}
|
10
|
-
.bc-posts__cards-container_isLoading {
|
11
|
-
opacity: 0.7;
|
12
|
-
}
|
13
7
|
.bc-posts__pagination {
|
14
8
|
display: flex;
|
15
9
|
flex-direction: column;
|
@@ -31,23 +25,4 @@ unpredictable css rules order in build */
|
|
31
25
|
}
|
32
26
|
.bc-posts__paginator {
|
33
27
|
padding-top: 12px;
|
34
|
-
}
|
35
|
-
.bc-posts__loaderContainer {
|
36
|
-
z-index: 6;
|
37
|
-
position: absolute;
|
38
|
-
top: 0;
|
39
|
-
left: 0;
|
40
|
-
width: 70%;
|
41
|
-
height: 100%;
|
42
|
-
background: linear-gradient(90deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.5), rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0));
|
43
|
-
animation: shimmer 2s infinite linear;
|
44
|
-
}
|
45
|
-
|
46
|
-
@keyframes shimmer {
|
47
|
-
from {
|
48
|
-
transform: translateX(-200%);
|
49
|
-
}
|
50
|
-
to {
|
51
|
-
transform: translateX(300%);
|
52
|
-
}
|
53
28
|
}
|
@@ -8,6 +8,7 @@ type PostCardProps = {
|
|
8
8
|
postCountOnPage: number;
|
9
9
|
perPageInQuery: number;
|
10
10
|
isFetching: boolean;
|
11
|
+
isShowMoreFetching: boolean;
|
11
12
|
handleShowMore: (value?: MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => Promise<void> | void;
|
12
13
|
handlePageChange: (value: number) => Promise<void> | void;
|
13
14
|
postsOnPage?: PostData[];
|
@@ -13,9 +13,8 @@ const Paginator_1 = require("../Paginator/Paginator");
|
|
13
13
|
const PostCard_1 = require("../PostCard/PostCard");
|
14
14
|
const PostsEmpty_1 = require("../PostsEmpty/PostsEmpty");
|
15
15
|
const b = (0, cn_1.block)('posts');
|
16
|
-
const Posts = ({ containerId, pinnedPostOnPage, currentPage, postsOnPage, isShowMoreVisible, errorShowMore, postCountOnPage, perPageInQuery, isFetching, handleShowMore, handlePageChange, pageCountForShowSupportButtons, }) => (react_1.default.createElement("div", { className: b() },
|
17
|
-
|
18
|
-
react_1.default.createElement("div", { id: containerId, className: b('cards-container', { isLoading: isFetching }) },
|
16
|
+
const Posts = ({ containerId, pinnedPostOnPage, currentPage, postsOnPage, isShowMoreVisible, errorShowMore, postCountOnPage, perPageInQuery, isFetching, isShowMoreFetching, handleShowMore, handlePageChange, pageCountForShowSupportButtons, }) => (react_1.default.createElement("div", { className: b() },
|
17
|
+
react_1.default.createElement("div", { id: containerId, className: b('cards-container') },
|
19
18
|
pinnedPostOnPage && currentPage === 1 && (react_1.default.createElement("div", { className: b('pinned-container') },
|
20
19
|
react_1.default.createElement(PostCard_1.PostCard, { post: pinnedPostOnPage, size: "m", fullWidth: true, showTag: true }))),
|
21
20
|
(postsOnPage === null || postsOnPage === void 0 ? void 0 : postsOnPage.length) ? (react_1.default.createElement(page_constructor_1.CardLayoutBlock, { title: '', colSizes: {
|
@@ -24,10 +23,10 @@ const Posts = ({ containerId, pinnedPostOnPage, currentPage, postsOnPage, isShow
|
|
24
23
|
md: 6,
|
25
24
|
} }, postsOnPage === null || postsOnPage === void 0 ? void 0 : postsOnPage.map((post) => (react_1.default.createElement(PostCard_1.PostCard, { key: post.id, post: post, showTag: true }))))) : (react_1.default.createElement(PostsEmpty_1.PostsEmpty, null))),
|
26
25
|
react_1.default.createElement("div", { className: b('pagination') },
|
27
|
-
Boolean(isShowMoreVisible && (postsOnPage === null || postsOnPage === void 0 ? void 0 : postsOnPage.length)) && (react_1.default.createElement(uikit_1.Button, { view: "outlined", size: "xl", className: b('more-button'), onClick: handleShowMore }, (0, i18n_1.i18)(i18n_1.Keyset.ActionLoadMore))),
|
26
|
+
Boolean(isShowMoreVisible && (postsOnPage === null || postsOnPage === void 0 ? void 0 : postsOnPage.length)) && (react_1.default.createElement(uikit_1.Button, { view: "outlined", size: "xl", className: b('more-button'), onClick: handleShowMore, loading: isShowMoreFetching }, (0, i18n_1.i18)(i18n_1.Keyset.ActionLoadMore))),
|
28
27
|
errorShowMore && (react_1.default.createElement("div", { className: b('error-show-more') },
|
29
28
|
react_1.default.createElement("div", null, (0, i18n_1.i18)(i18n_1.Keyset.ErrorTitle)),
|
30
29
|
react_1.default.createElement("div", null, (0, i18n_1.i18)(i18n_1.Keyset.PostLoadError)))),
|
31
30
|
Boolean(currentPage && postCountOnPage) && (react_1.default.createElement("div", { className: b('paginator') },
|
32
|
-
react_1.default.createElement(Paginator_1.Paginator, { onPageChange: handlePageChange, page: currentPage, totalItems: postCountOnPage, itemsPerPage: perPageInQuery, maxPages: Infinity, pageCountForShowSupportButtons: pageCountForShowSupportButtons }))))));
|
31
|
+
react_1.default.createElement(Paginator_1.Paginator, { onPageChange: handlePageChange, page: currentPage, totalItems: postCountOnPage, itemsPerPage: perPageInQuery, loading: isFetching, maxPages: Infinity, pageCountForShowSupportButtons: pageCountForShowSupportButtons }))))));
|
33
32
|
exports.Posts = Posts;
|
@@ -25,8 +25,8 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
26
26
|
exports.Search = void 0;
|
27
27
|
const react_1 = __importStar(require("react"));
|
28
|
-
const uikit_1 = require("@gravity-ui/uikit");
|
29
28
|
const lodash_1 = require("lodash");
|
29
|
+
const uikit_1 = require("@gravity-ui/uikit");
|
30
30
|
const useIsIPhone_1 = require("../../hooks/useIsIPhone");
|
31
31
|
const i18n_1 = require("../../i18n");
|
32
32
|
const Close_1 = require("../../icons/Close");
|
@@ -173,18 +173,6 @@ unpredictable css rules order in build */
|
|
173
173
|
.yfm_constructor_theme_dark p {
|
174
174
|
color: var(--yc-color-text-light-primary);
|
175
175
|
}
|
176
|
-
.yfm_constructor_footnote_text p, .yfm_constructor_footnote_page p {
|
177
|
-
opacity: 0.5;
|
178
|
-
}
|
179
|
-
.yfm_constructor_footnote_text p {
|
180
|
-
font-size: var(--yc-text-body-2-font-size);
|
181
|
-
line-height: var(--yc-text-body-2-line-height);
|
182
|
-
}
|
183
|
-
.yfm_constructor_footnote_page p {
|
184
|
-
font-size: var(--yc-text-body-1-font-size);
|
185
|
-
line-height: var(--yc-text-body-1-line-height);
|
186
|
-
display: inline;
|
187
|
-
}
|
188
176
|
.yfm_constructor_list_style ul {
|
189
177
|
padding-left: 20px;
|
190
178
|
}
|
@@ -0,0 +1,62 @@
|
|
1
|
+
export function initCounters(configs: any): void;
|
2
|
+
declare namespace _default {
|
3
|
+
export { hit };
|
4
|
+
export { params };
|
5
|
+
export { reachGoal };
|
6
|
+
export { reachGoals };
|
7
|
+
export { Goal };
|
8
|
+
export { getServicePrefix };
|
9
|
+
export { getMarketPlacePrefix };
|
10
|
+
export { goalGoToConsole };
|
11
|
+
export { goalGoToForm };
|
12
|
+
export { goalGoToDocs };
|
13
|
+
export { goalFormSubmit };
|
14
|
+
export { goalEventFormSubmit };
|
15
|
+
export { goalEventVideoAction };
|
16
|
+
export { goalCaseFormSubmit };
|
17
|
+
export { goalSwitchLang };
|
18
|
+
}
|
19
|
+
export default _default;
|
20
|
+
declare function hit(...args: any[]): void;
|
21
|
+
declare function params(...args: any[]): void;
|
22
|
+
declare function reachGoal(counterName: any, ...args: any[]): void;
|
23
|
+
declare function reachGoals(goals: any, counterName?: string): void;
|
24
|
+
/**
|
25
|
+
* @deprecated Metrika will be deleted after launch of analyticsEvents
|
26
|
+
*/
|
27
|
+
declare const Goal: {
|
28
|
+
SUPPORT_OPEN_FORM: string;
|
29
|
+
SUPPORT_STEP_1_SUBMIT: string;
|
30
|
+
SUPPORT_STEP_2_SUBMIT: string;
|
31
|
+
SUPPORT_STEP_3_SUBMIT: string;
|
32
|
+
SUPPORT_THANKYOU_SUBMIT: string;
|
33
|
+
MP_OPEN_FORM: string;
|
34
|
+
EDIT_ON_GITHUB: string;
|
35
|
+
MAIN_GO_TO_VAR: string;
|
36
|
+
MAIN_GO_TO_ISV: string;
|
37
|
+
MAIN_ALL_PARTNERS: string;
|
38
|
+
FIND_GO_TO_VAR: string;
|
39
|
+
ISV_GO_TO_MP: string;
|
40
|
+
FOOTER_SUBSCRIBE: string;
|
41
|
+
FOOTER_MNG_SUBSCRIPTIONS: string;
|
42
|
+
MOBILE_STORE_IOS: string;
|
43
|
+
MOBILE_STORE_ANDROID: string;
|
44
|
+
REGION_POPUP_SHOW: string;
|
45
|
+
REGION_POPUP_YES: string;
|
46
|
+
REGION_POPUP_NO: string;
|
47
|
+
REGION_POPUP_CLOSE: string;
|
48
|
+
SCALE_REGISTRATION: string;
|
49
|
+
DLGOTOPRODUCT_MPSITE: string;
|
50
|
+
MPK8S_CLCK: string;
|
51
|
+
'SITE_CALCULATOR_SHARE-RESULT_CLICK': string;
|
52
|
+
};
|
53
|
+
declare function getServicePrefix(id: any): "CMPT" | "IAM" | "VPC" | "STRG" | "SK" | "CH" | "MONGO" | "POSTGR" | "MR" | "MMSQL" | "MK" | "TRSL" | "INSTGR" | "LB" | "MQ" | "DL" | "MNTRG" | "DP" | "KMS" | "YDB" | "INTRCNCT" | undefined;
|
54
|
+
declare function getMarketPlacePrefix(id: any): string;
|
55
|
+
declare function goalGoToConsole(prefix: any): any;
|
56
|
+
declare function goalGoToForm(prefix: any): any;
|
57
|
+
declare function goalGoToDocs(prefix: any): any;
|
58
|
+
declare function goalFormSubmit(prefix: any): any;
|
59
|
+
declare function goalEventFormSubmit(id: any): string;
|
60
|
+
declare function goalEventVideoAction(id: any, action: any): string;
|
61
|
+
declare function goalCaseFormSubmit(id: any): string;
|
62
|
+
declare function goalSwitchLang(place: any): string;
|