@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.
Files changed (50) hide show
  1. package/CHANGELOG.md +0 -7
  2. package/build/cjs/blocks/Feed/Feed.js +37 -47
  3. package/build/cjs/blocks/Feed/reducer.d.ts +5 -0
  4. package/build/cjs/blocks/Feed/reducer.js +4 -1
  5. package/build/cjs/blocks/YFM/YFM.js +1 -1
  6. package/build/cjs/blocks/YFM/__tests__/YFM.test.d.ts +1 -0
  7. package/build/cjs/blocks/YFM/__tests__/YFM.test.js +16 -0
  8. package/build/cjs/components/FeedHeader/FeedHeader.js +2 -2
  9. package/build/cjs/components/FeedHeader/components/Controls/Controls.d.ts +3 -2
  10. package/build/cjs/components/FeedHeader/components/Controls/Controls.js +16 -24
  11. package/build/cjs/components/Paginator/Paginator.d.ts +1 -1
  12. package/build/cjs/components/Paginator/Paginator.js +2 -2
  13. package/build/cjs/components/Paginator/types.d.ts +1 -0
  14. package/build/cjs/components/Posts/Posts.css +0 -25
  15. package/build/cjs/components/Posts/Posts.d.ts +1 -0
  16. package/build/cjs/components/Posts/Posts.js +4 -5
  17. package/build/cjs/components/Search/Search.js +1 -1
  18. package/build/cjs/containers/BlogPostPage/BlogPostPage.css +0 -12
  19. package/build/cjs/counters/metrika.d.ts +62 -0
  20. package/build/cjs/counters/metrika.js +173 -0
  21. package/build/cjs/models/common.d.ts +1 -5
  22. package/build/cjs/utils/common.d.ts +1 -1
  23. package/build/cjs/utils/common.js +1 -1
  24. package/build/esm/blocks/Feed/Feed.js +37 -47
  25. package/build/esm/blocks/Feed/reducer.d.ts +5 -0
  26. package/build/esm/blocks/Feed/reducer.js +4 -1
  27. package/build/esm/blocks/YFM/YFM.js +1 -1
  28. package/build/esm/blocks/YFM/__tests__/YFM.test.d.ts +1 -0
  29. package/build/esm/blocks/YFM/__tests__/YFM.test.js +11 -0
  30. package/build/esm/components/FeedHeader/FeedHeader.js +2 -2
  31. package/build/esm/components/FeedHeader/components/Controls/Controls.d.ts +3 -2
  32. package/build/esm/components/FeedHeader/components/Controls/Controls.js +17 -25
  33. package/build/esm/components/Paginator/Paginator.d.ts +1 -1
  34. package/build/esm/components/Paginator/Paginator.js +2 -2
  35. package/build/esm/components/Paginator/types.d.ts +1 -0
  36. package/build/esm/components/Posts/Posts.css +0 -25
  37. package/build/esm/components/Posts/Posts.d.ts +1 -0
  38. package/build/esm/components/Posts/Posts.js +4 -5
  39. package/build/esm/components/Search/Search.js +1 -1
  40. package/build/esm/containers/BlogPostPage/BlogPostPage.css +0 -12
  41. package/build/esm/counters/metrika.d.ts +62 -0
  42. package/build/esm/counters/metrika.js +169 -0
  43. package/build/esm/models/common.d.ts +1 -5
  44. package/build/esm/utils/common.d.ts +1 -1
  45. package/build/esm/utils/common.js +1 -1
  46. package/package.json +5 -2
  47. package/server/data/sanitizeMeta.d.ts +0 -2
  48. package/server/data/sanitizeMeta.js +0 -2
  49. package/server/data/transformPageContent.js +16 -3
  50. 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 setIsFetching = (value) => {
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
- const result = hasFirstPageQuery
87
- ? Object.assign(Object.assign({}, value), { [PAGE_QUERY]: null }) : Object.assign({}, value);
88
- router.updateQueryCallback(result);
89
- }, [router]);
90
- const fetchData = (0, react_1.useCallback)(async ({ page, query }) => {
91
- if (query && getPosts) {
92
- const queryParamsForRequest = (0, common_2.getFeedQueryParams)(Object.assign(Object.assign({}, queryParams), query), page);
93
- const data = await getPosts(queryParamsForRequest);
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 handleLoad = (0, react_1.useCallback)(async ({ page, query }) => {
101
- const pageNumber = Number(page || queryParams.page || constants_2.DEFAULT_PAGE);
102
- handleChangeQueryParams(query);
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
- setErrorLoad(false);
105
- setIsFetching(true);
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
- setErrorLoad(true);
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, handleChangeQueryParams, queryParams]);
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
- setIsFetching(true);
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: nextPage,
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: nextPage,
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
- setIsFetching(false);
153
+ dispatch({ type: reducer_1.ActionTypes.SetIsShowMoreFetching, payload: false });
166
154
  };
167
- const handleOnErrorReload = (0, react_1.useCallback)(() => {
168
- handleLoad({ page: currentPage, query: queryParams });
169
- }, [currentPage, handleLoad, queryParams]);
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, handleLoadData: handleLoad, queryParams: queryParams, background: {
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: handleOnErrorReload })) : (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, pageCountForShowSupportButtons: pageCountForShowSupportButtons }))));
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, handleLoadData, offset = 'default', background, theme = 'default', verticalOffset = 'l', className, queryParams, }) => {
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, handleLoadData: handleLoadData, queryParams: queryParams }))));
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 { FetchArgs, Query, SetQueryType } from '../../../../models/common';
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
- handleLoadData: (props: FetchArgs) => void;
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 = ({ handleLoadData, tags = [], services = [], queryParams, }) => {
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
- handleAnalyticsSaveOnly();
60
- setSavedOnly(!savedOnly);
61
- handleLoadData({
59
+ handleChangeQuery({
60
+ savedOnly: savedOnly ? '' : 'true',
61
+ search: '',
62
+ tags: '',
62
63
  page: DEFAULT_PAGE,
63
- query: {
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
- handleLoadData({
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
- handleLoadData({
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
- handleLoadData({
114
- page: DEFAULT_PAGE,
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') },
@@ -15,6 +15,7 @@ export type PaginatorProps = {
15
15
  totalItems: number;
16
16
  itemsPerPage: number;
17
17
  maxPages: number;
18
+ loading: boolean;
18
19
  onPageChange: (page: number) => void;
19
20
  pageCountForShowSupportButtons?: number;
20
21
  } & ClassNameProps;
@@ -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
- isFetching && react_1.default.createElement("div", { className: b('loaderContainer') }),
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;