@gravity-ui/blog-constructor 9.1.0 → 9.1.2-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/README.md +1 -1
- package/build/cjs/blocks/Feed/Feed.js +4 -14
- package/build/cjs/blocks/Feed/Feed.js.map +1 -1
- package/build/cjs/components/FeedHeader/FeedHeader.d.ts +1 -1
- package/build/cjs/components/FeedHeader/FeedHeader.js +2 -2
- package/build/cjs/components/FeedHeader/FeedHeader.js.map +1 -1
- package/build/cjs/components/FeedHeader/components/Controls/Controls.d.ts +3 -10
- package/build/cjs/components/FeedHeader/components/Controls/Controls.js +37 -59
- package/build/cjs/components/FeedHeader/components/Controls/Controls.js.map +1 -1
- package/build/cjs/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.d.ts +1 -1
- package/build/cjs/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.js.map +1 -1
- package/build/cjs/components/Search/Search.js +3 -1
- package/build/cjs/components/Search/Search.js.map +1 -1
- package/build/cjs/containers/BlogPage/BlogPage.d.ts +3 -4
- package/build/cjs/containers/BlogPage/BlogPage.js +2 -3
- package/build/cjs/containers/BlogPage/BlogPage.js.map +1 -1
- package/build/cjs/contexts/FeedContext.d.ts +2 -3
- package/build/cjs/contexts/FeedContext.js.map +1 -1
- package/build/cjs/models/common.d.ts +13 -9
- package/build/cjs/models/common.js.map +1 -1
- package/build/cjs/utils/common.d.ts +2 -2
- package/build/cjs/utils/common.js +13 -4
- package/build/cjs/utils/common.js.map +1 -1
- package/build/esm/blocks/Feed/Feed.js +4 -14
- package/build/esm/blocks/Feed/Feed.js.map +1 -1
- package/build/esm/components/FeedHeader/FeedHeader.d.ts +1 -1
- package/build/esm/components/FeedHeader/FeedHeader.js +2 -2
- package/build/esm/components/FeedHeader/FeedHeader.js.map +1 -1
- package/build/esm/components/FeedHeader/components/Controls/Controls.d.ts +3 -10
- package/build/esm/components/FeedHeader/components/Controls/Controls.js +38 -60
- package/build/esm/components/FeedHeader/components/Controls/Controls.js.map +1 -1
- package/build/esm/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.d.ts +1 -1
- package/build/esm/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.js.map +1 -1
- package/build/esm/components/Search/Search.js +3 -1
- package/build/esm/components/Search/Search.js.map +1 -1
- package/build/esm/containers/BlogPage/BlogPage.d.ts +3 -4
- package/build/esm/containers/BlogPage/BlogPage.js +2 -3
- package/build/esm/containers/BlogPage/BlogPage.js.map +1 -1
- package/build/esm/contexts/FeedContext.d.ts +2 -3
- package/build/esm/contexts/FeedContext.js.map +1 -1
- package/build/esm/models/common.d.ts +13 -9
- package/build/esm/models/common.js.map +1 -1
- package/build/esm/utils/common.d.ts +2 -2
- package/build/esm/utils/common.js +13 -4
- package/build/esm/utils/common.js.map +1 -1
- package/package.json +1 -1
- package/server/models/common.d.ts +13 -9
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { MarkdownItPluginCb } from '@diplodoc/transform/lib/plugins/typings';
|
|
3
3
|
import { HeaderBlockProps as PageConstructorHeaderBlockProps } from '@gravity-ui/page-constructor';
|
|
4
|
+
import { SelectOption, SelectProps } from '@gravity-ui/uikit';
|
|
4
5
|
import { IBrowser, IDevice } from 'ua-parser-js';
|
|
5
6
|
import { Locale } from "./locale.js";
|
|
6
7
|
export declare enum Theme {
|
|
@@ -23,13 +24,6 @@ export type Author = {
|
|
|
23
24
|
} & {
|
|
24
25
|
[x: string]: string | null;
|
|
25
26
|
};
|
|
26
|
-
export type Service = {
|
|
27
|
-
id: number | string;
|
|
28
|
-
slug: string;
|
|
29
|
-
name: string;
|
|
30
|
-
} & {
|
|
31
|
-
[x: string]: string | null;
|
|
32
|
-
};
|
|
33
27
|
export type Query = Record<string, number | string | null>;
|
|
34
28
|
export interface Menu {
|
|
35
29
|
title: string;
|
|
@@ -143,12 +137,11 @@ export interface HeaderBlockProps extends PageConstructorHeaderBlockProps {
|
|
|
143
137
|
};
|
|
144
138
|
}
|
|
145
139
|
export type GetPostsRequest = {
|
|
146
|
-
tags: string | undefined;
|
|
147
140
|
page: number;
|
|
148
141
|
perPage: number;
|
|
149
142
|
savedOnly: boolean;
|
|
150
143
|
search: string | undefined;
|
|
151
|
-
|
|
144
|
+
[filterParam: string]: string | number | boolean | undefined;
|
|
152
145
|
};
|
|
153
146
|
export type GetPostsType = (query: GetPostsRequest) => Promise<PostsProps>;
|
|
154
147
|
export type HandleChangeQueryParams = (params: Query) => void;
|
|
@@ -170,6 +163,17 @@ export type FetchArgs = {
|
|
|
170
163
|
export interface QAProps {
|
|
171
164
|
qa?: string;
|
|
172
165
|
}
|
|
166
|
+
export type SelectItem = SelectOption;
|
|
167
|
+
export type FilterConfig = Pick<SelectProps, 'multiple' | 'filterable' | 'hasClear' | 'placeholder'> & {
|
|
168
|
+
/** The key used in queryParams and passed to handleLoadData query */
|
|
169
|
+
queryParamName: string;
|
|
170
|
+
/** The selectable items for this filter */
|
|
171
|
+
items: SelectItem[];
|
|
172
|
+
/** Label shown when nothing is selected (acts as "All ..." placeholder) */
|
|
173
|
+
allLabel: string;
|
|
174
|
+
/** Optional QA attribute forwarded to the switcher */
|
|
175
|
+
qa?: string;
|
|
176
|
+
};
|
|
173
177
|
export declare enum PostCardSize {
|
|
174
178
|
SMALL = "s",
|
|
175
179
|
MEDIUM = "m"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"../../../src","sources":["models/common.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"../../../src","sources":["models/common.ts"],"names":[],"mappings":";;;AAUA,IAAY,KAGX;AAHD,WAAY,KAAK;IACb,wBAAe,CAAA;IACf,sBAAa,CAAA;AACjB,CAAC,EAHW,KAAK,qBAAL,KAAK,QAGhB;AAmFD,IAAY,SAgBX;AAhBD,WAAY,SAAS;IACjB,yCAA4B,CAAA;IAC5B,mCAAsB,CAAA;IACtB,yCAA4B,CAAA;IAC5B,uCAA0B,CAAA;IAC1B,yCAA4B,CAAA;IAC5B,mCAAsB,CAAA;IACtB,oDAAuC,CAAA;IACvC,yCAA4B,CAAA;IAC5B,2CAA8B,CAAA;IAC9B,qCAAwB,CAAA;IACxB,qCAAwB,CAAA;IACxB,qCAAwB,CAAA;IACxB,sDAAyC,CAAA;IACzC,qCAAwB,CAAA;IACxB,uDAA0C,CAAA;AAC9C,CAAC,EAhBW,SAAS,yBAAT,SAAS,QAgBpB;AA8DD,IAAY,iBAUX;AAVD,WAAY,iBAAiB;IACzB,uDAAkC,CAAA;IAClC,qDAAgC,CAAA;IAChC,wDAAmC,CAAA;IACnC,kEAA6C,CAAA;IAC7C,kEAA6C,CAAA;IAC7C,kEAA6C,CAAA;IAC7C,+CAA0B,CAAA;IAC1B,uDAAkC,CAAA;IAClC,wDAAmC,CAAA;AACvC,CAAC,EAVW,iBAAiB,iCAAjB,iBAAiB,QAU5B;AA2BD,IAAY,YAGX;AAHD,WAAY,YAAY;IACpB,2BAAW,CAAA;IACX,4BAAY,CAAA;AAChB,CAAC,EAHW,YAAY,4BAAZ,YAAY,QAGvB;AAED,IAAY,yBAGX;AAHD,WAAY,yBAAyB;IACjC,sCAAS,CAAA;IACT,sCAAS,CAAA;AACb,CAAC,EAHW,yBAAyB,yCAAzB,yBAAyB,QAGpC","sourcesContent":["import * as React from 'react';\n\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport {MarkdownItPluginCb} from '@diplodoc/transform/lib/plugins/typings';\nimport {HeaderBlockProps as PageConstructorHeaderBlockProps} from '@gravity-ui/page-constructor';\nimport {SelectOption, SelectProps} from '@gravity-ui/uikit';\nimport {IBrowser, IDevice} from 'ua-parser-js';\n\nimport {Locale} from '../models/locale';\n\nexport enum Theme {\n Light = 'light',\n Dark = 'dark',\n}\n\nexport interface ClassNameProps {\n className?: string;\n}\n\nexport type Author = {\n id: number | string;\n avatar: string | null;\n createdAt: string;\n updatedAt: string;\n firstName: string | null;\n secondName: string | null;\n description: string | null;\n fullDescription: string | null;\n shortDescription: string | null;\n} & {\n [x: string]: string | null;\n};\n\nexport type Query = Record<string, number | string | null>;\n\n//page models\n\nexport interface Menu {\n title: string;\n}\n\nexport interface WithDeviceProps {\n device: IDevice;\n browser: IBrowser;\n isRobot: boolean;\n}\n\nexport interface PostsProps {\n posts: PostData[];\n count: number;\n totalCount: number;\n pinnedPost?: PostData;\n}\n\nexport type Tag = {\n slug: string;\n name: string;\n createdAt?: string;\n updatedAt?: string;\n icon?: string;\n isDeleted?: boolean;\n locale?: string;\n blogTagId?: number | string;\n count?: number;\n};\n\nexport interface PostData {\n author?: string;\n authors?: Author[];\n blogPostId?: number | string;\n content?: string;\n date: string;\n description?: string;\n hasUserLike: boolean;\n htmlTitle: string;\n id: number;\n image: string;\n isPublished?: boolean;\n sharedImage?: string;\n likes: number;\n locale: Locale;\n metaDescription?: string | null;\n metaTitle?: string | null;\n readingTime?: number;\n shareDescription?: string;\n shareImage?: string;\n shareTitle?: string;\n slug: string;\n keywords?: string[];\n tags: Tag[];\n textTitle: string;\n title: string;\n url: string;\n noIndex?: boolean;\n}\n\nexport enum BlockType {\n Header = 'blog-header-block',\n YFM = 'blog-yfm-block',\n Layout = 'blog-layout-block',\n Media = 'blog-media-block',\n Banner = 'blog-banner-block',\n CTA = 'blog-cta-block',\n ColoredText = 'blog-colored-text-block',\n Author = 'blog-author-block',\n Suggest = 'blog-suggest-block',\n Meta = 'blog-meta-block',\n Feed = 'blog-feed-block',\n Form = 'blog-form-block',\n CompactMedia = 'blog-compact-media-block',\n Take = 'blog-take-block',\n SideCardList = 'blog-side-card-list-block',\n}\n\nexport type MetaProps = {\n metaComponent: JSX.Element;\n needHelmetWrapper: boolean;\n};\n\nexport type MetaOrganizationType = {\n url: string;\n appTitle: string;\n legalName: string;\n supportEmail: string;\n};\n\nexport interface PostMetaProps {\n title: string;\n date: string;\n image: string;\n canonicalUrl: string;\n content?: string;\n description?: string;\n sharing: {\n shareTitle: string;\n shareDescription: string;\n shareImage: string;\n shareGenImage: string;\n shareGenTitle: string;\n };\n keywords?: string[];\n noIndex?: boolean;\n authors?: Author[];\n tags?: Tag[];\n organization: MetaOrganizationType;\n}\n\nexport type ToggleLikeCallbackType = ({\n postId,\n hasLike,\n}: {\n postId?: number | string;\n hasLike?: boolean;\n}) => void;\n\nexport interface HeaderBlockProps extends PageConstructorHeaderBlockProps {\n backLink?: {\n url: string;\n title: React.ReactNode;\n };\n}\n\nexport type GetPostsRequest = {\n page: number;\n perPage: number;\n savedOnly: boolean;\n search: string | undefined;\n [filterParam: string]: string | number | boolean | undefined;\n};\n\nexport type GetPostsType = (query: GetPostsRequest) => Promise<PostsProps>;\n\nexport type HandleChangeQueryParams = (params: Query) => void;\n\nexport enum DefaultEventNames {\n ShareButton = 'share-button-click',\n SaveButton = 'save-button-click',\n ShowMore = 'show-more-button-click',\n PaginatorHome = 'paginator-home-button-click',\n PaginatorNext = 'paginator-next-button-click',\n PaginatorPage = 'paginator-page-button-click',\n Tag = 'selector-tag-click',\n Service = 'selector-service-click',\n SaveOnly = 'save-only-button-click',\n}\n\nexport type FetchArgs = {\n page?: number;\n query: Query;\n};\n\nexport interface QAProps {\n qa?: string;\n}\n\nexport type SelectItem = SelectOption;\n\nexport type FilterConfig = Pick<\n SelectProps,\n 'multiple' | 'filterable' | 'hasClear' | 'placeholder'\n> & {\n /** The key used in queryParams and passed to handleLoadData query */\n queryParamName: string;\n /** The selectable items for this filter */\n items: SelectItem[];\n /** Label shown when nothing is selected (acts as \"All ...\" placeholder) */\n allLabel: string;\n /** Optional QA attribute forwarded to the switcher */\n qa?: string;\n};\n\nexport enum PostCardSize {\n SMALL = 's',\n MEDIUM = 'm',\n}\n\nexport enum PostCardTitleHeadingLevel {\n H2 = 'h2',\n H3 = 'h3',\n}\n\nexport interface TransformPostOptions {\n plugins?: MarkdownItPluginCb[];\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AnalyticsEvent, AnalyticsEventsProp, ContentBlockProps, HeaderBreadCrumbsProps } from '@gravity-ui/page-constructor';
|
|
2
2
|
import { RouterContextProps } from "../contexts/RouterContext.js";
|
|
3
3
|
import { AnalyticsCounter } from "../counters/utils.js";
|
|
4
|
-
import { GetPostsRequest, Query, Tag } from "../models/common.js";
|
|
4
|
+
import { FilterConfig, GetPostsRequest, Query, Tag } from "../models/common.js";
|
|
5
5
|
export interface QueryParam {
|
|
6
6
|
name: string;
|
|
7
7
|
value?: string | number | null;
|
|
@@ -47,7 +47,7 @@ export declare const getMergedAnalyticsEvents: (analyticEvents: AnalyticsEventsP
|
|
|
47
47
|
context?: string;
|
|
48
48
|
target?: string;
|
|
49
49
|
}[];
|
|
50
|
-
export declare const getFeedQueryParams: (queryString: Query, pageNumber?: number) => GetPostsRequest;
|
|
50
|
+
export declare const getFeedQueryParams: (queryString: Query, pageNumber?: number, filters?: FilterConfig[]) => GetPostsRequest;
|
|
51
51
|
export declare const scrollOnPageChange: (containerId: string) => void;
|
|
52
52
|
export declare const getQaAttributes: (qa?: string, ...customKeys: (string | Array<string>)[]) => Record<string, string>;
|
|
53
53
|
type PrepareAnalyticsEventArgs = {
|
|
@@ -89,15 +89,24 @@ const getMergedAnalyticsEvents = (analyticEvents, existringEvents) => {
|
|
|
89
89
|
return eventsAsArray.concat(existingAsArray);
|
|
90
90
|
};
|
|
91
91
|
exports.getMergedAnalyticsEvents = getMergedAnalyticsEvents;
|
|
92
|
-
const getFeedQueryParams = (queryString, pageNumber) => {
|
|
92
|
+
const getFeedQueryParams = (queryString, pageNumber, filters) => {
|
|
93
93
|
const queryParams = (0, exports.getPageSearchParams)(queryString);
|
|
94
|
-
const tags = queryParams.get('tags') || undefined;
|
|
95
94
|
const page = pageNumber || Number(queryParams.get('page') || constants_1.DEFAULT_PAGE);
|
|
96
95
|
const perPage = Number(queryParams.get('perPage') || constants_1.DEFAULT_ROWS_PER_PAGE);
|
|
97
96
|
const savedOnly = queryParams.get('savedOnly') === 'true';
|
|
98
97
|
const search = queryParams.get('search') || undefined;
|
|
99
|
-
const
|
|
100
|
-
|
|
98
|
+
const filterParams = {};
|
|
99
|
+
if (filters === null || filters === void 0 ? void 0 : filters.length) {
|
|
100
|
+
filters.forEach(({ queryParamName }) => {
|
|
101
|
+
filterParams[queryParamName] = queryParams.get(queryParamName) || undefined;
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// fallback: preserve legacy tags/services keys if no filters config provided
|
|
106
|
+
filterParams['tags'] = queryParams.get('tags') || undefined;
|
|
107
|
+
filterParams['services'] = queryParams.get('services') || undefined;
|
|
108
|
+
}
|
|
109
|
+
return Object.assign({ page, perPage, savedOnly, search }, filterParams);
|
|
101
110
|
};
|
|
102
111
|
exports.getFeedQueryParams = getFeedQueryParams;
|
|
103
112
|
const scrollOnPageChange = (containerId) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"../../../src","sources":["utils/common.ts"],"names":[],"mappings":"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","sourcesContent":["import {format, parse} from 'url';\n\nimport {\n AnalyticsEvent,\n AnalyticsEventsProp,\n ContentBlockProps,\n HeaderBreadCrumbsProps,\n} from '@gravity-ui/page-constructor';\nimport camelCase from 'lodash/camelCase';\nimport debounce from 'lodash/debounce';\nimport flatten from 'lodash/flatten';\nimport memoize from 'lodash/memoize';\n\nimport {\n CONTENT_DEFAULT_COL_SIZES,\n CONTENT_DEFAULT_SIZE,\n CONTENT_DEFAULT_THEME,\n DEFAULT_PAGE,\n DEFAULT_ROWS_PER_PAGE,\n} from '../blocks/constants';\nimport {RouterContextProps} from '../contexts/RouterContext';\nimport {AnalyticsCounter} from '../counters/utils';\nimport {Keyset, i18n} from '../i18n';\nimport {GetPostsRequest, Query, Tag} from '../models/common';\n\nconst QA_ATTRIBUTES_KEYS = ['container', 'content', 'wrapper', 'image', 'button'];\n\nexport interface QueryParam {\n name: string;\n value?: string | number | null;\n}\n\nexport interface RouterActionOptions {\n shallow?: boolean;\n}\n\nexport function getAbsolutePath(router: RouterContextProps, url?: string) {\n if (!router || !router.pathname) {\n return url ?? '';\n }\n\n const parsed = parse(url || router.as || '');\n\n return format({\n ...parsed,\n protocol: parsed.protocol || 'https',\n hostname: parsed.hostname || router.hostname,\n pathname: parsed.pathname || router.pathname,\n });\n}\n\nexport const getPageSearchParams = (query: Query = {}) => {\n const searchParams = new URLSearchParams();\n\n Object.entries(query).forEach(([key, value]) => {\n searchParams.set(key, String(value));\n });\n\n return searchParams;\n};\n\nexport const scrollToHash = (hash: string, browser?: string) => {\n if (!hash) {\n return;\n }\n\n const element = document.getElementById(hash);\n\n if (!element) {\n return;\n }\n\n setTimeout(\n () => element.scrollIntoView({behavior: browser === 'Yandex' ? 'auto' : 'smooth'}),\n 0,\n );\n};\n\ntype CloudListTagStub = {};\n\nexport const getTags = memoize((tags: Tag[], blogPath: string) => {\n return tags.map(({slug, ...tag}) => {\n const queryParams = new URLSearchParams();\n queryParams.set('tags', slug);\n\n return {\n ...tag,\n id: slug,\n url: `${blogPath}?${queryParams}`,\n } as CloudListTagStub;\n });\n});\n\nconst stub = (postId: number | string) => postId;\n\nexport const postLikeStatus = debounce((postId: number | string, hasUserLike: boolean) => {\n (hasUserLike ? stub : stub)(postId);\n}, 300);\n\nexport const updateContentSizes = ({size, colSizes, theme, ...contentData}: ContentBlockProps) => ({\n ...contentData,\n size: size || CONTENT_DEFAULT_SIZE,\n colSizes: colSizes || CONTENT_DEFAULT_COL_SIZES,\n theme: theme || CONTENT_DEFAULT_THEME,\n});\n\ntype GetBreadcrumbsProps = {\n tags?: Tag[];\n blogPath: string;\n};\n\nexport const getBlogPath = (pathPrefix: string) => {\n const prefix = pathPrefix ? `/${pathPrefix}` : '';\n return `${prefix}/blog`;\n};\n\nexport function getBreadcrumbs({tags, blogPath}: GetBreadcrumbsProps) {\n const breadcrumbs: HeaderBreadCrumbsProps = {\n items: [{text: i18n(Keyset.TitleBreadcrumbs), url: blogPath}],\n theme: 'light',\n };\n\n if (tags?.length) {\n const localizedTags = getTags(tags, blogPath);\n const tag = localizedTags[0];\n // @ts-ignore todo fix\n breadcrumbs.items.push({text: tag.name, url: tag.url});\n }\n\n return breadcrumbs;\n}\n\nconst getArrayOfEvents = (events?: AnalyticsEventsProp) => {\n if (!events) {\n return [];\n }\n\n if (Array.isArray(events)) {\n return events;\n }\n\n return [events];\n};\n\nexport const getMergedAnalyticsEvents = (\n analyticEvents: AnalyticsEventsProp,\n existringEvents?: AnalyticsEventsProp,\n) => {\n const eventsAsArray = getArrayOfEvents(analyticEvents);\n const existingAsArray = getArrayOfEvents(existringEvents);\n\n return eventsAsArray.concat(existingAsArray);\n};\n\nexport const getFeedQueryParams = (queryString: Query, pageNumber?: number): GetPostsRequest => {\n const queryParams = getPageSearchParams(queryString);\n const tags = queryParams.get('tags') || undefined;\n const page = pageNumber || Number(queryParams.get('page') || DEFAULT_PAGE);\n const perPage = Number(queryParams.get('perPage') || DEFAULT_ROWS_PER_PAGE);\n const savedOnly = queryParams.get('savedOnly') === 'true';\n const search = queryParams.get('search') || undefined;\n const serviceIds = queryParams.get('services') || undefined;\n\n return {tags, page, perPage, savedOnly, search, services: serviceIds};\n};\n\nexport const scrollOnPageChange = (containerId: string) => {\n const cardsContainerEl = document.getElementById(containerId);\n const y = cardsContainerEl?.getBoundingClientRect()?.y || 0;\n\n if (y < 0) {\n scrollToHash(containerId);\n }\n};\n\nexport const getQaAttributes = (qa?: string, ...customKeys: (string | Array<string>)[]) => {\n const attributes: Record<string, string> = {};\n\n if (qa) {\n const keys = QA_ATTRIBUTES_KEYS.concat(flatten(customKeys));\n\n keys.forEach((key) => {\n attributes[camelCase(key)] = `${qa}-${key}`;\n });\n\n attributes.default = qa;\n }\n\n return attributes;\n};\n\ntype PrepareAnalyticsEventArgs = {\n name: string;\n counter?: AnalyticsCounter;\n options?: Record<string, string | number>;\n};\n\nexport const prepareAnalyticsEvent = ({\n name,\n counter = AnalyticsCounter.Main,\n options = {},\n}: PrepareAnalyticsEventArgs): AnalyticsEvent => ({\n ...options,\n name,\n counters: {\n include: [counter],\n },\n});\n"]}
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"../../../src","sources":["utils/common.ts"],"names":[],"mappings":"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","sourcesContent":["import {format, parse} from 'url';\n\nimport {\n AnalyticsEvent,\n AnalyticsEventsProp,\n ContentBlockProps,\n HeaderBreadCrumbsProps,\n} from '@gravity-ui/page-constructor';\nimport camelCase from 'lodash/camelCase';\nimport debounce from 'lodash/debounce';\nimport flatten from 'lodash/flatten';\nimport memoize from 'lodash/memoize';\n\nimport {\n CONTENT_DEFAULT_COL_SIZES,\n CONTENT_DEFAULT_SIZE,\n CONTENT_DEFAULT_THEME,\n DEFAULT_PAGE,\n DEFAULT_ROWS_PER_PAGE,\n} from '../blocks/constants';\nimport {RouterContextProps} from '../contexts/RouterContext';\nimport {AnalyticsCounter} from '../counters/utils';\nimport {Keyset, i18n} from '../i18n';\nimport {FilterConfig, GetPostsRequest, Query, Tag} from '../models/common';\n\nconst QA_ATTRIBUTES_KEYS = ['container', 'content', 'wrapper', 'image', 'button'];\n\nexport interface QueryParam {\n name: string;\n value?: string | number | null;\n}\n\nexport interface RouterActionOptions {\n shallow?: boolean;\n}\n\nexport function getAbsolutePath(router: RouterContextProps, url?: string) {\n if (!router || !router.pathname) {\n return url ?? '';\n }\n\n const parsed = parse(url || router.as || '');\n\n return format({\n ...parsed,\n protocol: parsed.protocol || 'https',\n hostname: parsed.hostname || router.hostname,\n pathname: parsed.pathname || router.pathname,\n });\n}\n\nexport const getPageSearchParams = (query: Query = {}) => {\n const searchParams = new URLSearchParams();\n\n Object.entries(query).forEach(([key, value]) => {\n searchParams.set(key, String(value));\n });\n\n return searchParams;\n};\n\nexport const scrollToHash = (hash: string, browser?: string) => {\n if (!hash) {\n return;\n }\n\n const element = document.getElementById(hash);\n\n if (!element) {\n return;\n }\n\n setTimeout(\n () => element.scrollIntoView({behavior: browser === 'Yandex' ? 'auto' : 'smooth'}),\n 0,\n );\n};\n\ntype CloudListTagStub = {};\n\nexport const getTags = memoize((tags: Tag[], blogPath: string) => {\n return tags.map(({slug, ...tag}) => {\n const queryParams = new URLSearchParams();\n queryParams.set('tags', slug);\n\n return {\n ...tag,\n id: slug,\n url: `${blogPath}?${queryParams}`,\n } as CloudListTagStub;\n });\n});\n\nconst stub = (postId: number | string) => postId;\n\nexport const postLikeStatus = debounce((postId: number | string, hasUserLike: boolean) => {\n (hasUserLike ? stub : stub)(postId);\n}, 300);\n\nexport const updateContentSizes = ({size, colSizes, theme, ...contentData}: ContentBlockProps) => ({\n ...contentData,\n size: size || CONTENT_DEFAULT_SIZE,\n colSizes: colSizes || CONTENT_DEFAULT_COL_SIZES,\n theme: theme || CONTENT_DEFAULT_THEME,\n});\n\ntype GetBreadcrumbsProps = {\n tags?: Tag[];\n blogPath: string;\n};\n\nexport const getBlogPath = (pathPrefix: string) => {\n const prefix = pathPrefix ? `/${pathPrefix}` : '';\n return `${prefix}/blog`;\n};\n\nexport function getBreadcrumbs({tags, blogPath}: GetBreadcrumbsProps) {\n const breadcrumbs: HeaderBreadCrumbsProps = {\n items: [{text: i18n(Keyset.TitleBreadcrumbs), url: blogPath}],\n theme: 'light',\n };\n\n if (tags?.length) {\n const localizedTags = getTags(tags, blogPath);\n const tag = localizedTags[0];\n // @ts-ignore todo fix\n breadcrumbs.items.push({text: tag.name, url: tag.url});\n }\n\n return breadcrumbs;\n}\n\nconst getArrayOfEvents = (events?: AnalyticsEventsProp) => {\n if (!events) {\n return [];\n }\n\n if (Array.isArray(events)) {\n return events;\n }\n\n return [events];\n};\n\nexport const getMergedAnalyticsEvents = (\n analyticEvents: AnalyticsEventsProp,\n existringEvents?: AnalyticsEventsProp,\n) => {\n const eventsAsArray = getArrayOfEvents(analyticEvents);\n const existingAsArray = getArrayOfEvents(existringEvents);\n\n return eventsAsArray.concat(existingAsArray);\n};\n\nexport const getFeedQueryParams = (\n queryString: Query,\n pageNumber?: number,\n filters?: FilterConfig[],\n): GetPostsRequest => {\n const queryParams = getPageSearchParams(queryString);\n const page = pageNumber || Number(queryParams.get('page') || DEFAULT_PAGE);\n const perPage = Number(queryParams.get('perPage') || DEFAULT_ROWS_PER_PAGE);\n const savedOnly = queryParams.get('savedOnly') === 'true';\n const search = queryParams.get('search') || undefined;\n\n const filterParams: Record<string, string | undefined> = {};\n\n if (filters?.length) {\n filters.forEach(({queryParamName}) => {\n filterParams[queryParamName] = queryParams.get(queryParamName) || undefined;\n });\n } else {\n // fallback: preserve legacy tags/services keys if no filters config provided\n filterParams['tags'] = queryParams.get('tags') || undefined;\n filterParams['services'] = queryParams.get('services') || undefined;\n }\n\n return {page, perPage, savedOnly, search, ...filterParams};\n};\n\nexport const scrollOnPageChange = (containerId: string) => {\n const cardsContainerEl = document.getElementById(containerId);\n const y = cardsContainerEl?.getBoundingClientRect()?.y || 0;\n\n if (y < 0) {\n scrollToHash(containerId);\n }\n};\n\nexport const getQaAttributes = (qa?: string, ...customKeys: (string | Array<string>)[]) => {\n const attributes: Record<string, string> = {};\n\n if (qa) {\n const keys = QA_ATTRIBUTES_KEYS.concat(flatten(customKeys));\n\n keys.forEach((key) => {\n attributes[camelCase(key)] = `${qa}-${key}`;\n });\n\n attributes.default = qa;\n }\n\n return attributes;\n};\n\ntype PrepareAnalyticsEventArgs = {\n name: string;\n counter?: AnalyticsCounter;\n options?: Record<string, string | number>;\n};\n\nexport const prepareAnalyticsEvent = ({\n name,\n counter = AnalyticsCounter.Main,\n options = {},\n}: PrepareAnalyticsEventArgs): AnalyticsEvent => ({\n ...options,\n name,\n counters: {\n include: [counter],\n },\n});\n"]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import { useAnalytics } from '@gravity-ui/page-constructor';
|
|
4
|
-
import { Icon } from '@gravity-ui/uikit';
|
|
5
4
|
import { FeedHeader } from "../../components/FeedHeader/FeedHeader.js";
|
|
6
5
|
import { Posts } from "../../components/Posts/Posts.js";
|
|
7
6
|
import { PostsError } from "../../components/PostsError/PostsError.js";
|
|
@@ -18,7 +17,7 @@ const PAGE_QUERY = 'page';
|
|
|
18
17
|
const FIRST_PAGE = 1;
|
|
19
18
|
export const Feed = ({ image, title }) => {
|
|
20
19
|
var _a;
|
|
21
|
-
const { posts, totalCount,
|
|
20
|
+
const { posts, totalCount, filters, pinnedPost, getPosts, pageCountForShowSupportButtons } = React.useContext(FeedContext);
|
|
22
21
|
const router = React.useContext(RouterContext);
|
|
23
22
|
const handleAnalytics = useAnalytics(DefaultEventNames.ShowMore);
|
|
24
23
|
const additionalAnalyticsEvent = prepareAnalyticsEvent({
|
|
@@ -58,14 +57,14 @@ export const Feed = ({ image, title }) => {
|
|
|
58
57
|
}, [router]);
|
|
59
58
|
const fetchData = React.useCallback(async ({ page, query }) => {
|
|
60
59
|
if (query && getPosts) {
|
|
61
|
-
const queryParamsForRequest = getFeedQueryParams(Object.assign(Object.assign({}, queryParams), query), page);
|
|
60
|
+
const queryParamsForRequest = getFeedQueryParams(Object.assign(Object.assign({}, queryParams), query), page, filters);
|
|
62
61
|
const data = await getPosts(queryParamsForRequest);
|
|
63
62
|
return data;
|
|
64
63
|
}
|
|
65
64
|
else {
|
|
66
65
|
throw new Error('cant get request');
|
|
67
66
|
}
|
|
68
|
-
}, [getPosts, queryParams]);
|
|
67
|
+
}, [getPosts, queryParams, filters]);
|
|
69
68
|
const handleLoad = React.useCallback(async ({ page, query }) => {
|
|
70
69
|
const pageNumber = Number(page || queryParams.page || DEFAULT_PAGE);
|
|
71
70
|
handleChangeQueryParams(query);
|
|
@@ -139,16 +138,7 @@ export const Feed = ({ image, title }) => {
|
|
|
139
138
|
payload: loadedPostsCount < postCountOnPage,
|
|
140
139
|
});
|
|
141
140
|
}, [currentPage, lastLoadedCount, perPageInQuery, postCountOnPage]);
|
|
142
|
-
|
|
143
|
-
content: service.name,
|
|
144
|
-
value: `${service.id}`,
|
|
145
|
-
})), [services]);
|
|
146
|
-
const tagItems = React.useMemo(() => tags === null || tags === void 0 ? void 0 : tags.map((tag) => ({
|
|
147
|
-
content: tag.name,
|
|
148
|
-
value: tag.slug,
|
|
149
|
-
icon: tag.icon && _jsx(Icon, { data: tag.icon }),
|
|
150
|
-
})), [tags]);
|
|
151
|
-
return (_jsxs("div", { children: [_jsx(FeedHeader, { verticalOffset: "s", tags: tagItems, services: serviceItems, handleLoadData: handleLoad, queryParams: queryParams, background: {
|
|
141
|
+
return (_jsxs("div", { children: [_jsx(FeedHeader, { verticalOffset: "s", filters: filters, handleLoadData: handleLoad, queryParams: queryParams, background: {
|
|
152
142
|
fullWidth: true,
|
|
153
143
|
url: image,
|
|
154
144
|
disableCompress: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Feed.js","sourceRoot":"../../../../src","sources":["blocks/Feed/Feed.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\n\nimport {useAnalytics} from '@gravity-ui/page-constructor';\nimport {Icon} from '@gravity-ui/uikit';\n\nimport {FeedHeader} from '../../components/FeedHeader/FeedHeader';\nimport {Posts} from '../../components/Posts/Posts';\nimport {PostsError} from '../../components/PostsError/PostsError';\nimport {DefaultGoalIds} from '../../constants';\nimport {FeedContext} from '../../contexts/FeedContext';\nimport {RouterContext} from '../../contexts/RouterContext';\nimport {AnalyticsCounter} from '../../counters/utils';\nimport {FeedProps} from '../../models/blocks';\nimport {DefaultEventNames, FetchArgs, HandleChangeQueryParams} from '../../models/common';\nimport {getFeedQueryParams, prepareAnalyticsEvent, scrollOnPageChange} from '../../utils/common';\nimport {DEFAULT_PAGE, DEFAULT_ROWS_PER_PAGE} from '../constants';\n\nimport {ActionTypes, reducer} from './reducer';\n\nconst CONTAINER_ID = 'blog-cards';\nconst PAGE_QUERY = 'page';\nconst FIRST_PAGE = 1;\n\nexport const Feed = ({image, title}: FeedProps) => {\n const {\n posts,\n totalCount,\n tags,\n services,\n pinnedPost,\n getPosts,\n pageCountForShowSupportButtons,\n } = React.useContext(FeedContext);\n const router = React.useContext(RouterContext);\n const handleAnalytics = useAnalytics(DefaultEventNames.ShowMore);\n const additionalAnalyticsEvent = prepareAnalyticsEvent({\n name: DefaultGoalIds.showMore,\n counter: AnalyticsCounter.CrossSite,\n });\n\n const [\n {\n errorLoad,\n errorShowMore,\n isFetching,\n isShowMoreVisible,\n lastLoadedCount,\n postCountOnPage,\n postsOnPage,\n pinnedPostOnPage,\n currentPage,\n queryParams,\n },\n dispatch,\n ] = React.useReducer(reducer, {\n errorLoad: false,\n errorShowMore: false,\n isFetching: false,\n isShowMoreVisible: true,\n lastLoadedCount: posts?.length || 0,\n postCountOnPage: totalCount || 0,\n postsOnPage: posts,\n pinnedPostOnPage: pinnedPost,\n currentPage: router?.query?.page ? Number(router.query.page) : DEFAULT_PAGE,\n queryParams: router.query || {},\n });\n\n const perPageInQuery = queryParams?.perPage\n ? Number(queryParams.perPage)\n : DEFAULT_ROWS_PER_PAGE;\n\n const pageChange = (value: number) => {\n dispatch({type: ActionTypes.PageChange, payload: value});\n };\n\n const setIsFetching = (value: boolean) => {\n dispatch({type: ActionTypes.SetIsFetching, payload: value});\n };\n\n const setErrorLoad = (value: boolean) => {\n dispatch({type: ActionTypes.SetErrorLoad, payload: value});\n };\n\n const handleChangeQueryParams: HandleChangeQueryParams = React.useCallback(\n (value) => {\n dispatch({type: ActionTypes.QueryParamsChange, payload: value});\n\n const hasFirstPageQuery = Object.keys(value).some(\n (queryKey) => queryKey === PAGE_QUERY && value[queryKey] === FIRST_PAGE,\n );\n\n const result = hasFirstPageQuery\n ? {\n ...value,\n [PAGE_QUERY]: null,\n }\n : {\n ...value,\n };\n\n router.updateQueryCallback(result);\n },\n [router],\n );\n\n const fetchData = React.useCallback(\n async ({page, query}: FetchArgs) => {\n if (query && getPosts) {\n const queryParamsForRequest = getFeedQueryParams({...queryParams, ...query}, page);\n const data = await getPosts(queryParamsForRequest);\n\n return data;\n } else {\n throw new Error('cant get request');\n }\n },\n [getPosts, queryParams],\n );\n\n const handleLoad = React.useCallback(\n async ({page, query}: FetchArgs) => {\n const pageNumber = Number(page || queryParams.page || DEFAULT_PAGE);\n\n handleChangeQueryParams(query);\n\n try {\n setErrorLoad(false);\n setIsFetching(true);\n\n const fetchedData = await fetchData({page: pageNumber, query});\n\n if (fetchedData) {\n dispatch({\n type: ActionTypes.SetPosts,\n payload: {\n posts: fetchedData.posts,\n pinnedPost: fetchedData.pinnedPost,\n count: fetchedData.count,\n page: pageNumber,\n },\n });\n }\n } catch (err) {\n setErrorLoad(true);\n }\n\n scrollOnPageChange(CONTAINER_ID);\n\n setIsFetching(false);\n },\n [fetchData, handleChangeQueryParams, queryParams],\n );\n\n const handlePageChange = async (value: number) => {\n pageChange(value);\n handleLoad({\n page: value,\n query: {...queryParams, page: value},\n });\n };\n\n const handleShowMore = async () => {\n handleAnalytics(additionalAnalyticsEvent);\n\n const nextPage = currentPage + 1;\n\n try {\n setIsFetching(true);\n const fetchedData = await fetchData({\n page: nextPage,\n query: {\n page: nextPage,\n },\n });\n\n handleChangeQueryParams({\n page: nextPage,\n });\n\n if (fetchedData) {\n dispatch({\n type: ActionTypes.SetShowMore,\n payload: {\n posts: (postsOnPage ?? []).concat(fetchedData.posts),\n count: fetchedData.count,\n currentPage: nextPage,\n lastLoadedCount: fetchedData.posts.length,\n },\n });\n }\n } catch (err) {\n dispatch({type: ActionTypes.SetErrorShowMore, payload: true});\n }\n\n setIsFetching(false);\n };\n\n const handleOnErrorReload = React.useCallback(() => {\n handleLoad({page: currentPage, query: queryParams});\n }, [currentPage, handleLoad, queryParams]);\n\n React.useEffect(() => {\n const loadedPostsCount = currentPage * perPageInQuery;\n dispatch({\n type: ActionTypes.SetIsShowMoreVisible,\n payload: loadedPostsCount < postCountOnPage,\n });\n }, [currentPage, lastLoadedCount, perPageInQuery, postCountOnPage]);\n\n const serviceItems = React.useMemo(\n () =>\n services?.map((service) => ({\n content: service.name,\n value: `${service.id}`,\n })),\n [services],\n );\n\n const tagItems = React.useMemo(\n () =>\n tags?.map((tag) => ({\n content: tag.name,\n value: tag.slug,\n icon: tag.icon && <Icon data={tag.icon} />,\n })),\n [tags],\n );\n\n return (\n <div>\n <FeedHeader\n verticalOffset=\"s\"\n tags={tagItems}\n services={serviceItems}\n handleLoadData={handleLoad}\n queryParams={queryParams}\n background={{\n fullWidth: true,\n url: image,\n disableCompress: true,\n }}\n title={title}\n />\n {errorLoad ? (\n <PostsError onButtonClick={handleOnErrorReload} />\n ) : (\n <Posts\n containerId={CONTAINER_ID}\n currentPage={currentPage}\n isShowMoreVisible={isShowMoreVisible}\n errorShowMore={errorShowMore}\n postCountOnPage={postCountOnPage}\n perPageInQuery={perPageInQuery}\n handleShowMore={handleShowMore}\n handlePageChange={handlePageChange}\n postsOnPage={postsOnPage}\n pinnedPostOnPage={pinnedPostOnPage}\n isFetching={isFetching}\n queryParams={queryParams}\n pageCountForShowSupportButtons={pageCountForShowSupportButtons}\n />\n )}\n </div>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"Feed.js","sourceRoot":"../../../../src","sources":["blocks/Feed/Feed.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\n\nimport {useAnalytics} from '@gravity-ui/page-constructor';\n\nimport {FeedHeader} from '../../components/FeedHeader/FeedHeader';\nimport {Posts} from '../../components/Posts/Posts';\nimport {PostsError} from '../../components/PostsError/PostsError';\nimport {DefaultGoalIds} from '../../constants';\nimport {FeedContext} from '../../contexts/FeedContext';\nimport {RouterContext} from '../../contexts/RouterContext';\nimport {AnalyticsCounter} from '../../counters/utils';\nimport {FeedProps} from '../../models/blocks';\nimport {DefaultEventNames, FetchArgs, HandleChangeQueryParams} from '../../models/common';\nimport {getFeedQueryParams, prepareAnalyticsEvent, scrollOnPageChange} from '../../utils/common';\nimport {DEFAULT_PAGE, DEFAULT_ROWS_PER_PAGE} from '../constants';\n\nimport {ActionTypes, reducer} from './reducer';\n\nconst CONTAINER_ID = 'blog-cards';\nconst PAGE_QUERY = 'page';\nconst FIRST_PAGE = 1;\n\nexport const Feed = ({image, title}: FeedProps) => {\n const {posts, totalCount, filters, pinnedPost, getPosts, pageCountForShowSupportButtons} =\n React.useContext(FeedContext);\n const router = React.useContext(RouterContext);\n const handleAnalytics = useAnalytics(DefaultEventNames.ShowMore);\n const additionalAnalyticsEvent = prepareAnalyticsEvent({\n name: DefaultGoalIds.showMore,\n counter: AnalyticsCounter.CrossSite,\n });\n\n const [\n {\n errorLoad,\n errorShowMore,\n isFetching,\n isShowMoreVisible,\n lastLoadedCount,\n postCountOnPage,\n postsOnPage,\n pinnedPostOnPage,\n currentPage,\n queryParams,\n },\n dispatch,\n ] = React.useReducer(reducer, {\n errorLoad: false,\n errorShowMore: false,\n isFetching: false,\n isShowMoreVisible: true,\n lastLoadedCount: posts?.length || 0,\n postCountOnPage: totalCount || 0,\n postsOnPage: posts,\n pinnedPostOnPage: pinnedPost,\n currentPage: router?.query?.page ? Number(router.query.page) : DEFAULT_PAGE,\n queryParams: router.query || {},\n });\n\n const perPageInQuery = queryParams?.perPage\n ? Number(queryParams.perPage)\n : DEFAULT_ROWS_PER_PAGE;\n\n const pageChange = (value: number) => {\n dispatch({type: ActionTypes.PageChange, payload: value});\n };\n\n const setIsFetching = (value: boolean) => {\n dispatch({type: ActionTypes.SetIsFetching, payload: value});\n };\n\n const setErrorLoad = (value: boolean) => {\n dispatch({type: ActionTypes.SetErrorLoad, payload: value});\n };\n\n const handleChangeQueryParams: HandleChangeQueryParams = React.useCallback(\n (value) => {\n dispatch({type: ActionTypes.QueryParamsChange, payload: value});\n\n const hasFirstPageQuery = Object.keys(value).some(\n (queryKey) => queryKey === PAGE_QUERY && value[queryKey] === FIRST_PAGE,\n );\n\n const result = hasFirstPageQuery\n ? {\n ...value,\n [PAGE_QUERY]: null,\n }\n : {\n ...value,\n };\n\n router.updateQueryCallback(result);\n },\n [router],\n );\n\n const fetchData = React.useCallback(\n async ({page, query}: FetchArgs) => {\n if (query && getPosts) {\n const queryParamsForRequest = getFeedQueryParams(\n {...queryParams, ...query},\n page,\n filters,\n );\n const data = await getPosts(queryParamsForRequest);\n\n return data;\n } else {\n throw new Error('cant get request');\n }\n },\n [getPosts, queryParams, filters],\n );\n\n const handleLoad = React.useCallback(\n async ({page, query}: FetchArgs) => {\n const pageNumber = Number(page || queryParams.page || DEFAULT_PAGE);\n\n handleChangeQueryParams(query);\n\n try {\n setErrorLoad(false);\n setIsFetching(true);\n\n const fetchedData = await fetchData({page: pageNumber, query});\n\n if (fetchedData) {\n dispatch({\n type: ActionTypes.SetPosts,\n payload: {\n posts: fetchedData.posts,\n pinnedPost: fetchedData.pinnedPost,\n count: fetchedData.count,\n page: pageNumber,\n },\n });\n }\n } catch (err) {\n setErrorLoad(true);\n }\n\n scrollOnPageChange(CONTAINER_ID);\n\n setIsFetching(false);\n },\n [fetchData, handleChangeQueryParams, queryParams],\n );\n\n const handlePageChange = async (value: number) => {\n pageChange(value);\n handleLoad({\n page: value,\n query: {...queryParams, page: value},\n });\n };\n\n const handleShowMore = async () => {\n handleAnalytics(additionalAnalyticsEvent);\n\n const nextPage = currentPage + 1;\n\n try {\n setIsFetching(true);\n const fetchedData = await fetchData({\n page: nextPage,\n query: {\n page: nextPage,\n },\n });\n\n handleChangeQueryParams({\n page: nextPage,\n });\n\n if (fetchedData) {\n dispatch({\n type: ActionTypes.SetShowMore,\n payload: {\n posts: (postsOnPage ?? []).concat(fetchedData.posts),\n count: fetchedData.count,\n currentPage: nextPage,\n lastLoadedCount: fetchedData.posts.length,\n },\n });\n }\n } catch (err) {\n dispatch({type: ActionTypes.SetErrorShowMore, payload: true});\n }\n\n setIsFetching(false);\n };\n\n const handleOnErrorReload = React.useCallback(() => {\n handleLoad({page: currentPage, query: queryParams});\n }, [currentPage, handleLoad, queryParams]);\n\n React.useEffect(() => {\n const loadedPostsCount = currentPage * perPageInQuery;\n dispatch({\n type: ActionTypes.SetIsShowMoreVisible,\n payload: loadedPostsCount < postCountOnPage,\n });\n }, [currentPage, lastLoadedCount, perPageInQuery, postCountOnPage]);\n\n return (\n <div>\n <FeedHeader\n verticalOffset=\"s\"\n filters={filters}\n handleLoadData={handleLoad}\n queryParams={queryParams}\n background={{\n fullWidth: true,\n url: image,\n disableCompress: true,\n }}\n title={title}\n />\n {errorLoad ? (\n <PostsError onButtonClick={handleOnErrorReload} />\n ) : (\n <Posts\n containerId={CONTAINER_ID}\n currentPage={currentPage}\n isShowMoreVisible={isShowMoreVisible}\n errorShowMore={errorShowMore}\n postCountOnPage={postCountOnPage}\n perPageInQuery={perPageInQuery}\n handleShowMore={handleShowMore}\n handlePageChange={handlePageChange}\n postsOnPage={postsOnPage}\n pinnedPostOnPage={pinnedPostOnPage}\n isFetching={isFetching}\n queryParams={queryParams}\n pageCountForShowSupportButtons={pageCountForShowSupportButtons}\n />\n )}\n </div>\n );\n};\n"]}
|
|
@@ -4,5 +4,5 @@ import './FeedHeader.css';
|
|
|
4
4
|
type HeaderProps = Pick<HeaderBlockProps, 'background' | 'offset' | 'theme' | 'verticalOffset'>;
|
|
5
5
|
type FeedHeaderProps = HeaderProps & ControlsProps;
|
|
6
6
|
type FeedHeaderContainerProps = FeedHeaderProps & ClassNameProps;
|
|
7
|
-
export declare const FeedHeader: ({
|
|
7
|
+
export declare const FeedHeader: ({ filters, handleLoadData, offset, background, theme, verticalOffset, className, queryParams, title, }: FeedHeaderContainerProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
8
|
export {};
|
|
@@ -4,12 +4,12 @@ import { block } from "../../utils/cn.js";
|
|
|
4
4
|
import { Controls } from "./components/Controls/Controls.js";
|
|
5
5
|
import './FeedHeader.css';
|
|
6
6
|
const b = block('feed-header');
|
|
7
|
-
export const FeedHeader = ({
|
|
7
|
+
export const FeedHeader = ({ filters, handleLoadData, offset = 'default', background, theme = 'light', verticalOffset = 'l', className, queryParams, title, }) => {
|
|
8
8
|
const backgroundThemed = background && getThemedValue(background, theme);
|
|
9
9
|
return (_jsxs("header", { className: b('header', { ['has-background']: Boolean(background) }, className), children: [(backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.color) ? (_jsx(FullWidthBackground, { style: { backgroundColor: backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.color }, theme: "rounded" })) : null, _jsxs(Grid, { className: b('content', { offset, theme, 'vertical-offset': verticalOffset }), children: [backgroundThemed ? (_jsx(BackgroundImage, { src: backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.url, className: b('background'), imageClassName: b('background-img'), style: {
|
|
10
10
|
backgroundColor: backgroundThemed.fullWidth
|
|
11
11
|
? ''
|
|
12
12
|
: backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.color,
|
|
13
|
-
}, disableCompress: backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.disableCompress })) : null, _jsx(Controls, { title: title,
|
|
13
|
+
}, disableCompress: backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.disableCompress })) : null, _jsx(Controls, { title: title, filters: filters, handleLoadData: handleLoadData, queryParams: queryParams })] })] }));
|
|
14
14
|
};
|
|
15
15
|
//# sourceMappingURL=FeedHeader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedHeader.js","sourceRoot":"../../../../src","sources":["components/FeedHeader/FeedHeader.tsx"],"names":[],"mappings":";AAAA,OAAO,EACH,eAAe,EACf,mBAAmB,EACnB,IAAI,EAEJ,cAAc,GACjB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAC,KAAK,EAAC,0BAAuB;AAErC,OAAO,EAAC,QAAQ,EAAgB,0CAAuC;AAEvE,OAAO,kBAAkB,CAAC;AAE1B,MAAM,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;AAQ/B,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EACvB,
|
|
1
|
+
{"version":3,"file":"FeedHeader.js","sourceRoot":"../../../../src","sources":["components/FeedHeader/FeedHeader.tsx"],"names":[],"mappings":";AAAA,OAAO,EACH,eAAe,EACf,mBAAmB,EACnB,IAAI,EAEJ,cAAc,GACjB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAC,KAAK,EAAC,0BAAuB;AAErC,OAAO,EAAC,QAAQ,EAAgB,0CAAuC;AAEvE,OAAO,kBAAkB,CAAC;AAE1B,MAAM,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;AAQ/B,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EACvB,OAAO,EACP,cAAc,EACd,MAAM,GAAG,SAAS,EAClB,UAAU,EACV,KAAK,GAAG,OAAO,EACf,cAAc,GAAG,GAAG,EACpB,SAAS,EACT,WAAW,EACX,KAAK,GACkB,EAAE,EAAE;IAC3B,MAAM,gBAAgB,GAAG,UAAU,IAAI,cAAc,CAAC,UAAU,EAAE,KAAc,CAAC,CAAC;IAElF,OAAO,CACH,kBAAQ,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAC,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,EAAC,EAAE,SAAS,CAAC,aAC/E,CAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,KAAK,EAAC,CAAC,CAAC,CACvB,KAAC,mBAAmB,IAChB,KAAK,EAAE,EAAC,eAAe,EAAE,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,KAAK,EAAC,EACjD,KAAK,EAAC,SAAS,GACjB,CACL,CAAC,CAAC,CAAC,IAAI,EACR,MAAC,IAAI,IAAC,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,EAAC,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAC,CAAC,aAC5E,gBAAgB,CAAC,CAAC,CAAC,CAChB,KAAC,eAAe,IACZ,GAAG,EAAE,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,GAAG,EAC1B,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC,EAC1B,cAAc,EAAE,CAAC,CAAC,gBAAgB,CAAC,EACnC,KAAK,EAAE;4BACH,eAAe,EAAE,gBAAgB,CAAC,SAAS;gCACvC,CAAC,CAAC,EAAE;gCACJ,CAAC,CAAC,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,KAAK;yBAChC,EACD,eAAe,EAAE,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,eAAe,GACpD,CACL,CAAC,CAAC,CAAC,IAAI,EACR,KAAC,QAAQ,IACL,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW,GAC1B,IACC,IACF,CACZ,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {\n BackgroundImage,\n FullWidthBackground,\n Grid,\n Theme,\n getThemedValue,\n} from '@gravity-ui/page-constructor';\n\nimport {ClassNameProps, HeaderBlockProps} from '../../models/common';\nimport {block} from '../../utils/cn';\n\nimport {Controls, ControlsProps} from './components/Controls/Controls';\n\nimport './FeedHeader.scss';\n\nconst b = block('feed-header');\n\ntype HeaderProps = Pick<HeaderBlockProps, 'background' | 'offset' | 'theme' | 'verticalOffset'>;\n\ntype FeedHeaderProps = HeaderProps & ControlsProps;\n\ntype FeedHeaderContainerProps = FeedHeaderProps & ClassNameProps;\n\nexport const FeedHeader = ({\n filters,\n handleLoadData,\n offset = 'default',\n background,\n theme = 'light',\n verticalOffset = 'l',\n className,\n queryParams,\n title,\n}: FeedHeaderContainerProps) => {\n const backgroundThemed = background && getThemedValue(background, theme as Theme);\n\n return (\n <header className={b('header', {['has-background']: Boolean(background)}, className)}>\n {backgroundThemed?.color ? (\n <FullWidthBackground\n style={{backgroundColor: backgroundThemed?.color}}\n theme=\"rounded\"\n />\n ) : null}\n <Grid className={b('content', {offset, theme, 'vertical-offset': verticalOffset})}>\n {backgroundThemed ? (\n <BackgroundImage\n src={backgroundThemed?.url}\n className={b('background')}\n imageClassName={b('background-img')}\n style={{\n backgroundColor: backgroundThemed.fullWidth\n ? ''\n : backgroundThemed?.color,\n }}\n disableCompress={backgroundThemed?.disableCompress}\n />\n ) : null}\n <Controls\n title={title}\n filters={filters}\n handleLoadData={handleLoadData}\n queryParams={queryParams}\n />\n </Grid>\n </header>\n );\n};\n"]}
|
|
@@ -1,16 +1,9 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { FetchArgs, Query } from "../../../../models/common.js";
|
|
1
|
+
import { FetchArgs, FilterConfig, Query } from "../../../../models/common.js";
|
|
3
2
|
import './Controls.css';
|
|
4
|
-
export type SelectItem = {
|
|
5
|
-
content: string;
|
|
6
|
-
value: string;
|
|
7
|
-
icon?: React.ReactNode;
|
|
8
|
-
};
|
|
9
3
|
export type ControlsProps = {
|
|
10
4
|
handleLoadData: (props: FetchArgs) => void;
|
|
11
|
-
|
|
12
|
-
services?: SelectItem[];
|
|
5
|
+
filters?: FilterConfig[];
|
|
13
6
|
queryParams: Query;
|
|
14
7
|
title?: string;
|
|
15
8
|
};
|
|
16
|
-
export declare const Controls: ({ handleLoadData,
|
|
9
|
+
export declare const Controls: ({ handleLoadData, filters, queryParams, title, }: ControlsProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -3,14 +3,11 @@ import * as React from 'react';
|
|
|
3
3
|
import { Bookmark } from '@gravity-ui/icons';
|
|
4
4
|
import { useAnalytics } from '@gravity-ui/page-constructor';
|
|
5
5
|
import { Button, Icon, MobileProvider, Select } from '@gravity-ui/uikit';
|
|
6
|
-
import { DefaultGoalIds } from "../../../../constants.js";
|
|
7
6
|
import { LikesContext } from "../../../../contexts/LikesContext.js";
|
|
8
7
|
import { MobileContext } from "../../../../contexts/MobileContext.js";
|
|
9
|
-
import { AnalyticsCounter } from "../../../../counters/utils.js";
|
|
10
8
|
import { Keyset, i18n } from "../../../../i18n/index.js";
|
|
11
|
-
import { DefaultEventNames } from "../../../../models/common.js";
|
|
9
|
+
import { DefaultEventNames, } from "../../../../models/common.js";
|
|
12
10
|
import { block } from "../../../../utils/cn.js";
|
|
13
|
-
import { prepareAnalyticsEvent } from "../../../../utils/common.js";
|
|
14
11
|
import { Search } from "../../../Search/Search.js";
|
|
15
12
|
import { renderFilter, renderOption, renderSwitcher } from "./customRenders.js";
|
|
16
13
|
import './Controls.css';
|
|
@@ -18,12 +15,10 @@ const b = block('feed-controls');
|
|
|
18
15
|
const ICON_SIZE = 16;
|
|
19
16
|
const DEFAULT_PAGE = 1;
|
|
20
17
|
const VIRTUALIZATION_THRESHOLD = 1000;
|
|
21
|
-
export const Controls = ({ handleLoadData,
|
|
18
|
+
export const Controls = ({ handleLoadData, filters = [], queryParams, title = i18n(Keyset.Title), }) => {
|
|
22
19
|
const { hasLikes } = React.useContext(LikesContext);
|
|
23
|
-
const handleAnalyticsTag = useAnalytics(DefaultEventNames.Tag);
|
|
24
|
-
const handleAnalyticsService = useAnalytics(DefaultEventNames.Service);
|
|
25
20
|
const handleAnalyticsSaveOnly = useAnalytics(DefaultEventNames.SaveOnly);
|
|
26
|
-
const { savedOnly: savedOnlyInitial, search: searchInitial
|
|
21
|
+
const { savedOnly: savedOnlyInitial, search: searchInitial } = queryParams || {};
|
|
27
22
|
const [savedOnly, setSavedOnly] = React.useState(savedOnlyInitial === 'true');
|
|
28
23
|
const [search, setSearch] = React.useState(searchInitial);
|
|
29
24
|
const isMobile = React.useContext(MobileContext);
|
|
@@ -35,67 +30,50 @@ export const Controls = ({ handleLoadData, tags = [], services = [], queryParams
|
|
|
35
30
|
query: {
|
|
36
31
|
savedOnly: savedOnly ? '' : 'true',
|
|
37
32
|
search: '',
|
|
38
|
-
tags: '',
|
|
39
33
|
page: DEFAULT_PAGE,
|
|
40
|
-
services: '',
|
|
41
34
|
},
|
|
42
35
|
});
|
|
43
36
|
};
|
|
44
|
-
const handleSearch = (searchValue) => {
|
|
37
|
+
const handleSearch = React.useCallback((searchValue) => {
|
|
45
38
|
setSearch(searchValue);
|
|
46
39
|
handleLoadData({
|
|
47
40
|
page: DEFAULT_PAGE,
|
|
48
41
|
query: { search: searchValue, page: DEFAULT_PAGE },
|
|
49
42
|
});
|
|
43
|
+
}, [handleLoadData]);
|
|
44
|
+
const makeHandleFilterSelect = (filter) => (selectedValues) => {
|
|
45
|
+
const query = { page: DEFAULT_PAGE };
|
|
46
|
+
if (filter.multiple) {
|
|
47
|
+
query[filter.queryParamName] = selectedValues.join(',');
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
const isEmpty = selectedValues.some((v) => v === 'empty');
|
|
51
|
+
query[filter.queryParamName] = isEmpty ? '' : selectedValues[0];
|
|
52
|
+
}
|
|
53
|
+
handleLoadData({ page: DEFAULT_PAGE, query });
|
|
50
54
|
};
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
.join(',');
|
|
75
|
-
const event = prepareAnalyticsEvent({
|
|
76
|
-
name: DefaultGoalIds.service,
|
|
77
|
-
counter: AnalyticsCounter.CrossSite,
|
|
78
|
-
});
|
|
79
|
-
handleAnalyticsService(event, {
|
|
80
|
-
service: servicesAsStringForAnalytics,
|
|
81
|
-
});
|
|
82
|
-
const servicesAsString = selectedServices.join(',');
|
|
83
|
-
handleLoadData({
|
|
84
|
-
page: DEFAULT_PAGE,
|
|
85
|
-
query: { services: servicesAsString, page: DEFAULT_PAGE },
|
|
86
|
-
});
|
|
87
|
-
};
|
|
88
|
-
const tagsItems = React.useMemo(() => [{ value: 'empty', content: i18n(Keyset.AllTags) }, ...tags], [tags]);
|
|
89
|
-
const servicesItems = React.useMemo(() => (servicesInitial ? [...servicesInitial.split(',')] : []), [servicesInitial]);
|
|
90
|
-
return (_jsx(MobileProvider, { mobile: false, children: _jsxs("div", { className: b('header'), children: [_jsx("h1", { className: b('header-item', { title: true }), children: title }), _jsxs("div", { className: b('header-item', { filters: true }), children: [_jsx("div", { className: b('filter-item'), children: _jsx(Search, { className: b('search'), placeholder: i18n(Keyset.Search), initialValue: search && typeof search === 'string' ? search : '', onSubmit: handleSearch }) }), _jsx("div", { className: b('filter-item'), children: _jsx(Select, { className: b('select'), size: "xl", options: tagsItems, defaultValue: [tagInitial], onUpdate: handleTagSelect, placeholder: i18n(Keyset.AllTags), popupClassName: b('popup', { isMobile }), renderControl: renderSwitcher({
|
|
91
|
-
initial: [tagInitial],
|
|
92
|
-
list: tagsItems,
|
|
93
|
-
defaultLabel: i18n(Keyset.AllTags),
|
|
94
|
-
}), disablePortal: true, virtualizationThreshold: VIRTUALIZATION_THRESHOLD, renderOption: renderOption }) }), services.length > 0 ? (_jsx("div", { className: b('filter-item'), children: _jsx(Select, { className: b('select'), size: "xl", multiple: true, filterable: true, hasClear: true, disablePortal: true, options: services, defaultValue: servicesItems, popupClassName: b('popup', { isMobile }), onUpdate: handleServicesSelect, placeholder: i18n(Keyset.AllServices), renderControl: renderSwitcher({
|
|
95
|
-
initial: servicesItems,
|
|
96
|
-
list: services,
|
|
97
|
-
defaultLabel: i18n(Keyset.AllServices),
|
|
98
|
-
qa: 'service-select',
|
|
99
|
-
}), virtualizationThreshold: VIRTUALIZATION_THRESHOLD, renderOption: renderOption, renderFilter: renderFilter }) })) : null, hasLikes ? (_jsx("div", { className: b('filter-item', { 'width-auto': true }), children: _jsxs(Button, { view: 'outlined', className: b('saved-only-button', { savedOnly }), size: "xl", onClick: handleSavedOnly, selected: savedOnly, children: [_jsx(Icon, { data: Bookmark, size: ICON_SIZE, className: b('icon', { savedOnly }) }), i18n(Keyset.ActionSavedOnly)] }) })) : null] })] }) }));
|
|
55
|
+
return (_jsx(MobileProvider, { mobile: false, children: _jsxs("div", { className: b('header'), children: [_jsx("h1", { className: b('header-item', { title: true }), children: title }), _jsxs("div", { className: b('header-item', { filters: true }), children: [_jsx("div", { className: b('filter-item'), children: _jsx(Search, { className: b('search'), placeholder: i18n(Keyset.Search), initialValue: search && typeof search === 'string' ? search : '', onSubmit: handleSearch }) }), filters.map((filter) => {
|
|
56
|
+
var _a, _b;
|
|
57
|
+
const initialRaw = queryParams === null || queryParams === void 0 ? void 0 : queryParams[filter.queryParamName];
|
|
58
|
+
let defaultValue;
|
|
59
|
+
if (filter.multiple) {
|
|
60
|
+
defaultValue = initialRaw ? initialRaw.split(',') : [];
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
defaultValue = [initialRaw];
|
|
64
|
+
}
|
|
65
|
+
const itemsWithEmpty = filter.multiple
|
|
66
|
+
? filter.items
|
|
67
|
+
: [
|
|
68
|
+
{ value: 'empty', content: filter.allLabel },
|
|
69
|
+
...filter.items,
|
|
70
|
+
];
|
|
71
|
+
return (_jsx("div", { className: b('filter-item'), children: _jsx(Select, { className: b('select'), size: "xl", multiple: filter.multiple, filterable: filter.filterable, hasClear: (_a = filter.hasClear) !== null && _a !== void 0 ? _a : filter.multiple, disablePortal: true, options: itemsWithEmpty, defaultValue: defaultValue, popupClassName: b('popup', { isMobile }), onUpdate: makeHandleFilterSelect(filter), placeholder: (_b = filter.placeholder) !== null && _b !== void 0 ? _b : filter.allLabel, renderControl: renderSwitcher({
|
|
72
|
+
initial: defaultValue,
|
|
73
|
+
list: itemsWithEmpty,
|
|
74
|
+
defaultLabel: filter.allLabel,
|
|
75
|
+
qa: filter.qa,
|
|
76
|
+
}), virtualizationThreshold: VIRTUALIZATION_THRESHOLD, renderOption: renderOption, renderFilter: filter.filterable ? renderFilter : undefined }) }, filter.queryParamName));
|
|
77
|
+
}), hasLikes ? (_jsx("div", { className: b('filter-item', { 'width-auto': true }), children: _jsxs(Button, { view: 'outlined', className: b('saved-only-button', { savedOnly }), size: "xl", onClick: handleSavedOnly, selected: savedOnly, children: [_jsx(Icon, { data: Bookmark, size: ICON_SIZE, className: b('icon', { savedOnly }) }), i18n(Keyset.ActionSavedOnly)] }) })) : null] })] }) }));
|
|
100
78
|
};
|
|
101
79
|
//# sourceMappingURL=Controls.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Controls.js","sourceRoot":"../../../../../../src","sources":["components/FeedHeader/components/Controls/Controls.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\n\nimport {Bookmark} from '@gravity-ui/icons';\nimport {useAnalytics} from '@gravity-ui/page-constructor';\nimport {Button, Icon, MobileProvider, Select} from '@gravity-ui/uikit';\n\nimport {DefaultGoalIds} from '../../../../constants';\nimport {LikesContext} from '../../../../contexts/LikesContext';\nimport {MobileContext} from '../../../../contexts/MobileContext';\nimport {AnalyticsCounter} from '../../../../counters/utils';\nimport {Keyset, i18n} from '../../../../i18n';\nimport {DefaultEventNames, FetchArgs, Query} from '../../../../models/common';\nimport {block} from '../../../../utils/cn';\nimport {prepareAnalyticsEvent} from '../../../../utils/common';\nimport {Search} from '../../../Search/Search';\n\nimport {renderFilter, renderOption, renderSwitcher} from './customRenders';\n\nimport './Controls.scss';\n\nconst b = block('feed-controls');\n\nexport type SelectItem = {\n content: string;\n value: string;\n icon?: React.ReactNode;\n};\n\nexport type ControlsProps = {\n handleLoadData: (props: FetchArgs) => void;\n tags?: SelectItem[];\n services?: SelectItem[];\n queryParams: Query;\n title?: string;\n};\n\nconst ICON_SIZE = 16;\nconst DEFAULT_PAGE = 1;\nconst VIRTUALIZATION_THRESHOLD = 1000;\n\nexport const Controls = ({\n handleLoadData,\n tags = [],\n services = [],\n queryParams,\n title = i18n(Keyset.Title),\n}: ControlsProps) => {\n const {hasLikes} = React.useContext(LikesContext);\n const handleAnalyticsTag = useAnalytics(DefaultEventNames.Tag);\n const handleAnalyticsService = useAnalytics(DefaultEventNames.Service);\n const handleAnalyticsSaveOnly = useAnalytics(DefaultEventNames.SaveOnly);\n\n const {\n savedOnly: savedOnlyInitial,\n search: searchInitial,\n tags: tagInitial,\n services: servicesInitial,\n } = queryParams || {};\n\n const [savedOnly, setSavedOnly] = React.useState<boolean>(savedOnlyInitial === 'true');\n const [search, setSearch] = React.useState<string>(searchInitial as string);\n\n const isMobile = React.useContext(MobileContext);\n\n const handleSavedOnly = () => {\n handleAnalyticsSaveOnly();\n setSavedOnly(!savedOnly);\n handleLoadData({\n page: DEFAULT_PAGE,\n query: {\n savedOnly: savedOnly ? '' : 'true',\n search: '',\n tags: '',\n page: DEFAULT_PAGE,\n services: '',\n },\n });\n };\n\n const handleSearch = (searchValue: string) => {\n setSearch(searchValue);\n\n handleLoadData({\n page: DEFAULT_PAGE,\n query: {search: searchValue, page: DEFAULT_PAGE},\n });\n };\n\n const handleTagSelect = (selectedTags: string[]) => {\n const event = prepareAnalyticsEvent({\n name: DefaultGoalIds.tag,\n counter: AnalyticsCounter.CrossSite,\n });\n handleAnalyticsTag(event, {\n theme: selectedTags[0],\n });\n\n const isEmptyTag = selectedTags.some((tag) => tag === 'empty');\n\n handleLoadData({\n page: DEFAULT_PAGE,\n query: {\n tags: isEmptyTag ? '' : selectedTags[0],\n page: DEFAULT_PAGE,\n },\n });\n };\n\n const handleServicesSelect = (selectedServices: string[]) => {\n const forAnalyticsServices = services.filter((service) => {\n return selectedServices.includes(service.value);\n });\n\n const servicesAsStringForAnalytics = forAnalyticsServices\n .map((service) => service.content)\n .join(',');\n\n const event = prepareAnalyticsEvent({\n name: DefaultGoalIds.service,\n counter: AnalyticsCounter.CrossSite,\n });\n handleAnalyticsService(event, {\n service: servicesAsStringForAnalytics,\n });\n\n const servicesAsString = selectedServices.join(',');\n\n handleLoadData({\n page: DEFAULT_PAGE,\n query: {services: servicesAsString, page: DEFAULT_PAGE},\n });\n };\n\n const tagsItems = React.useMemo(\n () => [{value: 'empty', content: i18n(Keyset.AllTags)} as unknown as SelectItem, ...tags],\n [tags],\n );\n\n const servicesItems = React.useMemo(\n () => (servicesInitial ? [...(servicesInitial as string).split(',')] : []),\n [servicesInitial],\n );\n\n return (\n <MobileProvider mobile={false}>\n <div className={b('header')}>\n <h1 className={b('header-item', {title: true})}>{title}</h1>\n <div className={b('header-item', {filters: true})}>\n <div className={b('filter-item')}>\n <Search\n className={b('search')}\n placeholder={i18n(Keyset.Search)}\n initialValue={search && typeof search === 'string' ? search : ''}\n onSubmit={handleSearch}\n />\n </div>\n <div className={b('filter-item')}>\n <Select\n className={b('select')}\n size=\"xl\"\n options={tagsItems}\n defaultValue={[tagInitial] as string[]}\n onUpdate={handleTagSelect}\n placeholder={i18n(Keyset.AllTags)}\n popupClassName={b('popup', {isMobile})}\n renderControl={renderSwitcher({\n initial: [tagInitial],\n list: tagsItems,\n defaultLabel: i18n(Keyset.AllTags),\n })}\n disablePortal\n virtualizationThreshold={VIRTUALIZATION_THRESHOLD}\n renderOption={renderOption}\n />\n </div>\n\n {services.length > 0 ? (\n <div className={b('filter-item')}>\n <Select\n className={b('select')}\n size=\"xl\"\n multiple\n filterable\n hasClear\n disablePortal\n options={services}\n defaultValue={servicesItems}\n popupClassName={b('popup', {isMobile})}\n onUpdate={handleServicesSelect}\n placeholder={i18n(Keyset.AllServices)}\n renderControl={renderSwitcher({\n initial: servicesItems,\n list: services,\n defaultLabel: i18n(Keyset.AllServices),\n qa: 'service-select',\n })}\n virtualizationThreshold={VIRTUALIZATION_THRESHOLD}\n renderOption={renderOption}\n renderFilter={renderFilter}\n />\n </div>\n ) : null}\n {hasLikes ? (\n <div className={b('filter-item', {'width-auto': true})}>\n <Button\n view={'outlined'}\n className={b('saved-only-button', {savedOnly})}\n size=\"xl\"\n onClick={handleSavedOnly}\n selected={savedOnly}\n >\n <Icon\n data={Bookmark}\n size={ICON_SIZE}\n className={b('icon', {savedOnly})}\n />\n {i18n(Keyset.ActionSavedOnly)}\n </Button>\n </div>\n ) : null}\n </div>\n </div>\n </MobileProvider>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"Controls.js","sourceRoot":"../../../../../../src","sources":["components/FeedHeader/components/Controls/Controls.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\n\nimport {Bookmark} from '@gravity-ui/icons';\nimport {useAnalytics} from '@gravity-ui/page-constructor';\nimport {Button, Icon, MobileProvider, Select} from '@gravity-ui/uikit';\n\nimport {LikesContext} from '../../../../contexts/LikesContext';\nimport {MobileContext} from '../../../../contexts/MobileContext';\nimport {Keyset, i18n} from '../../../../i18n';\nimport {\n DefaultEventNames,\n FetchArgs,\n FilterConfig,\n Query,\n SelectItem,\n} from '../../../../models/common';\nimport {block} from '../../../../utils/cn';\nimport {Search} from '../../../Search/Search';\n\nimport {renderFilter, renderOption, renderSwitcher} from './customRenders';\n\nimport './Controls.scss';\n\nconst b = block('feed-controls');\n\nexport type ControlsProps = {\n handleLoadData: (props: FetchArgs) => void;\n filters?: FilterConfig[];\n queryParams: Query;\n title?: string;\n};\n\nconst ICON_SIZE = 16;\nconst DEFAULT_PAGE = 1;\nconst VIRTUALIZATION_THRESHOLD = 1000;\n\nexport const Controls = ({\n handleLoadData,\n filters = [],\n queryParams,\n title = i18n(Keyset.Title),\n}: ControlsProps) => {\n const {hasLikes} = React.useContext(LikesContext);\n const handleAnalyticsSaveOnly = useAnalytics(DefaultEventNames.SaveOnly);\n\n const {savedOnly: savedOnlyInitial, search: searchInitial} = queryParams || {};\n\n const [savedOnly, setSavedOnly] = React.useState<boolean>(savedOnlyInitial === 'true');\n const [search, setSearch] = React.useState<string>(searchInitial as string);\n\n const isMobile = React.useContext(MobileContext);\n\n const handleSavedOnly = () => {\n handleAnalyticsSaveOnly();\n setSavedOnly(!savedOnly);\n handleLoadData({\n page: DEFAULT_PAGE,\n query: {\n savedOnly: savedOnly ? '' : 'true',\n search: '',\n page: DEFAULT_PAGE,\n },\n });\n };\n\n const handleSearch = React.useCallback(\n (searchValue: string) => {\n setSearch(searchValue);\n\n handleLoadData({\n page: DEFAULT_PAGE,\n query: {search: searchValue, page: DEFAULT_PAGE},\n });\n },\n [handleLoadData],\n );\n\n const makeHandleFilterSelect = (filter: FilterConfig) => (selectedValues: string[]) => {\n const query: Query = {page: DEFAULT_PAGE};\n\n if (filter.multiple) {\n query[filter.queryParamName] = selectedValues.join(',');\n } else {\n const isEmpty = selectedValues.some((v) => v === 'empty');\n query[filter.queryParamName] = isEmpty ? '' : selectedValues[0];\n }\n\n handleLoadData({page: DEFAULT_PAGE, query});\n };\n\n return (\n <MobileProvider mobile={false}>\n <div className={b('header')}>\n <h1 className={b('header-item', {title: true})}>{title}</h1>\n <div className={b('header-item', {filters: true})}>\n <div className={b('filter-item')}>\n <Search\n className={b('search')}\n placeholder={i18n(Keyset.Search)}\n initialValue={search && typeof search === 'string' ? search : ''}\n onSubmit={handleSearch}\n />\n </div>\n\n {filters.map((filter) => {\n const initialRaw = queryParams?.[filter.queryParamName];\n\n let defaultValue: string[];\n if (filter.multiple) {\n defaultValue = initialRaw ? (initialRaw as string).split(',') : [];\n } else {\n defaultValue = [initialRaw] as string[];\n }\n\n const itemsWithEmpty: SelectItem[] = filter.multiple\n ? filter.items\n : [\n {value: 'empty', content: filter.allLabel} as SelectItem,\n ...filter.items,\n ];\n\n return (\n <div key={filter.queryParamName} className={b('filter-item')}>\n <Select\n className={b('select')}\n size=\"xl\"\n multiple={filter.multiple}\n filterable={filter.filterable}\n hasClear={filter.hasClear ?? filter.multiple}\n disablePortal\n options={itemsWithEmpty}\n defaultValue={defaultValue}\n popupClassName={b('popup', {isMobile})}\n onUpdate={makeHandleFilterSelect(filter)}\n placeholder={filter.placeholder ?? filter.allLabel}\n renderControl={renderSwitcher({\n initial: defaultValue,\n list: itemsWithEmpty,\n defaultLabel: filter.allLabel,\n qa: filter.qa,\n })}\n virtualizationThreshold={VIRTUALIZATION_THRESHOLD}\n renderOption={renderOption}\n renderFilter={filter.filterable ? renderFilter : undefined}\n />\n </div>\n );\n })}\n\n {hasLikes ? (\n <div className={b('filter-item', {'width-auto': true})}>\n <Button\n view={'outlined'}\n className={b('saved-only-button', {savedOnly})}\n size=\"xl\"\n onClick={handleSavedOnly}\n selected={savedOnly}\n >\n <Icon\n data={Bookmark}\n size={ICON_SIZE}\n className={b('icon', {savedOnly})}\n />\n {i18n(Keyset.ActionSavedOnly)}\n </Button>\n </div>\n ) : null}\n </div>\n </div>\n </MobileProvider>\n );\n};\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SelectProps } from '@gravity-ui/uikit';
|
|
2
|
-
import { SelectItem } from "
|
|
2
|
+
import { SelectItem } from "../../../../models/common.js";
|
|
3
3
|
import './CustomSwitcher.css';
|
|
4
4
|
type RenderControlParameters = Partial<Parameters<Required<SelectProps>['renderControl']>[0]>;
|
|
5
5
|
type TriggerProps = Required<RenderControlParameters>['triggerProps'];
|