utils-refactored
This commit is contained in:
parent
546d1bd743
commit
7c2d97053b
|
@ -4,7 +4,7 @@ import { Icon } from '~/components/_shared/Icon'
|
|||
import { Popover } from '~/components/_shared/Popover'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { MediaItem } from '~/types/mediaitem'
|
||||
import { getDescription } from '~/utils/meta'
|
||||
import { getArticleDescription } from '~/utils/meta'
|
||||
import { SharePopup, getShareUrl } from '../SharePopup'
|
||||
|
||||
import styles from './AudioPlayer.module.scss'
|
||||
|
@ -137,7 +137,7 @@ export const PlayerPlaylist = (props: Props) => {
|
|||
>
|
||||
<SharePopup
|
||||
title={mi.title}
|
||||
description={getDescription(props.body || '')}
|
||||
description={getArticleDescription(props.body || '')}
|
||||
imageUrl={mi.pic || ''}
|
||||
shareUrl={getShareUrl({ pathname: `/${props.articleSlug}` })}
|
||||
trigger={
|
||||
|
|
|
@ -5,7 +5,7 @@ import { useLocalize } from '~/context/localize'
|
|||
import { useReactions } from '~/context/reactions'
|
||||
import { useSession } from '~/context/session'
|
||||
import { Author, Reaction, ReactionKind, ReactionSort } from '~/graphql/schema/core.gen'
|
||||
import { byCreated, byStat } from '~/utils/sortby'
|
||||
import { byCreated, byStat } from '~/lib/sortby'
|
||||
import { Button } from '../_shared/Button'
|
||||
import { ShowIfAuthenticated } from '../_shared/ShowIfAuthenticated'
|
||||
|
||||
|
|
|
@ -10,11 +10,11 @@ import { useReactions } from '~/context/reactions'
|
|||
import { useSession } from '~/context/session'
|
||||
import { DEFAULT_HEADER_OFFSET, useUI } from '~/context/ui'
|
||||
import type { Author, Maybe, Shout, Topic } from '~/graphql/schema/core.gen'
|
||||
import { isCyrillic } from '~/intl/translate'
|
||||
import { getImageUrl, getOpenGraphImageUrl } from '~/lib/getImageUrl'
|
||||
import { MediaItem } from '~/types/mediaitem'
|
||||
import { capitalize } from '~/utils/capitalize'
|
||||
import { getImageUrl, getOpenGraphImageUrl } from '~/utils/getImageUrl'
|
||||
import { getDescription, getKeywords } from '~/utils/meta'
|
||||
import { isCyrillic } from '~/utils/translate'
|
||||
import { getArticleDescription, getArticleKeywords } from '~/utils/meta'
|
||||
import { AuthorBadge } from '../Author/AuthorBadge'
|
||||
import { CardTopic } from '../Feed/CardTopic'
|
||||
import { FeedArticlePopup } from '../Feed/FeedArticlePopup'
|
||||
|
@ -333,9 +333,9 @@ export const FullArticle = (props: Props) => {
|
|||
width: 1200
|
||||
})
|
||||
|
||||
const description = getDescription(props.article.description || body() || media()[0]?.body)
|
||||
const description = getArticleDescription(props.article.description || body() || media()[0]?.body)
|
||||
const ogTitle = props.article.title
|
||||
const keywords = getKeywords(props.article)
|
||||
const keywords = getArticleKeywords(props.article)
|
||||
const shareUrl = getShareUrl({ pathname: `/${props.article.slug}` })
|
||||
const getAuthorName = (a: Author) => {
|
||||
return lang() === 'en' && isCyrillic(a.name || '') ? capitalize(a.slug.replace(/-/, ' ')) : a.name
|
||||
|
|
|
@ -11,9 +11,9 @@ import { useFollowing } from '~/context/following'
|
|||
import { useLocalize } from '~/context/localize'
|
||||
import { useSession } from '~/context/session'
|
||||
import { Author, FollowingEntity } from '~/graphql/schema/core.gen'
|
||||
import { isCyrillic } from '~/intl/translate'
|
||||
import { translit } from '~/intl/translit'
|
||||
import { mediaMatches } from '~/utils/media-query'
|
||||
import { translit } from '~/utils/ru2en'
|
||||
import { isCyrillic } from '~/utils/translate'
|
||||
import { Userpic } from '../Userpic'
|
||||
import styles from './AuthorBadge.module.scss'
|
||||
|
||||
|
|
|
@ -9,9 +9,8 @@ import { FollowsFilter, useFollowing } from '~/context/following'
|
|||
import { useLocalize } from '~/context/localize'
|
||||
import { useSession } from '~/context/session'
|
||||
import { FollowingEntity, Topic } from '~/graphql/schema/core.gen'
|
||||
import { isAuthor } from '~/utils/isAuthor'
|
||||
import { translit } from '~/utils/ru2en'
|
||||
import { isCyrillic } from '~/utils/translate'
|
||||
import { isCyrillic } from '~/intl/translate'
|
||||
import { translit } from '~/intl/translit'
|
||||
import { SharePopup, getShareUrl } from '../../Article/SharePopup'
|
||||
import { Modal } from '../../Nav/Modal'
|
||||
import { TopicBadge } from '../../Topic/TopicBadge'
|
||||
|
@ -164,10 +163,10 @@ export const AuthorCard = (props: Props) => {
|
|||
<div class="col-24">
|
||||
<For each={authorSubs()}>
|
||||
{(subscription) =>
|
||||
isAuthor(subscription) ? (
|
||||
<AuthorBadge author={subscription} subscriptionsMode={true} />
|
||||
'name' in subscription ? (
|
||||
<AuthorBadge author={subscription as Author} subscriptionsMode={true} />
|
||||
) : (
|
||||
<TopicBadge topic={subscription} subscriptionsMode={true} />
|
||||
<TopicBadge topic={subscription as Topic} subscriptionsMode={true} />
|
||||
)
|
||||
}
|
||||
</For>
|
||||
|
|
|
@ -3,9 +3,9 @@ import { createMemo } from 'solid-js'
|
|||
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { Author } from '~/graphql/schema/core.gen'
|
||||
import { isCyrillic } from '~/intl/translate'
|
||||
import { translit } from '~/intl/translit'
|
||||
import { capitalize } from '~/utils/capitalize'
|
||||
import { translit } from '~/utils/ru2en'
|
||||
import { isCyrillic } from '~/utils/translate'
|
||||
import { Userpic } from '../Userpic'
|
||||
|
||||
import styles from './AhtorLink.module.scss'
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
import type { Editor } from '@tiptap/core'
|
||||
|
||||
import { renderUploadedImage } from '~/components/Editor/renderUploadedImage'
|
||||
import { Icon } from '~/components/_shared/Icon'
|
||||
import { Popover } from '~/components/_shared/Popover'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { UploadedFile } from '~/types/upload'
|
||||
import { renderUploadedImage } from '~/utils/renderUploadedImage'
|
||||
import { Modal } from '../../Nav/Modal'
|
||||
import { UploadModalContent } from '../UploadModalContent'
|
||||
|
||||
|
|
|
@ -34,7 +34,7 @@ import { useEditorContext } from '~/context/editor'
|
|||
import { useLocalize } from '~/context/localize'
|
||||
import { useSession } from '~/context/session'
|
||||
import { useSnackbar } from '~/context/ui'
|
||||
import { handleImageUpload } from '~/utils/handleImageUpload'
|
||||
import { handleImageUpload } from '~/lib/handleImageUpload'
|
||||
|
||||
import { BlockquoteBubbleMenu, FigureBubbleMenu, IncutBubbleMenu } from './BubbleMenu'
|
||||
import { EditorFloatingMenu } from './EditorFloatingMenu'
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
import type { Editor } from '@tiptap/core'
|
||||
import { Show, createEffect, createSignal } from 'solid-js'
|
||||
|
||||
import { renderUploadedImage } from '~/components/Editor/renderUploadedImage'
|
||||
import { Icon } from '~/components/_shared/Icon'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { useUI } from '~/context/ui'
|
||||
import { UploadedFile } from '~/types/upload'
|
||||
import { renderUploadedImage } from '~/utils/renderUploadedImage'
|
||||
import { useOutsideClickHandler } from '~/utils/useOutsideClickHandler'
|
||||
import { Modal } from '../../Nav/Modal'
|
||||
import { InlineForm } from '../InlineForm'
|
||||
|
|
|
@ -8,8 +8,8 @@ import { Loading } from '~/components/_shared/Loading'
|
|||
import { useLocalize } from '~/context/localize'
|
||||
import { useSession } from '~/context/session'
|
||||
import { useUI } from '~/context/ui'
|
||||
import { handleImageUpload } from '~/lib/handleImageUpload'
|
||||
import { UploadedFile } from '~/types/upload'
|
||||
import { handleImageUpload } from '~/utils/handleImageUpload'
|
||||
import { verifyImg } from '~/utils/verifyImg'
|
||||
import { InlineForm } from '../InlineForm'
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ import { useLocalize } from '~/context/localize'
|
|||
import { useSession } from '~/context/session'
|
||||
import type { Author, Maybe, Shout, Topic } from '~/graphql/schema/core.gen'
|
||||
import { capitalize } from '~/utils/capitalize'
|
||||
import { getDescription } from '~/utils/meta'
|
||||
import { getArticleDescription } from '~/utils/meta'
|
||||
import { CoverImage } from '../../Article/CoverImage'
|
||||
import { SharePopup, getShareUrl } from '../../Article/SharePopup'
|
||||
import { ShoutRatingControl } from '../../Article/ShoutRatingControl'
|
||||
|
@ -109,7 +109,7 @@ export const ArticleCard = (props: ArticleCardProps) => {
|
|||
const [isActionPopupActive, setIsActionPopupActive] = createSignal(false)
|
||||
const [isCoverImageLoadError, setIsCoverImageLoadError] = createSignal(false)
|
||||
const [isCoverImageLoading, setIsCoverImageLoading] = createSignal(true)
|
||||
const description = getDescription(props.article?.body)
|
||||
const description = getArticleDescription(props.article?.body)
|
||||
const aspectRatio: Accessor<string> = () => LAYOUT_ASPECT[props.article?.layout as string]
|
||||
const [mainTopicTitle, mainTopicSlug] = getMainTopicTitle(props.article, lang())
|
||||
const { title, subtitle } = getTitleAndSubtitle(props.article)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { clsx } from 'clsx'
|
||||
import { Show, createMemo } from 'solid-js'
|
||||
|
||||
import { getImageUrl } from '~/utils/getImageUrl'
|
||||
import { getImageUrl } from '~/lib/getImageUrl'
|
||||
import './DialogCard.module.scss'
|
||||
|
||||
import styles from './DialogAvatar.module.scss'
|
||||
|
|
|
@ -6,8 +6,8 @@ import { useSession } from '~/context/session'
|
|||
import { useTopics } from '~/context/topics'
|
||||
import { useUI } from '~/context/ui'
|
||||
import type { Topic } from '../../../graphql/schema/core.gen'
|
||||
import { getRandomTopicsFromArray } from '../../../utils/getRandomTopicsFromArray'
|
||||
import { getDescription } from '../../../utils/meta'
|
||||
import { getRandomTopicsFromArray } from '../../../lib/getRandomTopicsFromArray'
|
||||
import { getArticleDescription } from '../../../utils/meta'
|
||||
import { SharePopup, getShareUrl } from '../../Article/SharePopup'
|
||||
import { Icon } from '../../_shared/Icon'
|
||||
import { Newsletter } from '../../_shared/Newsletter'
|
||||
|
@ -340,7 +340,7 @@ export const Header = (props: Props) => {
|
|||
title={props.title || ''}
|
||||
imageUrl={props.cover || ''}
|
||||
shareUrl={getShareUrl()}
|
||||
description={getDescription(props.articleBody || '')}
|
||||
description={getArticleDescription(props.articleBody?.slice(0, 100) || '')}
|
||||
onVisibilityChange={(isVisible) => {
|
||||
setIsSharePopupVisible(isVisible)
|
||||
}}
|
||||
|
|
|
@ -7,8 +7,8 @@ import { Button } from '~/components/_shared/Button'
|
|||
import { Icon } from '~/components/_shared/Icon'
|
||||
import { useFeed } from '~/context/feed'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { byScore } from '~/lib/sortby'
|
||||
import { restoreScrollPosition, saveScrollPosition } from '~/utils/scroll'
|
||||
import { byScore } from '~/utils/sortby'
|
||||
import { FEED_PAGE_SIZE } from '../../Views/Feed/Feed'
|
||||
|
||||
import { SearchResultItem } from './SearchResultItem'
|
||||
|
|
|
@ -19,10 +19,10 @@ import { useProfile } from '~/context/profile'
|
|||
import { useSession } from '~/context/session'
|
||||
import { useSnackbar, useUI } from '~/context/ui'
|
||||
import { InputMaybe, ProfileInput } from '~/graphql/schema/core.gen'
|
||||
import { getImageUrl } from '~/lib/getImageUrl'
|
||||
import { handleImageUpload } from '~/lib/handleImageUpload'
|
||||
import { profileSocialLinks } from '~/lib/profileSocialLinks'
|
||||
import { clone } from '~/utils/clone'
|
||||
import { getImageUrl } from '~/utils/getImageUrl'
|
||||
import { handleImageUpload } from '~/utils/handleImageUpload'
|
||||
import { profileSocialLinks } from '~/utils/profileSocialLinks'
|
||||
import { validateUrl } from '~/utils/validateUrl'
|
||||
import { Modal } from '../Nav/Modal'
|
||||
import { ProfileSettingsNavigation } from '../Nav/ProfileSettingsNavigation'
|
||||
|
|
|
@ -6,8 +6,8 @@ import { useFollowing } from '~/context/following'
|
|||
import { useLocalize } from '~/context/localize'
|
||||
import { useSession } from '~/context/session'
|
||||
import { FollowingEntity, Topic } from '~/graphql/schema/core.gen'
|
||||
import { getImageUrl } from '~/lib/getImageUrl'
|
||||
import { capitalize } from '~/utils/capitalize'
|
||||
import { getImageUrl } from '~/utils/getImageUrl'
|
||||
import { mediaMatches } from '~/utils/media-query'
|
||||
import styles from './TopicBadge.module.scss'
|
||||
|
||||
|
|
|
@ -4,15 +4,15 @@ import { clsx } from 'clsx'
|
|||
import { For, Show, createMemo, createSignal, onMount } from 'solid-js'
|
||||
import { Loading } from '~/components/_shared/Loading'
|
||||
import { SearchField } from '~/components/_shared/SearchField'
|
||||
import enKeywords from '~/config/locales/en/keywords.json'
|
||||
import ruKeywords from '~/config/locales/ru/keywords.json'
|
||||
import { type SortFunction, useAuthors } from '~/context/authors'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import type { Author } from '~/graphql/schema/core.gen'
|
||||
import { getImageUrl } from '~/utils/getImageUrl'
|
||||
import enKeywords from '~/intl/locales/en/keywords.json'
|
||||
import ruKeywords from '~/intl/locales/ru/keywords.json'
|
||||
import { authorLetterReduce, translateAuthor } from '~/intl/translate'
|
||||
import { getImageUrl } from '~/lib/getImageUrl'
|
||||
import { byFirstChar, byStat } from '~/lib/sortby'
|
||||
import { scrollHandler } from '~/utils/scroll'
|
||||
import { byFirstChar, byStat } from '~/utils/sortby'
|
||||
import { authorLetterReduce, translateAuthor } from '~/utils/translate'
|
||||
import { AuthorsList } from '../../AuthorsList'
|
||||
import styles from './AllAuthors.module.scss'
|
||||
|
||||
|
|
|
@ -4,14 +4,14 @@ import { clsx } from 'clsx'
|
|||
import { For, Show, createEffect, createMemo, createSignal, on, onMount } from 'solid-js'
|
||||
import { Loading } from '~/components/_shared/Loading'
|
||||
import { SearchField } from '~/components/_shared/SearchField'
|
||||
import enKeywords from '~/config/locales/en/keywords.json'
|
||||
import ruKeywords from '~/config/locales/ru/keywords.json'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { useTopics } from '~/context/topics'
|
||||
import type { Topic } from '~/graphql/schema/core.gen'
|
||||
import enKeywords from '~/intl/locales/en/keywords.json'
|
||||
import ruKeywords from '~/intl/locales/ru/keywords.json'
|
||||
import { dummyFilter } from '~/lib/dummyFilter'
|
||||
import { getImageUrl } from '~/lib/getImageUrl'
|
||||
import { capitalize } from '~/utils/capitalize'
|
||||
import { dummyFilter } from '~/utils/dummyFilter'
|
||||
import { getImageUrl } from '~/utils/getImageUrl'
|
||||
import { scrollHandler } from '~/utils/scroll'
|
||||
import { TopicBadge } from '../../Topic/TopicBadge'
|
||||
import styles from './AllTopics.module.scss'
|
||||
|
|
|
@ -15,10 +15,10 @@ import getAuthorFollowersQuery from '~/graphql/query/core/author-followers'
|
|||
import getAuthorFollowsQuery from '~/graphql/query/core/author-follows'
|
||||
import loadReactionsBy from '~/graphql/query/core/reactions-load-by'
|
||||
import type { Author, Reaction, Shout, Topic } from '~/graphql/schema/core.gen'
|
||||
import { getImageUrl } from '~/utils/getImageUrl'
|
||||
import { getDescription } from '~/utils/meta'
|
||||
import { getImageUrl } from '~/lib/getImageUrl'
|
||||
import { byCreated } from '~/lib/sortby'
|
||||
import { getArticleDescription } from '~/utils/meta'
|
||||
import { restoreScrollPosition, saveScrollPosition } from '~/utils/scroll'
|
||||
import { byCreated } from '~/utils/sortby'
|
||||
import { splitToPages } from '~/utils/splitToPages'
|
||||
import stylesArticle from '../../Article/Article.module.scss'
|
||||
import { Comment } from '../../Article/Comment'
|
||||
|
@ -156,7 +156,7 @@ export const AuthorView = (props: Props) => {
|
|||
? getImageUrl(author()?.pic || '', { width: 1200 })
|
||||
: getImageUrl('production/image/logo_image.png')
|
||||
)
|
||||
const description = createMemo(() => getDescription(author()?.bio || ''))
|
||||
const description = createMemo(() => getArticleDescription(author()?.bio || ''))
|
||||
const handleDeleteComment = (id: number) => {
|
||||
setCommented((prev) => (prev || []).filter((comment) => comment.id !== id))
|
||||
}
|
||||
|
|
|
@ -24,12 +24,12 @@ import { useGraphQL } from '~/context/graphql'
|
|||
import { useLocalize } from '~/context/localize'
|
||||
import getMyShoutQuery from '~/graphql/query/core/article-my'
|
||||
import type { Shout, Topic } from '~/graphql/schema/core.gen'
|
||||
import { slugify } from '~/intl/translit'
|
||||
import { getImageUrl } from '~/lib/getImageUrl'
|
||||
import { LayoutType } from '~/types/common'
|
||||
import { MediaItem } from '~/types/mediaitem'
|
||||
import { clone } from '~/utils/clone'
|
||||
import { getImageUrl } from '~/utils/getImageUrl'
|
||||
import { isDesktop } from '~/utils/media-query'
|
||||
import { slugify } from '~/utils/slugify'
|
||||
import { Editor, Panel } from '../../Editor'
|
||||
import { AudioUploader } from '../../Editor/AudioUploader'
|
||||
import { AutoSaveNotice } from '../../Editor/AutoSaveNotice'
|
||||
|
|
|
@ -8,8 +8,6 @@ import { Icon } from '~/components/_shared/Icon'
|
|||
import { InviteMembers } from '~/components/_shared/InviteMembers'
|
||||
import { Loading } from '~/components/_shared/Loading'
|
||||
import { ShareModal } from '~/components/_shared/ShareModal'
|
||||
import ruKeywords from '~/config/locales/ru/keywords.json'
|
||||
import enKeywords from '~/config/locales/ru/keywords.json'
|
||||
import { useAuthors } from '~/context/authors'
|
||||
import { useGraphQL } from '~/context/graphql'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
|
@ -19,9 +17,11 @@ import { useTopics } from '~/context/topics'
|
|||
import { useUI } from '~/context/ui'
|
||||
import { loadUnratedShouts } from '~/graphql/api/private'
|
||||
import type { Author, Reaction, Shout } from '~/graphql/schema/core.gen'
|
||||
import ruKeywords from '~/intl/locales/ru/keywords.json'
|
||||
import enKeywords from '~/intl/locales/ru/keywords.json'
|
||||
import { getImageUrl } from '~/lib/getImageUrl'
|
||||
import { byCreated } from '~/lib/sortby'
|
||||
import { FeedSearchParams } from '~/routes/feed/[...feed]'
|
||||
import { getImageUrl } from '~/utils/getImageUrl'
|
||||
import { byCreated } from '~/utils/sortby'
|
||||
import { CommentDate } from '../../Article/CommentDate'
|
||||
import { getShareUrl } from '../../Article/SharePopup'
|
||||
import { AuthorBadge } from '../../Author/AuthorBadge'
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
import { For, Show, createEffect, createMemo, createSignal, on } from 'solid-js'
|
||||
|
||||
import { Meta } from '@solidjs/meta'
|
||||
import enKeywords from '~/config/locales/en/keywords.json'
|
||||
import ruKeywords from '~/config/locales/ru/keywords.json'
|
||||
import { useAuthors } from '~/context/authors'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { useTopics } from '~/context/topics'
|
||||
import { loadShouts } from '~/graphql/api/public'
|
||||
import { Author, Shout, Topic } from '~/graphql/schema/core.gen'
|
||||
import enKeywords from '~/intl/locales/en/keywords.json'
|
||||
import ruKeywords from '~/intl/locales/ru/keywords.json'
|
||||
import { SHOUTS_PER_PAGE } from '~/routes/(home)'
|
||||
import { capitalize } from '~/utils/capitalize'
|
||||
import { splitToPages } from '~/utils/splitToPages'
|
||||
|
|
|
@ -6,8 +6,7 @@ import { SearchField } from '~/components/_shared/SearchField'
|
|||
import { FollowsFilter, useFollowing } from '~/context/following'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { Author, Topic } from '~/graphql/schema/core.gen'
|
||||
import { dummyFilter } from '~/utils/dummyFilter'
|
||||
import { isAuthor } from '~/utils/isAuthor'
|
||||
import { dummyFilter } from '~/lib/dummyFilter'
|
||||
import { AuthorBadge } from '../../Author/AuthorBadge'
|
||||
import { ProfileSettingsNavigation } from '../../Nav/ProfileSettingsNavigation'
|
||||
import { TopicBadge } from '../../Topic/TopicBadge'
|
||||
|
@ -100,10 +99,10 @@ export const ProfileSubscriptions = () => {
|
|||
<For each={filtered()}>
|
||||
{(followingItem) => (
|
||||
<div>
|
||||
{isAuthor(followingItem) ? (
|
||||
<AuthorBadge minimize={true} author={followingItem} />
|
||||
{'name' in followingItem ? (
|
||||
<AuthorBadge minimize={true} author={followingItem as Author} />
|
||||
) : (
|
||||
<TopicBadge minimize={true} topic={followingItem} />
|
||||
<TopicBadge minimize={true} topic={followingItem as Topic} />
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
|
|
|
@ -5,8 +5,6 @@ import { clsx } from 'clsx'
|
|||
import { For, Show, createEffect, createMemo, createSignal, on, onMount } from 'solid-js'
|
||||
|
||||
import { useSearchParams } from '@solidjs/router'
|
||||
import enKeywords from '~/config/locales/en/keywords.json'
|
||||
import ruKeywords from '~/config/locales/ru/keywords.json'
|
||||
import { useAuthors } from '~/context/authors'
|
||||
import { useFeed } from '~/context/feed'
|
||||
import { useGraphQL } from '~/context/graphql'
|
||||
|
@ -16,10 +14,12 @@ import getRandomTopShoutsQuery from '~/graphql/query/core/articles-load-random-t
|
|||
import loadShoutsRandomQuery from '~/graphql/query/core/articles-load-random-topic'
|
||||
import loadAuthorsByQuery from '~/graphql/query/core/authors-load-by'
|
||||
import getTopicFollowersQuery from '~/graphql/query/core/topic-followers'
|
||||
import enKeywords from '~/intl/locales/en/keywords.json'
|
||||
import ruKeywords from '~/intl/locales/ru/keywords.json'
|
||||
import { getImageUrl } from '~/lib/getImageUrl'
|
||||
import { capitalize } from '~/utils/capitalize'
|
||||
import { getImageUrl } from '~/utils/getImageUrl'
|
||||
import { getUnixtime } from '~/utils/getServerDate'
|
||||
import { getDescription } from '~/utils/meta'
|
||||
import { getArticleDescription } from '~/utils/meta'
|
||||
import { restoreScrollPosition, saveScrollPosition } from '~/utils/scroll'
|
||||
import { splitToPages } from '~/utils/splitToPages'
|
||||
import styles from '../../styles/Topic.module.scss'
|
||||
|
@ -161,7 +161,7 @@ export const TopicView = (props: Props) => {
|
|||
: getImageUrl('production/image/logo_image.png')
|
||||
const description = () =>
|
||||
topic()?.body
|
||||
? getDescription(topic()?.body || '')
|
||||
? getArticleDescription(topic()?.body || '')
|
||||
: t('The most interesting publications on the topic', { topicName: title() })
|
||||
|
||||
return (
|
||||
|
|
|
@ -4,8 +4,8 @@ import { JSX, Show, createSignal } from 'solid-js'
|
|||
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { useSession } from '~/context/session'
|
||||
import { handleFileUpload } from '~/utils/handleFileUpload'
|
||||
import { handleImageUpload } from '~/utils/handleImageUpload'
|
||||
import { handleFileUpload } from '~/lib/handleFileUpload'
|
||||
import { handleImageUpload } from '~/lib/handleImageUpload'
|
||||
import { validateFiles } from '~/utils/validateFile'
|
||||
|
||||
import styles from './DropArea.module.scss'
|
||||
|
|
|
@ -3,7 +3,7 @@ import type { JSX } from 'solid-js'
|
|||
import { Link } from '@solidjs/meta'
|
||||
import { splitProps } from 'solid-js'
|
||||
|
||||
import { getImageUrl } from '~/utils/getImageUrl'
|
||||
import { getImageUrl } from '~/lib/getImageUrl'
|
||||
|
||||
type Props = JSX.ImgHTMLAttributes<HTMLImageElement> & {
|
||||
width: number
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { clsx } from 'clsx'
|
||||
import { Show, createEffect, createMemo, createSignal, on, onCleanup } from 'solid-js'
|
||||
|
||||
import { getImageUrl } from '~/utils/getImageUrl'
|
||||
import { getImageUrl } from '~/lib/getImageUrl'
|
||||
import { useEscKeyDownHandler } from '~/utils/useEscKeyDownHandler'
|
||||
import { Icon } from '../Icon'
|
||||
|
||||
|
|
|
@ -6,9 +6,9 @@ import { Manipulation, Navigation, Pagination } from 'swiper/modules'
|
|||
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { useSnackbar } from '~/context/ui'
|
||||
import { getImageUrl } from '~/lib/getImageUrl'
|
||||
import { handleImageUpload } from '~/lib/handleImageUpload'
|
||||
import { composeMediaItems } from '~/utils/composeMediaItems'
|
||||
import { getImageUrl } from '~/utils/getImageUrl'
|
||||
import { handleImageUpload } from '~/utils/handleImageUpload'
|
||||
import { validateFiles } from '~/utils/validateFile'
|
||||
import { DropArea } from '../DropArea'
|
||||
import { Icon } from '../Icon'
|
||||
|
|
|
@ -4,8 +4,8 @@ import SwiperCore from 'swiper'
|
|||
import { HashNavigation, Manipulation, Navigation, Pagination } from 'swiper/modules'
|
||||
import { throttle } from 'throttle-debounce'
|
||||
|
||||
import { getImageUrl } from '~/lib/getImageUrl'
|
||||
import { MediaItem } from '~/types/mediaitem'
|
||||
import { getImageUrl } from '~/utils/getImageUrl'
|
||||
import { Icon } from '../Icon'
|
||||
import { Image } from '../Image'
|
||||
import { SwiperRef } from './swiper'
|
||||
|
|
|
@ -5,7 +5,7 @@ import { EventSource } from 'extended-eventsource'
|
|||
import { createContext, createEffect, createSignal, on, useContext } from 'solid-js'
|
||||
|
||||
import { Chat, Message } from '~/graphql/schema/chat.gen'
|
||||
import { sseUrl } from '../config/config'
|
||||
import { sseUrl } from '../config'
|
||||
import { useSession } from './session'
|
||||
|
||||
const RECONNECT_TIMES = 2
|
||||
|
|
|
@ -1,15 +1,14 @@
|
|||
import type { JSX } from 'solid-js'
|
||||
|
||||
import { useMatch, useNavigate } from '@solidjs/router'
|
||||
import { Editor } from '@tiptap/core'
|
||||
import type { JSX } from 'solid-js'
|
||||
import { Accessor, createContext, createSignal, useContext } from 'solid-js'
|
||||
import { SetStoreFunction, createStore } from 'solid-js/store'
|
||||
import { useSnackbar } from '~/context/ui'
|
||||
import deleteShoutQuery from '~/graphql/mutation/core/article-delete'
|
||||
import updateShoutQuery from '~/graphql/mutation/core/article-update'
|
||||
import { Topic, TopicInput } from '~/graphql/schema/core.gen'
|
||||
import { slugify } from '~/intl/translit'
|
||||
import { useFeed } from '../context/feed'
|
||||
import { slugify } from '../utils/slugify'
|
||||
import { useGraphQL } from './graphql'
|
||||
import { useLocalize } from './localize'
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ import {
|
|||
Shout,
|
||||
Topic
|
||||
} from '~/graphql/schema/core.gen'
|
||||
import { byStat } from '../utils/sortby'
|
||||
import { byStat } from '../lib/sortby'
|
||||
import { useGraphQL } from './graphql'
|
||||
|
||||
export const PRERENDERED_ARTICLES_COUNT = 5
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { Client, ClientOptions, cacheExchange, createClient, fetchExchange } from '@urql/core'
|
||||
import { createContext, createEffect, createSignal, on, useContext } from 'solid-js'
|
||||
import { JSX } from 'solid-js/jsx-runtime'
|
||||
import { chatApiUrl, coreApiUrl } from '../config/config'
|
||||
import { chatApiUrl, coreApiUrl } from '../config'
|
||||
import { useSession } from './session'
|
||||
|
||||
type GraphQLClientContextType = Record<string, Client>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import type { Accessor, JSX } from 'solid-js'
|
||||
import { createContext, createSignal, useContext } from 'solid-js'
|
||||
import { chatApiUrl } from '~/config/config'
|
||||
import { chatApiUrl } from '~/config'
|
||||
import { useGraphQL } from '~/context/graphql'
|
||||
import createChatMutation from '~/graphql/mutation/chat/chat-create'
|
||||
import createMessageMutation from '~/graphql/mutation/chat/chat-message-create'
|
||||
|
|
|
@ -10,7 +10,7 @@ import {
|
|||
onMount,
|
||||
useContext
|
||||
} from 'solid-js'
|
||||
import { TimeAgo, type i18n, i18next, i18nextInit } from '~/utils/i18next'
|
||||
import { TimeAgo, type i18n, i18next, i18nextInit } from '~/intl/i18next'
|
||||
|
||||
i18nextInit()
|
||||
|
||||
|
@ -87,7 +87,7 @@ export const LocalizeProvider = (props: { children: JSX.Element }) => {
|
|||
try {
|
||||
return i18next.t(...args)
|
||||
} catch (_) {
|
||||
return args?.length > 0 ? args[0] as string : ''
|
||||
return args?.length > 0 ? (args[0] as string) : ''
|
||||
}
|
||||
}) as i18n['t'],
|
||||
lang,
|
||||
|
|
|
@ -25,7 +25,7 @@ import {
|
|||
useContext
|
||||
} from 'solid-js'
|
||||
import { type AuthModalSource, useSnackbar, useUI } from '~/context/ui'
|
||||
import { authApiUrl } from '../config/config'
|
||||
import { authApiUrl } from '../config'
|
||||
import { useLocalize } from './localize'
|
||||
|
||||
const defaultConfig: ConfigType = {
|
||||
|
|
|
@ -12,8 +12,8 @@ import {
|
|||
} from 'solid-js'
|
||||
import { loadTopics } from '~/graphql/api/public'
|
||||
import { Topic } from '~/graphql/schema/core.gen'
|
||||
import { getRandomTopicsFromArray } from '~/utils/getRandomTopicsFromArray'
|
||||
import { byTopicStatDesc } from '../utils/sortby'
|
||||
import { getRandomTopicsFromArray } from '~/lib/getRandomTopicsFromArray'
|
||||
import { byTopicStatDesc } from '../lib/sortby'
|
||||
|
||||
type TopicsContextType = {
|
||||
topicEntities: Accessor<{ [topicSlug: string]: Topic }>
|
||||
|
|
|
@ -4,8 +4,8 @@ import ICU from 'i18next-icu'
|
|||
import TimeAgo from 'javascript-time-ago'
|
||||
import enTime from 'javascript-time-ago/locale/en'
|
||||
import ruTime from 'javascript-time-ago/locale/ru'
|
||||
import en from '~/config/locales/en/translation.json'
|
||||
import ru from '~/config/locales/ru/translation.json'
|
||||
import en from '~/intl/locales/en/translation.json'
|
||||
import ru from '~/intl/locales/ru/translation.json'
|
||||
|
||||
TimeAgo.addLocale(enTime)
|
||||
TimeAgo.addLocale(ruTime)
|
|
@ -1,6 +1,6 @@
|
|||
import { Author } from '~/graphql/schema/core.gen'
|
||||
import { capitalize } from './capitalize'
|
||||
import { translit } from './ru2en'
|
||||
import { capitalize } from '~/utils/capitalize'
|
||||
import { translit } from './translit'
|
||||
|
||||
export const isCyrillic = (s: string): boolean => {
|
||||
const cyrillicRegex = /[\u0400-\u04FF]/ // Range for Cyrillic characters
|
|
@ -1,4 +1,4 @@
|
|||
import translitConfig from '../config/translit.json'
|
||||
import translitConfig from './abc-translit.json'
|
||||
|
||||
const ru2en: { [key: string]: string } = translitConfig
|
||||
|
||||
|
@ -15,3 +15,9 @@ export const translit = (str: string) => {
|
|||
|
||||
return [...str].map((c) => ru2en[c] || c).join('')
|
||||
}
|
||||
|
||||
export const slugify = (text: string) => {
|
||||
return translit(text.toLowerCase())
|
||||
.replaceAll(' ', '-')
|
||||
.replaceAll(/[^\da-z]/g, '')
|
||||
}
|
|
@ -1,7 +1,5 @@
|
|||
import type { Author, Topic } from '~/graphql/schema/core.gen'
|
||||
|
||||
import { isAuthor } from './isAuthor'
|
||||
import { translit } from './ru2en'
|
||||
import { translit } from '../intl/translit'
|
||||
|
||||
const prepareQuery = (searchQuery: string, lang: string) => {
|
||||
const q = searchQuery.toLowerCase()
|
||||
|
@ -33,7 +31,7 @@ export const dummyFilter = <T extends Topic | Author>(
|
|||
return stringMatches(item?.title || '', q, lang)
|
||||
}
|
||||
|
||||
if (isAuthor(item)) {
|
||||
if ('name' in item) {
|
||||
return stringMatches(item?.name || '', q, lang) || (item.bio && stringMatches(item.bio, q, lang))
|
||||
}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
import { cdnUrl, thumborUrl } from '../config/config'
|
||||
import { cdnUrl, thumborUrl } from '../config'
|
||||
|
||||
const URL_CONFIG = {
|
||||
cdnUrl: cdnUrl,
|
|
@ -1,5 +1,5 @@
|
|||
import { UploadFile } from '@solid-primitives/upload'
|
||||
import { coreApiUrl } from '../config/config'
|
||||
import { coreApiUrl } from '../config'
|
||||
|
||||
const apiUrl = `${coreApiUrl}/upload`
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
import { UploadFile } from '@solid-primitives/upload'
|
||||
import { thumborUrl } from '../config/config'
|
||||
import { thumborUrl } from '../config'
|
||||
|
||||
export const handleImageUpload = async (uploadFile: UploadFile, token: string) => {
|
||||
const formData = new FormData()
|
|
@ -2,8 +2,8 @@ import { type RouteDefinition, type RouteSectionProps, createAsync } from '@soli
|
|||
import { Show, Suspense, createSignal, onMount } from 'solid-js'
|
||||
import { loadShouts } from '~/graphql/api/public'
|
||||
import { LoadShoutsOptions } from '~/graphql/schema/core.gen'
|
||||
import { byStat } from '~/lib/sortby'
|
||||
import { restoreScrollPosition, saveScrollPosition } from '~/utils/scroll'
|
||||
import { byStat } from '~/utils/sortby'
|
||||
import { HomeView, HomeViewProps } from '../components/Views/Home'
|
||||
import { Loading } from '../components/_shared/Loading'
|
||||
import { PageLayout } from '../components/_shared/PageLayout'
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
import { Meta } from '@solidjs/meta'
|
||||
import { createMemo } from 'solid-js'
|
||||
import { StaticPage } from '~/components/Views/StaticPage'
|
||||
import enKeywords from '~/config/locales/en/keywords.json'
|
||||
import ruKeywords from '~/config/locales/ru/keywords.json'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { getImageUrl } from '~/utils/getImageUrl'
|
||||
import enKeywords from '~/intl/locales/en/keywords.json'
|
||||
import ruKeywords from '~/intl/locales/ru/keywords.json'
|
||||
import { getImageUrl } from '~/lib/getImageUrl'
|
||||
|
||||
export default () => {
|
||||
const { t, lang } = useLocalize()
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { Meta } from '@solidjs/meta'
|
||||
import { StaticPage } from '~/components/Views/StaticPage'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { getImageUrl } from '~/utils/getImageUrl'
|
||||
import { getImageUrl } from '~/lib/getImageUrl'
|
||||
|
||||
export const DiscussionRulesPage = () => {
|
||||
const { t } = useLocalize()
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
import { Meta } from '@solidjs/meta'
|
||||
import { createMemo } from 'solid-js'
|
||||
import { StaticPage } from '~/components/Views/StaticPage'
|
||||
import enKeywords from '~/config/locales/en/keywords.json'
|
||||
import ruKeywords from '~/config/locales/ru/keywords.json'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { getImageUrl } from '~/utils/getImageUrl'
|
||||
import enKeywords from '~/intl/locales/en/keywords.json'
|
||||
import ruKeywords from '~/intl/locales/ru/keywords.json'
|
||||
import { getImageUrl } from '~/lib/getImageUrl'
|
||||
|
||||
export const PrinciplesPage = () => {
|
||||
const { t, lang } = useLocalize()
|
||||
|
|
|
@ -5,7 +5,7 @@ import Opener from '~/components/Nav/Modal/Opener'
|
|||
import { StaticPage } from '~/components/Views/StaticPage'
|
||||
import { Newsletter } from '~/components/_shared/Newsletter'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { getImageUrl } from '~/utils/getImageUrl'
|
||||
import { getImageUrl } from '~/lib/getImageUrl'
|
||||
|
||||
export const ManifestPage = () => {
|
||||
const { t } = useLocalize()
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { Meta } from '@solidjs/meta'
|
||||
import { StaticPage } from '~/components/Views/StaticPage'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { getImageUrl } from '~/utils/getImageUrl'
|
||||
import { getImageUrl } from '~/lib/getImageUrl'
|
||||
|
||||
export const PartnersPage = () => {
|
||||
const { t } = useLocalize()
|
||||
|
|
|
@ -2,7 +2,7 @@ import { Meta } from '@solidjs/meta'
|
|||
import { Donate } from '~/components/Discours/Donate'
|
||||
import { StaticPage } from '~/components/Views/StaticPage'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { getImageUrl } from '~/utils/getImageUrl'
|
||||
import { getImageUrl } from '~/lib/getImageUrl'
|
||||
|
||||
export const SupportPage = () => {
|
||||
const { t } = useLocalize()
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { Meta } from '@solidjs/meta'
|
||||
import { StaticPage } from '~/components/Views/StaticPage'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { getImageUrl } from '~/utils/getImageUrl'
|
||||
import { getImageUrl } from '~/lib/getImageUrl'
|
||||
|
||||
export const ThanksPage = () => {
|
||||
const { t } = useLocalize()
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { Meta } from '@solidjs/meta'
|
||||
import { StaticPage } from '~/components/Views/StaticPage'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { getImageUrl } from '~/utils/getImageUrl'
|
||||
import { getImageUrl } from '~/lib/getImageUrl'
|
||||
|
||||
export const TermsOfUsePage = () => {
|
||||
const { t } = useLocalize()
|
||||
|
|
|
@ -2,7 +2,7 @@ import { RouteSectionProps, createAsync, useLocation, useParams } from '@solidjs
|
|||
import { ErrorBoundary, Suspense, createMemo, createReaction, createSignal, onMount } from 'solid-js'
|
||||
import { FourOuFourView } from '~/components/Views/FourOuFour'
|
||||
import { Loading } from '~/components/_shared/Loading'
|
||||
import { gaIdentity } from '~/config/config'
|
||||
import { gaIdentity } from '~/config'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { getShout } from '~/graphql/api/public'
|
||||
import type { Shout } from '~/graphql/schema/core.gen'
|
||||
|
|
|
@ -6,14 +6,14 @@ import { AuthGuard } from '~/components/AuthGuard'
|
|||
import { Button } from '~/components/_shared/Button'
|
||||
import { Icon } from '~/components/_shared/Icon'
|
||||
import { PageLayout } from '~/components/_shared/PageLayout'
|
||||
import enKeywords from '~/config/locales/en/keywords.json'
|
||||
import ruKeywords from '~/config/locales/ru/keywords.json'
|
||||
import { useGraphQL } from '~/context/graphql'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import createShoutMutation from '~/graphql/mutation/core/article-create'
|
||||
import enKeywords from '~/intl/locales/en/keywords.json'
|
||||
import ruKeywords from '~/intl/locales/ru/keywords.json'
|
||||
import { getImageUrl } from '~/lib/getImageUrl'
|
||||
import styles from '~/styles/Create.module.scss'
|
||||
import { LayoutType } from '~/types/common'
|
||||
import { getImageUrl } from '~/utils/getImageUrl'
|
||||
|
||||
export default () => {
|
||||
const { t, lang } = useLocalize()
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
const removeFileExtension = (fileName: string) => {
|
||||
const removeMediaFileExtension = (fileName: string) => {
|
||||
return fileName.replace(/\.(wav|flac|mp3|aac|jpg|jpeg|png|gif)$/i, '')
|
||||
}
|
||||
|
||||
|
@ -10,7 +10,7 @@ export const composeMediaItems = (
|
|||
return {
|
||||
url: fileData.url,
|
||||
source: '',
|
||||
title: fileData.originalFilename ? removeFileExtension(fileData.originalFilename) : '',
|
||||
title: fileData.originalFilename ? removeMediaFileExtension(fileData.originalFilename) : '',
|
||||
body: '',
|
||||
...optionalParams
|
||||
}
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
// /:slug -> /@slug
|
||||
// https://vite-plugin-ssr.com/routing
|
||||
// https://www.npmjs.com/package/@nanostores/router
|
||||
export const getServerRoute = (clientRoute: string) => clientRoute.replaceAll(':', '@')
|
|
@ -1,5 +0,0 @@
|
|||
import { Author, Topic } from '~/graphql/schema/core.gen'
|
||||
|
||||
export const isAuthor = (value: Author | Topic): value is Author => {
|
||||
return 'name' in value
|
||||
}
|
|
@ -2,7 +2,7 @@ import { Shout } from '~/graphql/schema/core.gen'
|
|||
|
||||
const MAX_DESCRIPTION_LENGTH = 150
|
||||
|
||||
export const getDescription = (body: string): string => {
|
||||
export const getArticleDescription = (body: string): string => {
|
||||
if (!body) {
|
||||
return ''
|
||||
}
|
||||
|
@ -20,6 +20,6 @@ export const getDescription = (body: string): string => {
|
|||
return description.trim()
|
||||
}
|
||||
|
||||
export const getKeywords = (shout: Shout): string => {
|
||||
export const getArticleKeywords = (shout: Shout): string => {
|
||||
return (shout.topics || [])?.map((topic) => topic?.title).join(', ')
|
||||
}
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
import { translit } from './ru2en'
|
||||
|
||||
export const slugify = (text: string) => {
|
||||
return translit(text.toLowerCase())
|
||||
.replaceAll(' ', '-')
|
||||
.replaceAll(/[^\da-z]/g, '')
|
||||
}
|
Loading…
Reference in New Issue
Block a user