@gravity-ui/blog-constructor 5.16.1 → 6.0.0
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +5 -5
- package/build/cjs/blocks/Banner/Banner.js +7 -9
- package/build/cjs/blocks/CTA/CTA.js +7 -9
- package/build/cjs/blocks/Feed/Feed.js +5 -12
- package/build/cjs/blocks/Header/Header.js +10 -14
- package/build/cjs/blocks/Media/Media.js +1 -0
- package/build/cjs/blocks/Meta/Meta.js +11 -15
- package/build/cjs/blocks/Suggest/Suggest.js +8 -11
- package/build/cjs/components/FeedHeader/components/Controls/Controls.css +19 -5
- package/build/cjs/components/FeedHeader/components/Controls/Controls.js +22 -27
- package/build/cjs/components/FeedHeader/components/Controls/customRenders.js +1 -1
- package/build/cjs/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.css +1 -1
- package/build/cjs/components/Paginator/Paginator.js +16 -19
- package/build/cjs/components/Paginator/components/NavigationButton.js +1 -1
- package/build/cjs/components/PostCard/PostCard.d.ts +3 -6
- package/build/cjs/components/PostCard/PostCard.js +2 -2
- package/build/cjs/components/PostInfo/PostInfo.d.ts +4 -10
- package/build/cjs/components/PostInfo/PostInfo.js +4 -4
- package/build/cjs/components/PostInfo/SuggestPostInfo.js +4 -1
- package/build/cjs/components/PostInfo/components/ReadingTime.js +1 -1
- package/build/cjs/components/PostInfo/components/Save.d.ts +4 -6
- package/build/cjs/components/PostInfo/components/Save.js +3 -6
- package/build/cjs/components/PostInfo/components/Sharing.d.ts +3 -5
- package/build/cjs/components/PostInfo/components/Sharing.js +4 -10
- package/build/cjs/components/Posts/Posts.js +3 -3
- package/build/cjs/components/PostsEmpty/PostsEmpty.js +2 -2
- package/build/cjs/components/PostsError/PostsError.js +3 -3
- package/build/cjs/components/PromptSignIn/PromptSignIn.js +2 -2
- package/build/cjs/components/Search/Search.js +1 -1
- package/build/cjs/constants.d.ts +2 -1
- package/build/cjs/constants.js +20 -19
- package/build/cjs/constructor/BlogConstructorProvider.js +1 -0
- package/build/cjs/containers/BlogPostPage/BlogPostPage.css +1 -1
- package/build/cjs/contexts/LocaleContext.js +2 -2
- package/build/cjs/counters/metrika.js +0 -3
- package/build/cjs/counters/utils.d.ts +1 -1
- package/build/cjs/counters/utils.js +7 -7
- package/build/cjs/i18n/index.d.ts +1 -3
- package/build/cjs/i18n/index.js +8 -10
- package/build/cjs/index.d.ts +0 -1
- package/build/cjs/index.js +1 -3
- package/build/cjs/models/common.d.ts +1 -1
- package/build/cjs/models/locale.d.ts +1 -4
- package/build/cjs/models/locale.js +1 -6
- package/build/cjs/utils/common.d.ts +15 -3
- package/build/cjs/utils/common.js +20 -19
- package/build/esm/blocks/Banner/Banner.js +8 -10
- package/build/esm/blocks/CTA/CTA.js +8 -10
- package/build/esm/blocks/Feed/Feed.js +8 -15
- package/build/esm/blocks/Header/Header.js +12 -16
- package/build/esm/blocks/Media/Media.js +1 -0
- package/build/esm/blocks/Meta/Meta.js +13 -17
- package/build/esm/blocks/Suggest/Suggest.js +9 -12
- package/build/esm/components/FeedHeader/components/Controls/Controls.css +19 -5
- package/build/esm/components/FeedHeader/components/Controls/Controls.js +25 -30
- package/build/esm/components/FeedHeader/components/Controls/customRenders.js +2 -2
- package/build/esm/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.css +1 -1
- package/build/esm/components/Paginator/Paginator.js +18 -21
- package/build/esm/components/Paginator/components/NavigationButton.js +2 -2
- package/build/esm/components/PostCard/PostCard.d.ts +3 -6
- package/build/esm/components/PostCard/PostCard.js +2 -2
- package/build/esm/components/PostInfo/PostInfo.d.ts +4 -10
- package/build/esm/components/PostInfo/PostInfo.js +4 -4
- package/build/esm/components/PostInfo/SuggestPostInfo.js +4 -1
- package/build/esm/components/PostInfo/components/ReadingTime.js +2 -2
- package/build/esm/components/PostInfo/components/Save.d.ts +4 -6
- package/build/esm/components/PostInfo/components/Save.js +3 -6
- package/build/esm/components/PostInfo/components/Sharing.d.ts +3 -5
- package/build/esm/components/PostInfo/components/Sharing.js +5 -11
- package/build/esm/components/Posts/Posts.js +4 -4
- package/build/esm/components/PostsEmpty/PostsEmpty.js +3 -3
- package/build/esm/components/PostsError/PostsError.js +4 -4
- package/build/esm/components/PromptSignIn/PromptSignIn.js +3 -3
- package/build/esm/components/Search/Search.js +2 -2
- package/build/esm/constants.d.ts +2 -1
- package/build/esm/constants.js +19 -18
- package/build/esm/constructor/BlogConstructorProvider.js +2 -1
- package/build/esm/containers/BlogPostPage/BlogPostPage.css +1 -1
- package/build/esm/contexts/LocaleContext.js +1 -1
- package/build/esm/counters/metrika.js +0 -3
- package/build/esm/counters/utils.d.ts +1 -1
- package/build/esm/counters/utils.js +6 -6
- package/build/esm/i18n/index.d.ts +1 -3
- package/build/esm/i18n/index.js +7 -9
- package/build/esm/index.d.ts +0 -1
- package/build/esm/index.js +0 -1
- package/build/esm/models/common.d.ts +1 -1
- package/build/esm/models/locale.d.ts +1 -4
- package/build/esm/models/locale.js +0 -5
- package/build/esm/utils/common.d.ts +15 -3
- package/build/esm/utils/common.js +18 -17
- package/package.json +15 -14
- package/server/data/contentFilter.d.ts +1 -1
- package/server/data/contentFilter.js +2 -1
- package/server/data/transformPageContent.d.ts +2 -2
- package/server/data/transformPost.d.ts +7 -2
- package/server/data/transformPost.js +1 -1
- package/server/index.d.ts +1 -1
- package/server/models/common.d.ts +1 -1
- package/server/models/locale.d.ts +1 -4
- package/server/models/locale.js +1 -6
- package/styles/storybook/common.scss +8 -0
- package/styles/storybook/index.scss +1 -1
- package/styles/styles.css +115 -0
- package/styles/styles.scss +1 -0
- package/build/cjs/configure.d.ts +0 -5
- package/build/cjs/configure.js +0 -8
- package/build/esm/configure.d.ts +0 -5
- package/build/esm/configure.js +0 -4
@@ -1,6 +1,6 @@
|
|
1
1
|
import React from 'react';
|
2
2
|
import { Icon } from '@gravity-ui/uikit';
|
3
|
-
import { Keyset,
|
3
|
+
import { Keyset, i18n } from '../../../i18n';
|
4
4
|
import { Time } from '../../../icons/Time';
|
5
5
|
import { block } from '../../../utils/cn';
|
6
6
|
import '../PostInfo.css';
|
@@ -9,4 +9,4 @@ const ICON_SIZE = 16;
|
|
9
9
|
export const ReadingTime = ({ readingTime, size = 's', id, qa }) => (React.createElement("div", { className: b('item', { size }), id: id, "data-qa": qa },
|
10
10
|
React.createElement("span", { className: b('icon') },
|
11
11
|
React.createElement(Icon, { data: Time, size: ICON_SIZE, className: b('icon-color') })),
|
12
|
-
|
12
|
+
i18n(Keyset.ContextReadingTime, { count: readingTime })));
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import React from 'react';
|
2
|
+
import { AnalyticsEventsProp } from '@gravity-ui/page-constructor';
|
2
3
|
import { QAProps } from '../../../models/common';
|
3
4
|
import '../PostInfo.css';
|
4
5
|
type SaveProps = QAProps & {
|
@@ -7,11 +8,8 @@ type SaveProps = QAProps & {
|
|
7
8
|
hasUserLike: boolean;
|
8
9
|
handleUserLike: () => void;
|
9
10
|
theme?: 'light' | 'dark';
|
10
|
-
/**
|
11
|
-
* @deprecated Metrika will be deleted after launch of analyticsEvents
|
12
|
-
*/
|
13
|
-
metrikaGoal?: string;
|
14
11
|
size?: 's' | 'm';
|
12
|
+
analyticsEvents?: AnalyticsEventsProp;
|
15
13
|
};
|
16
14
|
/**
|
17
15
|
* Components for 'save' blog UI-component
|
@@ -19,11 +17,11 @@ type SaveProps = QAProps & {
|
|
19
17
|
* @param title - post title
|
20
18
|
* @param postId - post id
|
21
19
|
* @param hasUserLike - flag what blog has like from current user
|
22
|
-
* @param metrikaGoal - metrika goal name
|
23
20
|
* @param qa - test-attr
|
24
21
|
* @param size - text size
|
22
|
+
* @param analyticsEvents - a single or collection of objects detailing analytics events
|
25
23
|
*
|
26
24
|
* @returns jsx
|
27
25
|
*/
|
28
|
-
export declare const Save: ({ title, postId, hasUserLike, handleUserLike,
|
26
|
+
export declare const Save: ({ title, postId, hasUserLike, handleUserLike, size, theme, qa, analyticsEvents, }: SaveProps) => React.JSX.Element;
|
29
27
|
export {};
|
@@ -2,8 +2,6 @@ import React, { useContext } from 'react';
|
|
2
2
|
import { useAnalytics } from '@gravity-ui/page-constructor';
|
3
3
|
import { Icon } from '@gravity-ui/uikit';
|
4
4
|
import { LikesContext } from '../../../contexts/LikesContext';
|
5
|
-
import metrika from '../../../counters/metrika';
|
6
|
-
import { MetrikaCounter } from '../../../counters/utils';
|
7
5
|
import { Save as SaveIcon } from '../../../icons/Save';
|
8
6
|
import { SaveFilled } from '../../../icons/SaveFilled';
|
9
7
|
import { DefaultEventNames } from '../../../models/common';
|
@@ -18,13 +16,13 @@ const b = block('post-info');
|
|
18
16
|
* @param title - post title
|
19
17
|
* @param postId - post id
|
20
18
|
* @param hasUserLike - flag what blog has like from current user
|
21
|
-
* @param metrikaGoal - metrika goal name
|
22
19
|
* @param qa - test-attr
|
23
20
|
* @param size - text size
|
21
|
+
* @param analyticsEvents - a single or collection of objects detailing analytics events
|
24
22
|
*
|
25
23
|
* @returns jsx
|
26
24
|
*/
|
27
|
-
export const Save = ({ title, postId, hasUserLike, handleUserLike,
|
25
|
+
export const Save = ({ title, postId, hasUserLike, handleUserLike, size, theme, qa, analyticsEvents, }) => {
|
28
26
|
const { toggleLike, isSignedInUser, requireSignIn } = useContext(LikesContext);
|
29
27
|
const handleAnalytics = useAnalytics(DefaultEventNames.SaveButton);
|
30
28
|
const isLikeable = Boolean(toggleLike);
|
@@ -43,8 +41,7 @@ export const Save = ({ title, postId, hasUserLike, handleUserLike, metrikaGoal,
|
|
43
41
|
}
|
44
42
|
postLikeStatus(postId, Boolean(hasUserLike));
|
45
43
|
handleUserLike();
|
46
|
-
|
47
|
-
handleAnalytics();
|
44
|
+
handleAnalytics(analyticsEvents);
|
48
45
|
}, "data-qa": qa },
|
49
46
|
React.createElement("div", { className: b('content', { cursor: isLikeable, theme }) },
|
50
47
|
React.createElement("span", { className: b('icon') },
|
@@ -1,11 +1,9 @@
|
|
1
1
|
import React from 'react';
|
2
|
+
import { AnalyticsEventsProp } from '@gravity-ui/page-constructor';
|
2
3
|
import '../PostInfo.css';
|
3
4
|
type SharingProps = {
|
4
5
|
theme?: 'light' | 'dark';
|
5
|
-
|
6
|
-
* @deprecated Metrika will be deleted after launch of analyticsEvents
|
7
|
-
*/
|
8
|
-
metrikaGoal?: string;
|
6
|
+
analyticsEvents?: AnalyticsEventsProp;
|
9
7
|
};
|
10
|
-
export declare const Sharing: ({ theme,
|
8
|
+
export declare const Sharing: ({ theme, analyticsEvents }: SharingProps) => React.JSX.Element;
|
11
9
|
export {};
|
@@ -4,28 +4,22 @@ import { useAnalytics } from '@gravity-ui/page-constructor';
|
|
4
4
|
import { MobileContext } from '../../../contexts/MobileContext';
|
5
5
|
import { PostPageContext } from '../../../contexts/PostPageContext';
|
6
6
|
import { RouterContext } from '../../../contexts/RouterContext';
|
7
|
-
import
|
8
|
-
import { MetrikaCounter } from '../../../counters/utils';
|
9
|
-
import { Keyset, i18 } from '../../../i18n';
|
7
|
+
import { Keyset, i18n } from '../../../i18n';
|
10
8
|
import { ShareArrowUp } from '../../../icons/ShareArrowUp';
|
11
9
|
import { DefaultEventNames } from '../../../models/common';
|
12
10
|
import { block } from '../../../utils/cn';
|
13
11
|
import { getAbsolutePath } from '../../../utils/common';
|
14
12
|
import '../PostInfo.css';
|
15
13
|
const b = block('post-info');
|
16
|
-
export const Sharing = ({ theme,
|
14
|
+
export const Sharing = ({ theme, analyticsEvents }) => {
|
17
15
|
const router = useContext(RouterContext);
|
18
16
|
const isMobile = useContext(MobileContext);
|
19
17
|
const { shareOptions } = useContext(PostPageContext);
|
20
18
|
const handleAnalyticsGlobal = useAnalytics(DefaultEventNames.ShareButton);
|
21
|
-
const handleMetrika = useCallback(() => {
|
22
|
-
metrika.reachGoal(MetrikaCounter.CrossSite, metrikaGoal);
|
23
|
-
}, [metrikaGoal]);
|
24
19
|
const handleAnalytics = useCallback(() => {
|
25
|
-
handleAnalyticsGlobal();
|
26
|
-
|
27
|
-
}, [handleAnalyticsGlobal, handleMetrika]);
|
20
|
+
handleAnalyticsGlobal(analyticsEvents);
|
21
|
+
}, [analyticsEvents, handleAnalyticsGlobal]);
|
28
22
|
return (React.createElement("div", { className: b('item') },
|
29
23
|
React.createElement("div", { className: b('icon') },
|
30
|
-
React.createElement(SharePopover, { url: getAbsolutePath(router), className: b('share'), iconClass: b('share-icon'), switcherClassName: b('switcher', { theme }), tooltipClassName: b('popup'), useWebShareApi: isMobile, direction: ShareLayoutDirection.Column, buttonTitle:
|
24
|
+
React.createElement(SharePopover, { url: getAbsolutePath(router), className: b('share'), iconClass: b('share-icon'), switcherClassName: b('switcher', { theme }), tooltipClassName: b('popup'), useWebShareApi: isMobile, direction: ShareLayoutDirection.Column, buttonTitle: i18n(Keyset.ActionShare), customIcon: ShareArrowUp, placement: "bottom", openByHover: false, shareOptions: shareOptions, onClick: handleAnalytics }))));
|
31
25
|
};
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import React from 'react';
|
2
2
|
import { CardLayoutBlock } from '@gravity-ui/page-constructor';
|
3
3
|
import { Button } from '@gravity-ui/uikit';
|
4
|
-
import { Keyset,
|
4
|
+
import { Keyset, i18n } from '../../i18n';
|
5
5
|
import { PostCardSize, PostCardTitleHeadingLevel } from '../../models/common';
|
6
6
|
import { block } from '../../utils/cn';
|
7
7
|
import { Paginator } from '../Paginator/Paginator';
|
@@ -22,9 +22,9 @@ export const Posts = ({ containerId, pinnedPostOnPage, currentPage, postsOnPage,
|
|
22
22
|
? PostCardTitleHeadingLevel.H3
|
23
23
|
: PostCardTitleHeadingLevel.H2 }))))) : (React.createElement(PostsEmpty, null))),
|
24
24
|
React.createElement("div", { className: b('pagination') },
|
25
|
-
Boolean(isShowMoreVisible && (postsOnPage === null || postsOnPage === void 0 ? void 0 : postsOnPage.length)) && (React.createElement(Button, { view: "outlined", size: "xl", className: b('more-button'), onClick: handleShowMore },
|
25
|
+
Boolean(isShowMoreVisible && (postsOnPage === null || postsOnPage === void 0 ? void 0 : postsOnPage.length)) && (React.createElement(Button, { view: "outlined", size: "xl", className: b('more-button'), onClick: handleShowMore }, i18n(Keyset.ActionLoadMore))),
|
26
26
|
errorShowMore && (React.createElement("div", { className: b('error-show-more') },
|
27
|
-
React.createElement("div", null,
|
28
|
-
React.createElement("div", null,
|
27
|
+
React.createElement("div", null, i18n(Keyset.ErrorTitle)),
|
28
|
+
React.createElement("div", null, i18n(Keyset.PostLoadError)))),
|
29
29
|
Boolean(currentPage && postCountOnPage) && (React.createElement("div", { className: b('paginator') },
|
30
30
|
React.createElement(Paginator, { onPageChange: handlePageChange, page: currentPage, totalItems: postCountOnPage, itemsPerPage: perPageInQuery, maxPages: Infinity, pageCountForShowSupportButtons: pageCountForShowSupportButtons, queryParams: queryParams }))))));
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import React from 'react';
|
2
|
-
import { Keyset,
|
2
|
+
import { Keyset, i18n } from '../../i18n';
|
3
3
|
import { block } from '../../utils/cn';
|
4
4
|
import './PostsEmpty.css';
|
5
5
|
const b = block('posts-empty');
|
6
6
|
export const PostsEmpty = () => (React.createElement("div", { className: b('container') },
|
7
|
-
React.createElement("div", { className: b('title') },
|
8
|
-
React.createElement("div", { className: b('subtitle') },
|
7
|
+
React.createElement("div", { className: b('title') }, i18n(Keyset.TitleEmptyContainer)),
|
8
|
+
React.createElement("div", { className: b('subtitle') }, i18n(Keyset.ContextEmptyContainer))));
|
@@ -1,14 +1,14 @@
|
|
1
1
|
import React from 'react';
|
2
2
|
import { Button } from '@gravity-ui/uikit';
|
3
|
-
import { Keyset,
|
3
|
+
import { Keyset, i18n } from '../../i18n';
|
4
4
|
import { block } from '../../utils/cn';
|
5
5
|
import './PostError.css';
|
6
6
|
const b = block('posts-error');
|
7
7
|
export const PostsError = ({ onButtonClick }) => {
|
8
8
|
const handleClick = () => (onButtonClick ? onButtonClick() : window.location.reload());
|
9
9
|
return (React.createElement("div", { className: b('container') },
|
10
|
-
React.createElement("div", { className: b('title') },
|
11
|
-
React.createElement("div", { className: b('subtitle') },
|
10
|
+
React.createElement("div", { className: b('title') }, i18n(Keyset.ErrorTitle)),
|
11
|
+
React.createElement("div", { className: b('subtitle') }, i18n(Keyset.PostLoadError)),
|
12
12
|
React.createElement("div", { className: b('button') },
|
13
|
-
React.createElement(Button, { size: "xl", view: "outlined", onClick: handleClick },
|
13
|
+
React.createElement(Button, { size: "xl", view: "outlined", onClick: handleClick }, i18n(Keyset.ActionTryAgain)))));
|
14
14
|
};
|
@@ -1,15 +1,15 @@
|
|
1
1
|
import { __rest } from "tslib";
|
2
2
|
import React from 'react';
|
3
|
-
import { Keyset,
|
3
|
+
import { Keyset, i18n } from '../../i18n';
|
4
4
|
import { Prompt } from '../Prompt/Prompt';
|
5
5
|
/**
|
6
6
|
* Authentication Popup that appears when user action requires login
|
7
7
|
* @returns {JSX|null}
|
8
8
|
*/
|
9
9
|
export const PromptSignIn = (_a) => {
|
10
|
-
var { text =
|
10
|
+
var { text = i18n(Keyset.PromptSignInOnLike), onClickSignIn = () => alert(i18n(Keyset.SignIn)), actions = [
|
11
11
|
{
|
12
|
-
children:
|
12
|
+
children: i18n(Keyset.SignIn),
|
13
13
|
onClick: onClickSignIn,
|
14
14
|
size: 'l',
|
15
15
|
},
|
@@ -2,7 +2,7 @@ import React, { useEffect, useMemo, useRef, useState } from 'react';
|
|
2
2
|
import { Icon, TextInput } from '@gravity-ui/uikit';
|
3
3
|
import lodashDebounce from 'lodash/debounce';
|
4
4
|
import { useIsIPhone } from '../../hooks/useIsIPhone';
|
5
|
-
import { Keyset,
|
5
|
+
import { Keyset, i18n } from '../../i18n';
|
6
6
|
import { Close } from '../../icons/Close';
|
7
7
|
import { SearchIcon } from '../../icons/SearchIcon';
|
8
8
|
import { block } from '../../utils/cn';
|
@@ -17,7 +17,7 @@ const AUTOFOCUS_TIMEOUT = 0;
|
|
17
17
|
*
|
18
18
|
* @returns {JSX|null}
|
19
19
|
*/
|
20
|
-
export const Search = ({ className, initialValue, onSubmit, debounce = 300, placeholder =
|
20
|
+
export const Search = ({ className, initialValue, onSubmit, debounce = 300, placeholder = i18n(Keyset.Search), size = 'm', autoFocus = false, value: externalValue, }) => {
|
21
21
|
const handleChange = lodashDebounce(onSubmit, debounce);
|
22
22
|
const [value, setValue] = useState(initialValue);
|
23
23
|
const inputRef = useRef(null);
|
package/build/esm/constants.d.ts
CHANGED
@@ -9,13 +9,14 @@ export declare const BREAKPOINTS: {
|
|
9
9
|
export declare const DEFAULT_THEME = "light";
|
10
10
|
export declare const UIKIT_ROOT_CLASS = "g-root";
|
11
11
|
export declare const UIKIT_THEME_LIGHT_CLASS: string;
|
12
|
-
export declare enum
|
12
|
+
export declare enum DefaultGoalIds {
|
13
13
|
shareTop = "SITE_BLOG_SHARE-TOP_CLICK",
|
14
14
|
shareBottom = "SITE_BLOG_SHARE-BOTTOM_CLICK",
|
15
15
|
breadcrumbsTop = "SITE_BLOG_BREADCRUMBS-TOP_CLICK",
|
16
16
|
breadcrumbsBottom = "SITE_BLOG_BREADCRUMBS-BOTTOM_CLICK",
|
17
17
|
saveTop = "SITE_BLOG_SAVE-TOP_CLICK",
|
18
18
|
saveBottom = "SITE_BLOG_SAVE-BOTTOM_CLICK",
|
19
|
+
saveSuggest = "SITE_BLOG_SAVE-SUGGEST_CLICK",
|
19
20
|
suggest = "SITE_BLOG_INTERESTING-CARD_CLICK",
|
20
21
|
bannerCommon = "SITE_BLOG_TEXT-BANNER_CLICK",
|
21
22
|
cta = "SITE_BLOG_CTA_CLICK",
|
package/build/esm/constants.js
CHANGED
@@ -9,24 +9,25 @@ export const BREAKPOINTS = {
|
|
9
9
|
export const DEFAULT_THEME = 'light';
|
10
10
|
export const UIKIT_ROOT_CLASS = 'g-root';
|
11
11
|
export const UIKIT_THEME_LIGHT_CLASS = `${UIKIT_ROOT_CLASS}_theme_${DEFAULT_THEME}`;
|
12
|
-
export var
|
13
|
-
(function (
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
12
|
+
export var DefaultGoalIds;
|
13
|
+
(function (DefaultGoalIds) {
|
14
|
+
DefaultGoalIds["shareTop"] = "SITE_BLOG_SHARE-TOP_CLICK";
|
15
|
+
DefaultGoalIds["shareBottom"] = "SITE_BLOG_SHARE-BOTTOM_CLICK";
|
16
|
+
DefaultGoalIds["breadcrumbsTop"] = "SITE_BLOG_BREADCRUMBS-TOP_CLICK";
|
17
|
+
DefaultGoalIds["breadcrumbsBottom"] = "SITE_BLOG_BREADCRUMBS-BOTTOM_CLICK";
|
18
|
+
DefaultGoalIds["saveTop"] = "SITE_BLOG_SAVE-TOP_CLICK";
|
19
|
+
DefaultGoalIds["saveBottom"] = "SITE_BLOG_SAVE-BOTTOM_CLICK";
|
20
|
+
DefaultGoalIds["saveSuggest"] = "SITE_BLOG_SAVE-SUGGEST_CLICK";
|
21
|
+
DefaultGoalIds["suggest"] = "SITE_BLOG_INTERESTING-CARD_CLICK";
|
22
|
+
DefaultGoalIds["bannerCommon"] = "SITE_BLOG_TEXT-BANNER_CLICK";
|
23
|
+
DefaultGoalIds["cta"] = "SITE_BLOG_CTA_CLICK";
|
24
|
+
DefaultGoalIds["tag"] = "SITE_BLOG_THEME-SELECTOR_CLCK";
|
25
|
+
DefaultGoalIds["service"] = "SITE_BLOG_SERVICE-SELECTOR_CLCK";
|
26
|
+
DefaultGoalIds["showMore"] = "SITE_BLOG-PAGINATION_SHOW-MORE_CLCK";
|
27
|
+
DefaultGoalIds["next"] = "SITE_BLOG-PAGINATION_NEXT_CLCK";
|
28
|
+
DefaultGoalIds["home"] = "SITE_BLOG-PAGINATION_HOME_CLCK";
|
29
|
+
DefaultGoalIds["page"] = "SITE_BLOG-PAGINATION_PAGE-NMBR_CLCK";
|
30
|
+
})(DefaultGoalIds || (DefaultGoalIds = {}));
|
30
31
|
export const DEFAULT_PADDINGS = {
|
31
32
|
[PaddingsDirections.bottom]: 'l',
|
32
33
|
[PaddingsDirections.top]: 'xs',
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import React, { Fragment } from 'react';
|
2
|
-
import { AnalyticsContext } from '@gravity-ui/page-constructor';
|
2
|
+
import { AnalyticsContext, ThemeContext, } from '@gravity-ui/page-constructor';
|
3
3
|
import { DEFAULT_THEME } from '../constants';
|
4
4
|
import { DeviceContext } from '../contexts/DeviceContext';
|
5
5
|
import { LocaleContext } from '../contexts/LocaleContext';
|
@@ -10,6 +10,7 @@ import { ThemeValueContext } from '../contexts/theme/ThemeValueContext';
|
|
10
10
|
export const BlogConstructorProvider = ({ isMobile, locale = {}, router = {}, theme = DEFAULT_THEME, device = {}, analytics = {}, settings = {}, children, }) => {
|
11
11
|
const context = [
|
12
12
|
React.createElement(ThemeValueContext.Provider, { value: { themeValue: theme }, key: "theme-context" }),
|
13
|
+
React.createElement(ThemeContext.Provider, { value: { theme: theme }, key: "pc-theme" }),
|
13
14
|
React.createElement(LocaleContext.Provider, { value: { locale }, key: "locale-context" }),
|
14
15
|
React.createElement(RouterContext.Provider, { value: router, key: "router-context" }),
|
15
16
|
React.createElement(MobileContext.Provider, { value: Boolean(isMobile), key: "is-mobile-context" }),
|
@@ -1,6 +1,6 @@
|
|
1
|
-
export var
|
2
|
-
(function (
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
})(
|
1
|
+
export var AnalyticsCounter;
|
2
|
+
(function (AnalyticsCounter) {
|
3
|
+
AnalyticsCounter["Main"] = "main";
|
4
|
+
AnalyticsCounter["CrossSite"] = "cross-site";
|
5
|
+
AnalyticsCounter["Scale"] = "scale";
|
6
|
+
})(AnalyticsCounter || (AnalyticsCounter = {}));
|
@@ -1,5 +1,3 @@
|
|
1
|
-
import { I18N } from '@gravity-ui/i18n';
|
2
|
-
export declare const i18n: I18N;
|
3
1
|
export declare enum Keyset {
|
4
2
|
Title = "title",
|
5
3
|
TitleBreadcrumbs = "title_breadcrumbs",
|
@@ -21,4 +19,4 @@ export declare enum Keyset {
|
|
21
19
|
PromptSignInOnLike = "prompt_sign_in_on_like",
|
22
20
|
SignIn = "Sign In"
|
23
21
|
}
|
24
|
-
export declare const
|
22
|
+
export declare const i18n: (key: Keyset, params?: import("@gravity-ui/i18n").Params | undefined) => string;
|
package/build/esm/i18n/index.js
CHANGED
@@ -1,7 +1,5 @@
|
|
1
|
-
import {
|
2
|
-
|
3
|
-
const KEYSET_NAME = 'blog';
|
4
|
-
export const i18n = new I18N();
|
1
|
+
import { addComponentKeysets } from '@gravity-ui/uikit/i18n';
|
2
|
+
const NAMESPACE = 'blog';
|
5
3
|
export var Keyset;
|
6
4
|
(function (Keyset) {
|
7
5
|
Keyset["Title"] = "title";
|
@@ -24,7 +22,7 @@ export var Keyset;
|
|
24
22
|
Keyset["PromptSignInOnLike"] = "prompt_sign_in_on_like";
|
25
23
|
Keyset["SignIn"] = "Sign In";
|
26
24
|
})(Keyset || (Keyset = {}));
|
27
|
-
|
25
|
+
const en = {
|
28
26
|
[Keyset.Title]: 'Blog',
|
29
27
|
[Keyset.TitleBreadcrumbs]: 'Blog',
|
30
28
|
[Keyset.TitleSuggest]: 'See also',
|
@@ -48,8 +46,8 @@ i18n.registerKeyset(Lang.En, KEYSET_NAME, {
|
|
48
46
|
'{{count}} mins to read',
|
49
47
|
],
|
50
48
|
[Keyset.SignIn]: 'Sign In',
|
51
|
-
}
|
52
|
-
|
49
|
+
};
|
50
|
+
const ru = {
|
53
51
|
[Keyset.Title]: 'Блог',
|
54
52
|
[Keyset.TitleBreadcrumbs]: 'Блог',
|
55
53
|
[Keyset.TitleSuggest]: 'Читать также',
|
@@ -73,5 +71,5 @@ i18n.registerKeyset(Lang.Ru, KEYSET_NAME, {
|
|
73
71
|
'{{count}} минут чтения',
|
74
72
|
],
|
75
73
|
[Keyset.SignIn]: 'Войти',
|
76
|
-
}
|
77
|
-
export const
|
74
|
+
};
|
75
|
+
export const i18n = addComponentKeysets({ en, ru }, NAMESPACE);
|
package/build/esm/index.d.ts
CHANGED
package/build/esm/index.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
import { ReactNode } from 'react';
|
2
|
-
import { MarkdownItPluginCb } from '@
|
2
|
+
import { MarkdownItPluginCb } from '@diplodoc/transform/lib/plugins/typings';
|
3
3
|
import { HeaderBlockProps as PageConstructorHeaderBlockProps } from '@gravity-ui/page-constructor';
|
4
4
|
import { IBrowser, IDevice } from 'ua-parser-js';
|
5
5
|
import { Locale } from '../models/locale';
|
@@ -1,7 +1,8 @@
|
|
1
1
|
/// <reference types="lodash" />
|
2
|
-
import {
|
2
|
+
import { AnalyticsEvent, AnalyticsEventsProp, ContentBlockProps, HeaderBreadCrumbsProps } from '@gravity-ui/page-constructor';
|
3
3
|
import { RouterContextProps } from '../contexts/RouterContext';
|
4
4
|
import { GetPostsRequest, Query, Tag } from '../models/common';
|
5
|
+
import { AnalyticsCounter } from '../counters/utils';
|
5
6
|
export interface QueryParam {
|
6
7
|
name: string;
|
7
8
|
value?: string | number | null;
|
@@ -38,9 +39,20 @@ type GetBreadcrumbsProps = {
|
|
38
39
|
};
|
39
40
|
export declare const getBlogPath: (pathPrefix: string) => string;
|
40
41
|
export declare const getBreadcrumbs: ({ tags, blogPath }: GetBreadcrumbsProps) => HeaderBreadCrumbsProps;
|
41
|
-
export declare const
|
42
|
-
|
42
|
+
export declare const getMergedAnalyticsEvents: (analyticEvents: AnalyticsEventsProp, existringEvents?: AnalyticsEventsProp) => {
|
43
|
+
name: string;
|
44
|
+
type?: string | undefined;
|
45
|
+
counters?: import("@gravity-ui/page-constructor").AnalyticsCounters | undefined;
|
46
|
+
context?: string | undefined;
|
47
|
+
target?: string | undefined;
|
48
|
+
}[];
|
43
49
|
export declare const getFeedQueryParams: (queryString: Query, pageNumber?: number) => GetPostsRequest;
|
44
50
|
export declare const scrollOnPageChange: (containerId: string) => void;
|
45
51
|
export declare const getQaAttributes: (qa?: string, ...customKeys: (string | Array<string>)[]) => Record<string, string>;
|
52
|
+
type PrepareAnalyticsEventArgs = {
|
53
|
+
name: string;
|
54
|
+
counter?: AnalyticsCounter;
|
55
|
+
options?: Record<string, string | number>;
|
56
|
+
};
|
57
|
+
export declare const prepareAnalyticsEvent: ({ name, counter, options, }: PrepareAnalyticsEventArgs) => AnalyticsEvent;
|
46
58
|
export {};
|
@@ -1,12 +1,12 @@
|
|
1
1
|
import { __rest } from "tslib";
|
2
2
|
import { format, parse } from 'url';
|
3
|
-
import { isNewMetrikaFormat, } from '@gravity-ui/page-constructor';
|
4
3
|
import camelCase from 'lodash/camelCase';
|
5
4
|
import debounce from 'lodash/debounce';
|
6
5
|
import flatten from 'lodash/flatten';
|
7
6
|
import memoize from 'lodash/memoize';
|
8
7
|
import { CONTENT_DEFAULT_COL_SIZES, CONTENT_DEFAULT_SIZE, CONTENT_DEFAULT_THEME, DEFAULT_PAGE, DEFAULT_ROWS_PER_PAGE, } from '../blocks/constants';
|
9
|
-
import { Keyset,
|
8
|
+
import { Keyset, i18n } from '../i18n';
|
9
|
+
import { AnalyticsCounter } from '../counters/utils';
|
10
10
|
const QA_ATTRIBUTES_KEYS = ['container', 'content', 'wrapper', 'image', 'button'];
|
11
11
|
export function getAbsolutePath(router, url) {
|
12
12
|
if (!router || !router.pathname) {
|
@@ -54,7 +54,7 @@ export const getBlogPath = (pathPrefix) => {
|
|
54
54
|
};
|
55
55
|
export const getBreadcrumbs = ({ tags, blogPath }) => {
|
56
56
|
const breadcrumbs = {
|
57
|
-
items: [{ text:
|
57
|
+
items: [{ text: i18n(Keyset.TitleBreadcrumbs), url: blogPath }],
|
58
58
|
theme: 'light',
|
59
59
|
};
|
60
60
|
if (tags === null || tags === void 0 ? void 0 : tags.length) {
|
@@ -65,21 +65,19 @@ export const getBreadcrumbs = ({ tags, blogPath }) => {
|
|
65
65
|
}
|
66
66
|
return breadcrumbs;
|
67
67
|
};
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
export const getBlogElementMetrika = (blogCustomGoal, existingGoals) => {
|
72
|
-
if (existingGoals) {
|
73
|
-
if (isNewMetrikaFormat(existingGoals) && !isMetrikaExist(blogCustomGoal, existingGoals)) {
|
74
|
-
const goals = [...existingGoals];
|
75
|
-
goals.push(blogCustomGoal);
|
76
|
-
return goals;
|
77
|
-
}
|
78
|
-
return existingGoals;
|
68
|
+
const getArrayOfEvents = (events) => {
|
69
|
+
if (!events) {
|
70
|
+
return [];
|
79
71
|
}
|
80
|
-
|
81
|
-
return
|
72
|
+
if (Array.isArray(events)) {
|
73
|
+
return events;
|
82
74
|
}
|
75
|
+
return [events];
|
76
|
+
};
|
77
|
+
export const getMergedAnalyticsEvents = (analyticEvents, existringEvents) => {
|
78
|
+
const eventsAsArray = getArrayOfEvents(analyticEvents);
|
79
|
+
const existingAsArray = getArrayOfEvents(existringEvents);
|
80
|
+
return eventsAsArray.concat(existingAsArray);
|
83
81
|
};
|
84
82
|
export const getFeedQueryParams = (queryString, pageNumber) => {
|
85
83
|
const queryParams = getPageSearchParams(queryString);
|
@@ -109,4 +107,7 @@ export const getQaAttributes = (qa, ...customKeys) => {
|
|
109
107
|
attributes.default = qa;
|
110
108
|
}
|
111
109
|
return attributes;
|
112
|
-
};
|
110
|
+
};
|
111
|
+
export const prepareAnalyticsEvent = ({ name, counter = AnalyticsCounter.Main, options = {}, }) => (Object.assign(Object.assign({}, options), { name, counters: {
|
112
|
+
include: [counter],
|
113
|
+
} }));
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@gravity-ui/blog-constructor",
|
3
|
-
"version": "
|
3
|
+
"version": "6.0.0",
|
4
4
|
"description": "Gravity UI Blog Constructor",
|
5
5
|
"license": "MIT",
|
6
6
|
"repository": {
|
@@ -60,8 +60,8 @@
|
|
60
60
|
},
|
61
61
|
"dependencies": {
|
62
62
|
"@bem-react/classname": "^1.6.0",
|
63
|
-
"@gravity-ui/components": "^
|
64
|
-
"@gravity-ui/i18n": "^1.
|
63
|
+
"@gravity-ui/components": "^3.0.0",
|
64
|
+
"@gravity-ui/i18n": "^1.3.0",
|
65
65
|
"lodash": "^4.17.21",
|
66
66
|
"react-helmet": "^6.1.0",
|
67
67
|
"ua-parser-js": "^0.7.28",
|
@@ -70,9 +70,9 @@
|
|
70
70
|
"uuid": "^9.0.1"
|
71
71
|
},
|
72
72
|
"peerDependencies": {
|
73
|
-
"@
|
74
|
-
"@gravity-ui/page-constructor": "^
|
75
|
-
"@gravity-ui/uikit": "^
|
73
|
+
"@diplodoc/transform": "^4.10.7",
|
74
|
+
"@gravity-ui/page-constructor": "^5.0.0",
|
75
|
+
"@gravity-ui/uikit": "^6.1.1",
|
76
76
|
"react": "^16.0.0 || ^17.0.0 || ^18.0.0"
|
77
77
|
},
|
78
78
|
"devDependencies": {
|
@@ -80,19 +80,20 @@
|
|
80
80
|
"@babel/preset-react": "^7.22.5",
|
81
81
|
"@babel/preset-typescript": "^7.22.5",
|
82
82
|
"@commitlint/config-conventional": "^17.4.3",
|
83
|
-
"@
|
83
|
+
"@diplodoc/transform": "^4.10.8",
|
84
84
|
"@gravity-ui/eslint-config": "^3.1.1",
|
85
|
-
"@gravity-ui/page-constructor": "^
|
85
|
+
"@gravity-ui/page-constructor": "^5.1.0",
|
86
86
|
"@gravity-ui/prettier-config": "^1.1.0",
|
87
87
|
"@gravity-ui/stylelint-config": "^4.0.1",
|
88
88
|
"@gravity-ui/tsconfig": "^1.0.0",
|
89
|
-
"@gravity-ui/uikit": "^
|
89
|
+
"@gravity-ui/uikit": "^6.2.0",
|
90
90
|
"@jest/environment": "^29.7.0",
|
91
|
-
"@storybook/addon-essentials": "^7.
|
92
|
-
"@storybook/
|
91
|
+
"@storybook/addon-essentials": "^7.6.17",
|
92
|
+
"@storybook/addon-mdx-gfm": "^7.6.17",
|
93
|
+
"@storybook/cli": "^7.6.17",
|
93
94
|
"@storybook/preset-scss": "^1.0.3",
|
94
|
-
"@storybook/react": "^7.
|
95
|
-
"@storybook/react-webpack5": "^7.
|
95
|
+
"@storybook/react": "^7.6.17",
|
96
|
+
"@storybook/react-webpack5": "^7.6.17",
|
96
97
|
"@testing-library/dom": "^9.3.3",
|
97
98
|
"@testing-library/jest-dom": "^5.16.5",
|
98
99
|
"@testing-library/react": "^14.0.0",
|
@@ -127,7 +128,7 @@
|
|
127
128
|
"rimraf": "^3.0.2",
|
128
129
|
"sass": "^1.54.4",
|
129
130
|
"sass-loader": "^13.3.1",
|
130
|
-
"storybook": "^7.
|
131
|
+
"storybook": "^7.6.17",
|
131
132
|
"stylelint": "^15.11.0",
|
132
133
|
"ts-jest": "^29.0.5",
|
133
134
|
"typescript": "^4.9.3"
|