utils-refactored

This commit is contained in:
Untone 2024-07-05 17:08:12 +03:00
parent 546d1bd743
commit 7c2d97053b
71 changed files with 117 additions and 132 deletions

View File

@ -4,7 +4,7 @@ import { Icon } from '~/components/_shared/Icon'
import { Popover } from '~/components/_shared/Popover' import { Popover } from '~/components/_shared/Popover'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import { MediaItem } from '~/types/mediaitem' import { MediaItem } from '~/types/mediaitem'
import { getDescription } from '~/utils/meta' import { getArticleDescription } from '~/utils/meta'
import { SharePopup, getShareUrl } from '../SharePopup' import { SharePopup, getShareUrl } from '../SharePopup'
import styles from './AudioPlayer.module.scss' import styles from './AudioPlayer.module.scss'
@ -137,7 +137,7 @@ export const PlayerPlaylist = (props: Props) => {
> >
<SharePopup <SharePopup
title={mi.title} title={mi.title}
description={getDescription(props.body || '')} description={getArticleDescription(props.body || '')}
imageUrl={mi.pic || ''} imageUrl={mi.pic || ''}
shareUrl={getShareUrl({ pathname: `/${props.articleSlug}` })} shareUrl={getShareUrl({ pathname: `/${props.articleSlug}` })}
trigger={ trigger={

View File

@ -5,7 +5,7 @@ import { useLocalize } from '~/context/localize'
import { useReactions } from '~/context/reactions' import { useReactions } from '~/context/reactions'
import { useSession } from '~/context/session' import { useSession } from '~/context/session'
import { Author, Reaction, ReactionKind, ReactionSort } from '~/graphql/schema/core.gen' 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 { Button } from '../_shared/Button'
import { ShowIfAuthenticated } from '../_shared/ShowIfAuthenticated' import { ShowIfAuthenticated } from '../_shared/ShowIfAuthenticated'

View File

@ -10,11 +10,11 @@ import { useReactions } from '~/context/reactions'
import { useSession } from '~/context/session' import { useSession } from '~/context/session'
import { DEFAULT_HEADER_OFFSET, useUI } from '~/context/ui' import { DEFAULT_HEADER_OFFSET, useUI } from '~/context/ui'
import type { Author, Maybe, Shout, Topic } from '~/graphql/schema/core.gen' 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 { MediaItem } from '~/types/mediaitem'
import { capitalize } from '~/utils/capitalize' import { capitalize } from '~/utils/capitalize'
import { getImageUrl, getOpenGraphImageUrl } from '~/utils/getImageUrl' import { getArticleDescription, getArticleKeywords } from '~/utils/meta'
import { getDescription, getKeywords } from '~/utils/meta'
import { isCyrillic } from '~/utils/translate'
import { AuthorBadge } from '../Author/AuthorBadge' import { AuthorBadge } from '../Author/AuthorBadge'
import { CardTopic } from '../Feed/CardTopic' import { CardTopic } from '../Feed/CardTopic'
import { FeedArticlePopup } from '../Feed/FeedArticlePopup' import { FeedArticlePopup } from '../Feed/FeedArticlePopup'
@ -333,9 +333,9 @@ export const FullArticle = (props: Props) => {
width: 1200 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 ogTitle = props.article.title
const keywords = getKeywords(props.article) const keywords = getArticleKeywords(props.article)
const shareUrl = getShareUrl({ pathname: `/${props.article.slug}` }) const shareUrl = getShareUrl({ pathname: `/${props.article.slug}` })
const getAuthorName = (a: Author) => { const getAuthorName = (a: Author) => {
return lang() === 'en' && isCyrillic(a.name || '') ? capitalize(a.slug.replace(/-/, ' ')) : a.name return lang() === 'en' && isCyrillic(a.name || '') ? capitalize(a.slug.replace(/-/, ' ')) : a.name

View File

@ -11,9 +11,9 @@ import { useFollowing } from '~/context/following'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import { useSession } from '~/context/session' import { useSession } from '~/context/session'
import { Author, FollowingEntity } from '~/graphql/schema/core.gen' 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 { mediaMatches } from '~/utils/media-query'
import { translit } from '~/utils/ru2en'
import { isCyrillic } from '~/utils/translate'
import { Userpic } from '../Userpic' import { Userpic } from '../Userpic'
import styles from './AuthorBadge.module.scss' import styles from './AuthorBadge.module.scss'

View File

@ -9,9 +9,8 @@ import { FollowsFilter, useFollowing } from '~/context/following'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import { useSession } from '~/context/session' import { useSession } from '~/context/session'
import { FollowingEntity, Topic } from '~/graphql/schema/core.gen' import { FollowingEntity, Topic } from '~/graphql/schema/core.gen'
import { isAuthor } from '~/utils/isAuthor' import { isCyrillic } from '~/intl/translate'
import { translit } from '~/utils/ru2en' import { translit } from '~/intl/translit'
import { isCyrillic } from '~/utils/translate'
import { SharePopup, getShareUrl } from '../../Article/SharePopup' import { SharePopup, getShareUrl } from '../../Article/SharePopup'
import { Modal } from '../../Nav/Modal' import { Modal } from '../../Nav/Modal'
import { TopicBadge } from '../../Topic/TopicBadge' import { TopicBadge } from '../../Topic/TopicBadge'
@ -164,10 +163,10 @@ export const AuthorCard = (props: Props) => {
<div class="col-24"> <div class="col-24">
<For each={authorSubs()}> <For each={authorSubs()}>
{(subscription) => {(subscription) =>
isAuthor(subscription) ? ( 'name' in subscription ? (
<AuthorBadge author={subscription} subscriptionsMode={true} /> <AuthorBadge author={subscription as Author} subscriptionsMode={true} />
) : ( ) : (
<TopicBadge topic={subscription} subscriptionsMode={true} /> <TopicBadge topic={subscription as Topic} subscriptionsMode={true} />
) )
} }
</For> </For>

View File

@ -3,9 +3,9 @@ import { createMemo } from 'solid-js'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import { Author } from '~/graphql/schema/core.gen' import { Author } from '~/graphql/schema/core.gen'
import { isCyrillic } from '~/intl/translate'
import { translit } from '~/intl/translit'
import { capitalize } from '~/utils/capitalize' import { capitalize } from '~/utils/capitalize'
import { translit } from '~/utils/ru2en'
import { isCyrillic } from '~/utils/translate'
import { Userpic } from '../Userpic' import { Userpic } from '../Userpic'
import styles from './AhtorLink.module.scss' import styles from './AhtorLink.module.scss'

View File

@ -1,10 +1,10 @@
import type { Editor } from '@tiptap/core' import type { Editor } from '@tiptap/core'
import { renderUploadedImage } from '~/components/Editor/renderUploadedImage'
import { Icon } from '~/components/_shared/Icon' import { Icon } from '~/components/_shared/Icon'
import { Popover } from '~/components/_shared/Popover' import { Popover } from '~/components/_shared/Popover'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import { UploadedFile } from '~/types/upload' import { UploadedFile } from '~/types/upload'
import { renderUploadedImage } from '~/utils/renderUploadedImage'
import { Modal } from '../../Nav/Modal' import { Modal } from '../../Nav/Modal'
import { UploadModalContent } from '../UploadModalContent' import { UploadModalContent } from '../UploadModalContent'

View File

@ -34,7 +34,7 @@ import { useEditorContext } from '~/context/editor'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import { useSession } from '~/context/session' import { useSession } from '~/context/session'
import { useSnackbar } from '~/context/ui' import { useSnackbar } from '~/context/ui'
import { handleImageUpload } from '~/utils/handleImageUpload' import { handleImageUpload } from '~/lib/handleImageUpload'
import { BlockquoteBubbleMenu, FigureBubbleMenu, IncutBubbleMenu } from './BubbleMenu' import { BlockquoteBubbleMenu, FigureBubbleMenu, IncutBubbleMenu } from './BubbleMenu'
import { EditorFloatingMenu } from './EditorFloatingMenu' import { EditorFloatingMenu } from './EditorFloatingMenu'

View File

@ -1,11 +1,11 @@
import type { Editor } from '@tiptap/core' import type { Editor } from '@tiptap/core'
import { Show, createEffect, createSignal } from 'solid-js' import { Show, createEffect, createSignal } from 'solid-js'
import { renderUploadedImage } from '~/components/Editor/renderUploadedImage'
import { Icon } from '~/components/_shared/Icon' import { Icon } from '~/components/_shared/Icon'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import { useUI } from '~/context/ui' import { useUI } from '~/context/ui'
import { UploadedFile } from '~/types/upload' import { UploadedFile } from '~/types/upload'
import { renderUploadedImage } from '~/utils/renderUploadedImage'
import { useOutsideClickHandler } from '~/utils/useOutsideClickHandler' import { useOutsideClickHandler } from '~/utils/useOutsideClickHandler'
import { Modal } from '../../Nav/Modal' import { Modal } from '../../Nav/Modal'
import { InlineForm } from '../InlineForm' import { InlineForm } from '../InlineForm'

View File

@ -8,8 +8,8 @@ import { Loading } from '~/components/_shared/Loading'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import { useSession } from '~/context/session' import { useSession } from '~/context/session'
import { useUI } from '~/context/ui' import { useUI } from '~/context/ui'
import { handleImageUpload } from '~/lib/handleImageUpload'
import { UploadedFile } from '~/types/upload' import { UploadedFile } from '~/types/upload'
import { handleImageUpload } from '~/utils/handleImageUpload'
import { verifyImg } from '~/utils/verifyImg' import { verifyImg } from '~/utils/verifyImg'
import { InlineForm } from '../InlineForm' import { InlineForm } from '../InlineForm'

View File

@ -8,7 +8,7 @@ import { useLocalize } from '~/context/localize'
import { useSession } from '~/context/session' import { useSession } from '~/context/session'
import type { Author, Maybe, Shout, Topic } from '~/graphql/schema/core.gen' import type { Author, Maybe, Shout, Topic } from '~/graphql/schema/core.gen'
import { capitalize } from '~/utils/capitalize' import { capitalize } from '~/utils/capitalize'
import { getDescription } from '~/utils/meta' import { getArticleDescription } from '~/utils/meta'
import { CoverImage } from '../../Article/CoverImage' import { CoverImage } from '../../Article/CoverImage'
import { SharePopup, getShareUrl } from '../../Article/SharePopup' import { SharePopup, getShareUrl } from '../../Article/SharePopup'
import { ShoutRatingControl } from '../../Article/ShoutRatingControl' import { ShoutRatingControl } from '../../Article/ShoutRatingControl'
@ -109,7 +109,7 @@ export const ArticleCard = (props: ArticleCardProps) => {
const [isActionPopupActive, setIsActionPopupActive] = createSignal(false) const [isActionPopupActive, setIsActionPopupActive] = createSignal(false)
const [isCoverImageLoadError, setIsCoverImageLoadError] = createSignal(false) const [isCoverImageLoadError, setIsCoverImageLoadError] = createSignal(false)
const [isCoverImageLoading, setIsCoverImageLoading] = createSignal(true) 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 aspectRatio: Accessor<string> = () => LAYOUT_ASPECT[props.article?.layout as string]
const [mainTopicTitle, mainTopicSlug] = getMainTopicTitle(props.article, lang()) const [mainTopicTitle, mainTopicSlug] = getMainTopicTitle(props.article, lang())
const { title, subtitle } = getTitleAndSubtitle(props.article) const { title, subtitle } = getTitleAndSubtitle(props.article)

View File

@ -1,7 +1,7 @@
import { clsx } from 'clsx' import { clsx } from 'clsx'
import { Show, createMemo } from 'solid-js' import { Show, createMemo } from 'solid-js'
import { getImageUrl } from '~/utils/getImageUrl' import { getImageUrl } from '~/lib/getImageUrl'
import './DialogCard.module.scss' import './DialogCard.module.scss'
import styles from './DialogAvatar.module.scss' import styles from './DialogAvatar.module.scss'

View File

@ -6,8 +6,8 @@ import { useSession } from '~/context/session'
import { useTopics } from '~/context/topics' import { useTopics } from '~/context/topics'
import { useUI } from '~/context/ui' import { useUI } from '~/context/ui'
import type { Topic } from '../../../graphql/schema/core.gen' import type { Topic } from '../../../graphql/schema/core.gen'
import { getRandomTopicsFromArray } from '../../../utils/getRandomTopicsFromArray' import { getRandomTopicsFromArray } from '../../../lib/getRandomTopicsFromArray'
import { getDescription } from '../../../utils/meta' import { getArticleDescription } from '../../../utils/meta'
import { SharePopup, getShareUrl } from '../../Article/SharePopup' import { SharePopup, getShareUrl } from '../../Article/SharePopup'
import { Icon } from '../../_shared/Icon' import { Icon } from '../../_shared/Icon'
import { Newsletter } from '../../_shared/Newsletter' import { Newsletter } from '../../_shared/Newsletter'
@ -340,7 +340,7 @@ export const Header = (props: Props) => {
title={props.title || ''} title={props.title || ''}
imageUrl={props.cover || ''} imageUrl={props.cover || ''}
shareUrl={getShareUrl()} shareUrl={getShareUrl()}
description={getDescription(props.articleBody || '')} description={getArticleDescription(props.articleBody?.slice(0, 100) || '')}
onVisibilityChange={(isVisible) => { onVisibilityChange={(isVisible) => {
setIsSharePopupVisible(isVisible) setIsSharePopupVisible(isVisible)
}} }}

View File

@ -7,8 +7,8 @@ import { Button } from '~/components/_shared/Button'
import { Icon } from '~/components/_shared/Icon' import { Icon } from '~/components/_shared/Icon'
import { useFeed } from '~/context/feed' import { useFeed } from '~/context/feed'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import { byScore } from '~/lib/sortby'
import { restoreScrollPosition, saveScrollPosition } from '~/utils/scroll' import { restoreScrollPosition, saveScrollPosition } from '~/utils/scroll'
import { byScore } from '~/utils/sortby'
import { FEED_PAGE_SIZE } from '../../Views/Feed/Feed' import { FEED_PAGE_SIZE } from '../../Views/Feed/Feed'
import { SearchResultItem } from './SearchResultItem' import { SearchResultItem } from './SearchResultItem'

View File

@ -19,10 +19,10 @@ import { useProfile } from '~/context/profile'
import { useSession } from '~/context/session' import { useSession } from '~/context/session'
import { useSnackbar, useUI } from '~/context/ui' import { useSnackbar, useUI } from '~/context/ui'
import { InputMaybe, ProfileInput } from '~/graphql/schema/core.gen' 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 { 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 { validateUrl } from '~/utils/validateUrl'
import { Modal } from '../Nav/Modal' import { Modal } from '../Nav/Modal'
import { ProfileSettingsNavigation } from '../Nav/ProfileSettingsNavigation' import { ProfileSettingsNavigation } from '../Nav/ProfileSettingsNavigation'

View File

@ -6,8 +6,8 @@ import { useFollowing } from '~/context/following'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import { useSession } from '~/context/session' import { useSession } from '~/context/session'
import { FollowingEntity, Topic } from '~/graphql/schema/core.gen' import { FollowingEntity, Topic } from '~/graphql/schema/core.gen'
import { getImageUrl } from '~/lib/getImageUrl'
import { capitalize } from '~/utils/capitalize' import { capitalize } from '~/utils/capitalize'
import { getImageUrl } from '~/utils/getImageUrl'
import { mediaMatches } from '~/utils/media-query' import { mediaMatches } from '~/utils/media-query'
import styles from './TopicBadge.module.scss' import styles from './TopicBadge.module.scss'

View File

@ -4,15 +4,15 @@ import { clsx } from 'clsx'
import { For, Show, createMemo, createSignal, onMount } from 'solid-js' import { For, Show, createMemo, createSignal, onMount } from 'solid-js'
import { Loading } from '~/components/_shared/Loading' import { Loading } from '~/components/_shared/Loading'
import { SearchField } from '~/components/_shared/SearchField' 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 { type SortFunction, useAuthors } from '~/context/authors'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import type { Author } from '~/graphql/schema/core.gen' 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 { scrollHandler } from '~/utils/scroll'
import { byFirstChar, byStat } from '~/utils/sortby'
import { authorLetterReduce, translateAuthor } from '~/utils/translate'
import { AuthorsList } from '../../AuthorsList' import { AuthorsList } from '../../AuthorsList'
import styles from './AllAuthors.module.scss' import styles from './AllAuthors.module.scss'

View File

@ -4,14 +4,14 @@ import { clsx } from 'clsx'
import { For, Show, createEffect, createMemo, createSignal, on, onMount } from 'solid-js' import { For, Show, createEffect, createMemo, createSignal, on, onMount } from 'solid-js'
import { Loading } from '~/components/_shared/Loading' import { Loading } from '~/components/_shared/Loading'
import { SearchField } from '~/components/_shared/SearchField' 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 { useLocalize } from '~/context/localize'
import { useTopics } from '~/context/topics' import { useTopics } from '~/context/topics'
import type { Topic } from '~/graphql/schema/core.gen' 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 { capitalize } from '~/utils/capitalize'
import { dummyFilter } from '~/utils/dummyFilter'
import { getImageUrl } from '~/utils/getImageUrl'
import { scrollHandler } from '~/utils/scroll' import { scrollHandler } from '~/utils/scroll'
import { TopicBadge } from '../../Topic/TopicBadge' import { TopicBadge } from '../../Topic/TopicBadge'
import styles from './AllTopics.module.scss' import styles from './AllTopics.module.scss'

View File

@ -15,10 +15,10 @@ import getAuthorFollowersQuery from '~/graphql/query/core/author-followers'
import getAuthorFollowsQuery from '~/graphql/query/core/author-follows' import getAuthorFollowsQuery from '~/graphql/query/core/author-follows'
import loadReactionsBy from '~/graphql/query/core/reactions-load-by' import loadReactionsBy from '~/graphql/query/core/reactions-load-by'
import type { Author, Reaction, Shout, Topic } from '~/graphql/schema/core.gen' import type { Author, Reaction, Shout, Topic } from '~/graphql/schema/core.gen'
import { getImageUrl } from '~/utils/getImageUrl' import { getImageUrl } from '~/lib/getImageUrl'
import { getDescription } from '~/utils/meta' import { byCreated } from '~/lib/sortby'
import { getArticleDescription } from '~/utils/meta'
import { restoreScrollPosition, saveScrollPosition } from '~/utils/scroll' import { restoreScrollPosition, saveScrollPosition } from '~/utils/scroll'
import { byCreated } from '~/utils/sortby'
import { splitToPages } from '~/utils/splitToPages' import { splitToPages } from '~/utils/splitToPages'
import stylesArticle from '../../Article/Article.module.scss' import stylesArticle from '../../Article/Article.module.scss'
import { Comment } from '../../Article/Comment' import { Comment } from '../../Article/Comment'
@ -156,7 +156,7 @@ export const AuthorView = (props: Props) => {
? getImageUrl(author()?.pic || '', { width: 1200 }) ? getImageUrl(author()?.pic || '', { width: 1200 })
: getImageUrl('production/image/logo_image.png') : getImageUrl('production/image/logo_image.png')
) )
const description = createMemo(() => getDescription(author()?.bio || '')) const description = createMemo(() => getArticleDescription(author()?.bio || ''))
const handleDeleteComment = (id: number) => { const handleDeleteComment = (id: number) => {
setCommented((prev) => (prev || []).filter((comment) => comment.id !== id)) setCommented((prev) => (prev || []).filter((comment) => comment.id !== id))
} }

View File

@ -24,12 +24,12 @@ import { useGraphQL } from '~/context/graphql'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import getMyShoutQuery from '~/graphql/query/core/article-my' import getMyShoutQuery from '~/graphql/query/core/article-my'
import type { Shout, Topic } from '~/graphql/schema/core.gen' 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 { LayoutType } from '~/types/common'
import { MediaItem } from '~/types/mediaitem' import { MediaItem } from '~/types/mediaitem'
import { clone } from '~/utils/clone' import { clone } from '~/utils/clone'
import { getImageUrl } from '~/utils/getImageUrl'
import { isDesktop } from '~/utils/media-query' import { isDesktop } from '~/utils/media-query'
import { slugify } from '~/utils/slugify'
import { Editor, Panel } from '../../Editor' import { Editor, Panel } from '../../Editor'
import { AudioUploader } from '../../Editor/AudioUploader' import { AudioUploader } from '../../Editor/AudioUploader'
import { AutoSaveNotice } from '../../Editor/AutoSaveNotice' import { AutoSaveNotice } from '../../Editor/AutoSaveNotice'

View File

@ -8,8 +8,6 @@ import { Icon } from '~/components/_shared/Icon'
import { InviteMembers } from '~/components/_shared/InviteMembers' import { InviteMembers } from '~/components/_shared/InviteMembers'
import { Loading } from '~/components/_shared/Loading' import { Loading } from '~/components/_shared/Loading'
import { ShareModal } from '~/components/_shared/ShareModal' 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 { useAuthors } from '~/context/authors'
import { useGraphQL } from '~/context/graphql' import { useGraphQL } from '~/context/graphql'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
@ -19,9 +17,11 @@ import { useTopics } from '~/context/topics'
import { useUI } from '~/context/ui' import { useUI } from '~/context/ui'
import { loadUnratedShouts } from '~/graphql/api/private' import { loadUnratedShouts } from '~/graphql/api/private'
import type { Author, Reaction, Shout } from '~/graphql/schema/core.gen' 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 { FeedSearchParams } from '~/routes/feed/[...feed]'
import { getImageUrl } from '~/utils/getImageUrl'
import { byCreated } from '~/utils/sortby'
import { CommentDate } from '../../Article/CommentDate' import { CommentDate } from '../../Article/CommentDate'
import { getShareUrl } from '../../Article/SharePopup' import { getShareUrl } from '../../Article/SharePopup'
import { AuthorBadge } from '../../Author/AuthorBadge' import { AuthorBadge } from '../../Author/AuthorBadge'

View File

@ -1,13 +1,13 @@
import { For, Show, createEffect, createMemo, createSignal, on } from 'solid-js' import { For, Show, createEffect, createMemo, createSignal, on } from 'solid-js'
import { Meta } from '@solidjs/meta' 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 { useAuthors } from '~/context/authors'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import { useTopics } from '~/context/topics' import { useTopics } from '~/context/topics'
import { loadShouts } from '~/graphql/api/public' import { loadShouts } from '~/graphql/api/public'
import { Author, Shout, Topic } from '~/graphql/schema/core.gen' 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 { SHOUTS_PER_PAGE } from '~/routes/(home)'
import { capitalize } from '~/utils/capitalize' import { capitalize } from '~/utils/capitalize'
import { splitToPages } from '~/utils/splitToPages' import { splitToPages } from '~/utils/splitToPages'

View File

@ -6,8 +6,7 @@ import { SearchField } from '~/components/_shared/SearchField'
import { FollowsFilter, useFollowing } from '~/context/following' import { FollowsFilter, useFollowing } from '~/context/following'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import { Author, Topic } from '~/graphql/schema/core.gen' import { Author, Topic } from '~/graphql/schema/core.gen'
import { dummyFilter } from '~/utils/dummyFilter' import { dummyFilter } from '~/lib/dummyFilter'
import { isAuthor } from '~/utils/isAuthor'
import { AuthorBadge } from '../../Author/AuthorBadge' import { AuthorBadge } from '../../Author/AuthorBadge'
import { ProfileSettingsNavigation } from '../../Nav/ProfileSettingsNavigation' import { ProfileSettingsNavigation } from '../../Nav/ProfileSettingsNavigation'
import { TopicBadge } from '../../Topic/TopicBadge' import { TopicBadge } from '../../Topic/TopicBadge'
@ -100,10 +99,10 @@ export const ProfileSubscriptions = () => {
<For each={filtered()}> <For each={filtered()}>
{(followingItem) => ( {(followingItem) => (
<div> <div>
{isAuthor(followingItem) ? ( {'name' in followingItem ? (
<AuthorBadge minimize={true} author={followingItem} /> <AuthorBadge minimize={true} author={followingItem as Author} />
) : ( ) : (
<TopicBadge minimize={true} topic={followingItem} /> <TopicBadge minimize={true} topic={followingItem as Topic} />
)} )}
</div> </div>
)} )}

View File

@ -5,8 +5,6 @@ import { clsx } from 'clsx'
import { For, Show, createEffect, createMemo, createSignal, on, onMount } from 'solid-js' import { For, Show, createEffect, createMemo, createSignal, on, onMount } from 'solid-js'
import { useSearchParams } from '@solidjs/router' 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 { useAuthors } from '~/context/authors'
import { useFeed } from '~/context/feed' import { useFeed } from '~/context/feed'
import { useGraphQL } from '~/context/graphql' 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 loadShoutsRandomQuery from '~/graphql/query/core/articles-load-random-topic'
import loadAuthorsByQuery from '~/graphql/query/core/authors-load-by' import loadAuthorsByQuery from '~/graphql/query/core/authors-load-by'
import getTopicFollowersQuery from '~/graphql/query/core/topic-followers' 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 { capitalize } from '~/utils/capitalize'
import { getImageUrl } from '~/utils/getImageUrl'
import { getUnixtime } from '~/utils/getServerDate' import { getUnixtime } from '~/utils/getServerDate'
import { getDescription } from '~/utils/meta' import { getArticleDescription } from '~/utils/meta'
import { restoreScrollPosition, saveScrollPosition } from '~/utils/scroll' import { restoreScrollPosition, saveScrollPosition } from '~/utils/scroll'
import { splitToPages } from '~/utils/splitToPages' import { splitToPages } from '~/utils/splitToPages'
import styles from '../../styles/Topic.module.scss' import styles from '../../styles/Topic.module.scss'
@ -161,7 +161,7 @@ export const TopicView = (props: Props) => {
: getImageUrl('production/image/logo_image.png') : getImageUrl('production/image/logo_image.png')
const description = () => const description = () =>
topic()?.body topic()?.body
? getDescription(topic()?.body || '') ? getArticleDescription(topic()?.body || '')
: t('The most interesting publications on the topic', { topicName: title() }) : t('The most interesting publications on the topic', { topicName: title() })
return ( return (

View File

@ -4,8 +4,8 @@ import { JSX, Show, createSignal } from 'solid-js'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import { useSession } from '~/context/session' import { useSession } from '~/context/session'
import { handleFileUpload } from '~/utils/handleFileUpload' import { handleFileUpload } from '~/lib/handleFileUpload'
import { handleImageUpload } from '~/utils/handleImageUpload' import { handleImageUpload } from '~/lib/handleImageUpload'
import { validateFiles } from '~/utils/validateFile' import { validateFiles } from '~/utils/validateFile'
import styles from './DropArea.module.scss' import styles from './DropArea.module.scss'

View File

@ -3,7 +3,7 @@ import type { JSX } from 'solid-js'
import { Link } from '@solidjs/meta' import { Link } from '@solidjs/meta'
import { splitProps } from 'solid-js' import { splitProps } from 'solid-js'
import { getImageUrl } from '~/utils/getImageUrl' import { getImageUrl } from '~/lib/getImageUrl'
type Props = JSX.ImgHTMLAttributes<HTMLImageElement> & { type Props = JSX.ImgHTMLAttributes<HTMLImageElement> & {
width: number width: number

View File

@ -1,7 +1,7 @@
import { clsx } from 'clsx' import { clsx } from 'clsx'
import { Show, createEffect, createMemo, createSignal, on, onCleanup } from 'solid-js' 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 { useEscKeyDownHandler } from '~/utils/useEscKeyDownHandler'
import { Icon } from '../Icon' import { Icon } from '../Icon'

View File

@ -6,9 +6,9 @@ import { Manipulation, Navigation, Pagination } from 'swiper/modules'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import { useSnackbar } from '~/context/ui' import { useSnackbar } from '~/context/ui'
import { getImageUrl } from '~/lib/getImageUrl'
import { handleImageUpload } from '~/lib/handleImageUpload'
import { composeMediaItems } from '~/utils/composeMediaItems' import { composeMediaItems } from '~/utils/composeMediaItems'
import { getImageUrl } from '~/utils/getImageUrl'
import { handleImageUpload } from '~/utils/handleImageUpload'
import { validateFiles } from '~/utils/validateFile' import { validateFiles } from '~/utils/validateFile'
import { DropArea } from '../DropArea' import { DropArea } from '../DropArea'
import { Icon } from '../Icon' import { Icon } from '../Icon'

View File

@ -4,8 +4,8 @@ import SwiperCore from 'swiper'
import { HashNavigation, Manipulation, Navigation, Pagination } from 'swiper/modules' import { HashNavigation, Manipulation, Navigation, Pagination } from 'swiper/modules'
import { throttle } from 'throttle-debounce' import { throttle } from 'throttle-debounce'
import { getImageUrl } from '~/lib/getImageUrl'
import { MediaItem } from '~/types/mediaitem' import { MediaItem } from '~/types/mediaitem'
import { getImageUrl } from '~/utils/getImageUrl'
import { Icon } from '../Icon' import { Icon } from '../Icon'
import { Image } from '../Image' import { Image } from '../Image'
import { SwiperRef } from './swiper' import { SwiperRef } from './swiper'

View File

@ -5,7 +5,7 @@ import { EventSource } from 'extended-eventsource'
import { createContext, createEffect, createSignal, on, useContext } from 'solid-js' import { createContext, createEffect, createSignal, on, useContext } from 'solid-js'
import { Chat, Message } from '~/graphql/schema/chat.gen' import { Chat, Message } from '~/graphql/schema/chat.gen'
import { sseUrl } from '../config/config' import { sseUrl } from '../config'
import { useSession } from './session' import { useSession } from './session'
const RECONNECT_TIMES = 2 const RECONNECT_TIMES = 2

View File

@ -1,15 +1,14 @@
import type { JSX } from 'solid-js'
import { useMatch, useNavigate } from '@solidjs/router' import { useMatch, useNavigate } from '@solidjs/router'
import { Editor } from '@tiptap/core' import { Editor } from '@tiptap/core'
import type { JSX } from 'solid-js'
import { Accessor, createContext, createSignal, useContext } from 'solid-js' import { Accessor, createContext, createSignal, useContext } from 'solid-js'
import { SetStoreFunction, createStore } from 'solid-js/store' import { SetStoreFunction, createStore } from 'solid-js/store'
import { useSnackbar } from '~/context/ui' import { useSnackbar } from '~/context/ui'
import deleteShoutQuery from '~/graphql/mutation/core/article-delete' import deleteShoutQuery from '~/graphql/mutation/core/article-delete'
import updateShoutQuery from '~/graphql/mutation/core/article-update' import updateShoutQuery from '~/graphql/mutation/core/article-update'
import { Topic, TopicInput } from '~/graphql/schema/core.gen' import { Topic, TopicInput } from '~/graphql/schema/core.gen'
import { slugify } from '~/intl/translit'
import { useFeed } from '../context/feed' import { useFeed } from '../context/feed'
import { slugify } from '../utils/slugify'
import { useGraphQL } from './graphql' import { useGraphQL } from './graphql'
import { useLocalize } from './localize' import { useLocalize } from './localize'

View File

@ -12,7 +12,7 @@ import {
Shout, Shout,
Topic Topic
} from '~/graphql/schema/core.gen' } from '~/graphql/schema/core.gen'
import { byStat } from '../utils/sortby' import { byStat } from '../lib/sortby'
import { useGraphQL } from './graphql' import { useGraphQL } from './graphql'
export const PRERENDERED_ARTICLES_COUNT = 5 export const PRERENDERED_ARTICLES_COUNT = 5

View File

@ -1,7 +1,7 @@
import { Client, ClientOptions, cacheExchange, createClient, fetchExchange } from '@urql/core' import { Client, ClientOptions, cacheExchange, createClient, fetchExchange } from '@urql/core'
import { createContext, createEffect, createSignal, on, useContext } from 'solid-js' import { createContext, createEffect, createSignal, on, useContext } from 'solid-js'
import { JSX } from 'solid-js/jsx-runtime' import { JSX } from 'solid-js/jsx-runtime'
import { chatApiUrl, coreApiUrl } from '../config/config' import { chatApiUrl, coreApiUrl } from '../config'
import { useSession } from './session' import { useSession } from './session'
type GraphQLClientContextType = Record<string, Client> type GraphQLClientContextType = Record<string, Client>

View File

@ -1,6 +1,6 @@
import type { Accessor, JSX } from 'solid-js' import type { Accessor, JSX } from 'solid-js'
import { createContext, createSignal, useContext } 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 { useGraphQL } from '~/context/graphql'
import createChatMutation from '~/graphql/mutation/chat/chat-create' import createChatMutation from '~/graphql/mutation/chat/chat-create'
import createMessageMutation from '~/graphql/mutation/chat/chat-message-create' import createMessageMutation from '~/graphql/mutation/chat/chat-message-create'

View File

@ -10,7 +10,7 @@ import {
onMount, onMount,
useContext useContext
} from 'solid-js' } from 'solid-js'
import { TimeAgo, type i18n, i18next, i18nextInit } from '~/utils/i18next' import { TimeAgo, type i18n, i18next, i18nextInit } from '~/intl/i18next'
i18nextInit() i18nextInit()
@ -87,7 +87,7 @@ export const LocalizeProvider = (props: { children: JSX.Element }) => {
try { try {
return i18next.t(...args) return i18next.t(...args)
} catch (_) { } catch (_) {
return args?.length > 0 ? args[0] as string : '' return args?.length > 0 ? (args[0] as string) : ''
} }
}) as i18n['t'], }) as i18n['t'],
lang, lang,

View File

@ -25,7 +25,7 @@ import {
useContext useContext
} from 'solid-js' } from 'solid-js'
import { type AuthModalSource, useSnackbar, useUI } from '~/context/ui' import { type AuthModalSource, useSnackbar, useUI } from '~/context/ui'
import { authApiUrl } from '../config/config' import { authApiUrl } from '../config'
import { useLocalize } from './localize' import { useLocalize } from './localize'
const defaultConfig: ConfigType = { const defaultConfig: ConfigType = {

View File

@ -12,8 +12,8 @@ import {
} from 'solid-js' } from 'solid-js'
import { loadTopics } from '~/graphql/api/public' import { loadTopics } from '~/graphql/api/public'
import { Topic } from '~/graphql/schema/core.gen' import { Topic } from '~/graphql/schema/core.gen'
import { getRandomTopicsFromArray } from '~/utils/getRandomTopicsFromArray' import { getRandomTopicsFromArray } from '~/lib/getRandomTopicsFromArray'
import { byTopicStatDesc } from '../utils/sortby' import { byTopicStatDesc } from '../lib/sortby'
type TopicsContextType = { type TopicsContextType = {
topicEntities: Accessor<{ [topicSlug: string]: Topic }> topicEntities: Accessor<{ [topicSlug: string]: Topic }>

View File

@ -4,8 +4,8 @@ import ICU from 'i18next-icu'
import TimeAgo from 'javascript-time-ago' import TimeAgo from 'javascript-time-ago'
import enTime from 'javascript-time-ago/locale/en' import enTime from 'javascript-time-ago/locale/en'
import ruTime from 'javascript-time-ago/locale/ru' import ruTime from 'javascript-time-ago/locale/ru'
import en from '~/config/locales/en/translation.json' import en from '~/intl/locales/en/translation.json'
import ru from '~/config/locales/ru/translation.json' import ru from '~/intl/locales/ru/translation.json'
TimeAgo.addLocale(enTime) TimeAgo.addLocale(enTime)
TimeAgo.addLocale(ruTime) TimeAgo.addLocale(ruTime)

View File

@ -1,6 +1,6 @@
import { Author } from '~/graphql/schema/core.gen' import { Author } from '~/graphql/schema/core.gen'
import { capitalize } from './capitalize' import { capitalize } from '~/utils/capitalize'
import { translit } from './ru2en' import { translit } from './translit'
export const isCyrillic = (s: string): boolean => { export const isCyrillic = (s: string): boolean => {
const cyrillicRegex = /[\u0400-\u04FF]/ // Range for Cyrillic characters const cyrillicRegex = /[\u0400-\u04FF]/ // Range for Cyrillic characters

View File

@ -1,4 +1,4 @@
import translitConfig from '../config/translit.json' import translitConfig from './abc-translit.json'
const ru2en: { [key: string]: string } = translitConfig const ru2en: { [key: string]: string } = translitConfig
@ -15,3 +15,9 @@ export const translit = (str: string) => {
return [...str].map((c) => ru2en[c] || c).join('') return [...str].map((c) => ru2en[c] || c).join('')
} }
export const slugify = (text: string) => {
return translit(text.toLowerCase())
.replaceAll(' ', '-')
.replaceAll(/[^\da-z]/g, '')
}

View File

@ -1,7 +1,5 @@
import type { Author, Topic } from '~/graphql/schema/core.gen' import type { Author, Topic } from '~/graphql/schema/core.gen'
import { translit } from '../intl/translit'
import { isAuthor } from './isAuthor'
import { translit } from './ru2en'
const prepareQuery = (searchQuery: string, lang: string) => { const prepareQuery = (searchQuery: string, lang: string) => {
const q = searchQuery.toLowerCase() const q = searchQuery.toLowerCase()
@ -33,7 +31,7 @@ export const dummyFilter = <T extends Topic | Author>(
return stringMatches(item?.title || '', q, lang) 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)) return stringMatches(item?.name || '', q, lang) || (item.bio && stringMatches(item.bio, q, lang))
} }

View File

@ -1,4 +1,4 @@
import { cdnUrl, thumborUrl } from '../config/config' import { cdnUrl, thumborUrl } from '../config'
const URL_CONFIG = { const URL_CONFIG = {
cdnUrl: cdnUrl, cdnUrl: cdnUrl,

View File

@ -1,5 +1,5 @@
import { UploadFile } from '@solid-primitives/upload' import { UploadFile } from '@solid-primitives/upload'
import { coreApiUrl } from '../config/config' import { coreApiUrl } from '../config'
const apiUrl = `${coreApiUrl}/upload` const apiUrl = `${coreApiUrl}/upload`

View File

@ -1,5 +1,5 @@
import { UploadFile } from '@solid-primitives/upload' import { UploadFile } from '@solid-primitives/upload'
import { thumborUrl } from '../config/config' import { thumborUrl } from '../config'
export const handleImageUpload = async (uploadFile: UploadFile, token: string) => { export const handleImageUpload = async (uploadFile: UploadFile, token: string) => {
const formData = new FormData() const formData = new FormData()

View File

@ -2,8 +2,8 @@ import { type RouteDefinition, type RouteSectionProps, createAsync } from '@soli
import { Show, Suspense, createSignal, onMount } from 'solid-js' import { Show, Suspense, createSignal, onMount } from 'solid-js'
import { loadShouts } from '~/graphql/api/public' import { loadShouts } from '~/graphql/api/public'
import { LoadShoutsOptions } from '~/graphql/schema/core.gen' import { LoadShoutsOptions } from '~/graphql/schema/core.gen'
import { byStat } from '~/lib/sortby'
import { restoreScrollPosition, saveScrollPosition } from '~/utils/scroll' import { restoreScrollPosition, saveScrollPosition } from '~/utils/scroll'
import { byStat } from '~/utils/sortby'
import { HomeView, HomeViewProps } from '../components/Views/Home' import { HomeView, HomeViewProps } from '../components/Views/Home'
import { Loading } from '../components/_shared/Loading' import { Loading } from '../components/_shared/Loading'
import { PageLayout } from '../components/_shared/PageLayout' import { PageLayout } from '../components/_shared/PageLayout'

View File

@ -1,10 +1,10 @@
import { Meta } from '@solidjs/meta' import { Meta } from '@solidjs/meta'
import { createMemo } from 'solid-js' import { createMemo } from 'solid-js'
import { StaticPage } from '~/components/Views/StaticPage' 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 { 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 () => { export default () => {
const { t, lang } = useLocalize() const { t, lang } = useLocalize()

View File

@ -1,7 +1,7 @@
import { Meta } from '@solidjs/meta' import { Meta } from '@solidjs/meta'
import { StaticPage } from '~/components/Views/StaticPage' import { StaticPage } from '~/components/Views/StaticPage'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import { getImageUrl } from '~/utils/getImageUrl' import { getImageUrl } from '~/lib/getImageUrl'
export const DiscussionRulesPage = () => { export const DiscussionRulesPage = () => {
const { t } = useLocalize() const { t } = useLocalize()

View File

@ -1,10 +1,10 @@
import { Meta } from '@solidjs/meta' import { Meta } from '@solidjs/meta'
import { createMemo } from 'solid-js' import { createMemo } from 'solid-js'
import { StaticPage } from '~/components/Views/StaticPage' 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 { 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 = () => { export const PrinciplesPage = () => {
const { t, lang } = useLocalize() const { t, lang } = useLocalize()

View File

@ -5,7 +5,7 @@ import Opener from '~/components/Nav/Modal/Opener'
import { StaticPage } from '~/components/Views/StaticPage' import { StaticPage } from '~/components/Views/StaticPage'
import { Newsletter } from '~/components/_shared/Newsletter' import { Newsletter } from '~/components/_shared/Newsletter'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import { getImageUrl } from '~/utils/getImageUrl' import { getImageUrl } from '~/lib/getImageUrl'
export const ManifestPage = () => { export const ManifestPage = () => {
const { t } = useLocalize() const { t } = useLocalize()

View File

@ -1,7 +1,7 @@
import { Meta } from '@solidjs/meta' import { Meta } from '@solidjs/meta'
import { StaticPage } from '~/components/Views/StaticPage' import { StaticPage } from '~/components/Views/StaticPage'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import { getImageUrl } from '~/utils/getImageUrl' import { getImageUrl } from '~/lib/getImageUrl'
export const PartnersPage = () => { export const PartnersPage = () => {
const { t } = useLocalize() const { t } = useLocalize()

View File

@ -2,7 +2,7 @@ import { Meta } from '@solidjs/meta'
import { Donate } from '~/components/Discours/Donate' import { Donate } from '~/components/Discours/Donate'
import { StaticPage } from '~/components/Views/StaticPage' import { StaticPage } from '~/components/Views/StaticPage'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import { getImageUrl } from '~/utils/getImageUrl' import { getImageUrl } from '~/lib/getImageUrl'
export const SupportPage = () => { export const SupportPage = () => {
const { t } = useLocalize() const { t } = useLocalize()

View File

@ -1,7 +1,7 @@
import { Meta } from '@solidjs/meta' import { Meta } from '@solidjs/meta'
import { StaticPage } from '~/components/Views/StaticPage' import { StaticPage } from '~/components/Views/StaticPage'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import { getImageUrl } from '~/utils/getImageUrl' import { getImageUrl } from '~/lib/getImageUrl'
export const ThanksPage = () => { export const ThanksPage = () => {
const { t } = useLocalize() const { t } = useLocalize()

View File

@ -1,7 +1,7 @@
import { Meta } from '@solidjs/meta' import { Meta } from '@solidjs/meta'
import { StaticPage } from '~/components/Views/StaticPage' import { StaticPage } from '~/components/Views/StaticPage'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import { getImageUrl } from '~/utils/getImageUrl' import { getImageUrl } from '~/lib/getImageUrl'
export const TermsOfUsePage = () => { export const TermsOfUsePage = () => {
const { t } = useLocalize() const { t } = useLocalize()

View File

@ -2,7 +2,7 @@ import { RouteSectionProps, createAsync, useLocation, useParams } from '@solidjs
import { ErrorBoundary, Suspense, createMemo, createReaction, createSignal, onMount } from 'solid-js' import { ErrorBoundary, Suspense, createMemo, createReaction, createSignal, onMount } from 'solid-js'
import { FourOuFourView } from '~/components/Views/FourOuFour' import { FourOuFourView } from '~/components/Views/FourOuFour'
import { Loading } from '~/components/_shared/Loading' import { Loading } from '~/components/_shared/Loading'
import { gaIdentity } from '~/config/config' import { gaIdentity } from '~/config'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import { getShout } from '~/graphql/api/public' import { getShout } from '~/graphql/api/public'
import type { Shout } from '~/graphql/schema/core.gen' import type { Shout } from '~/graphql/schema/core.gen'

View File

@ -6,14 +6,14 @@ import { AuthGuard } from '~/components/AuthGuard'
import { Button } from '~/components/_shared/Button' import { Button } from '~/components/_shared/Button'
import { Icon } from '~/components/_shared/Icon' import { Icon } from '~/components/_shared/Icon'
import { PageLayout } from '~/components/_shared/PageLayout' 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 { useGraphQL } from '~/context/graphql'
import { useLocalize } from '~/context/localize' import { useLocalize } from '~/context/localize'
import createShoutMutation from '~/graphql/mutation/core/article-create' 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 styles from '~/styles/Create.module.scss'
import { LayoutType } from '~/types/common' import { LayoutType } from '~/types/common'
import { getImageUrl } from '~/utils/getImageUrl'
export default () => { export default () => {
const { t, lang } = useLocalize() const { t, lang } = useLocalize()

View File

@ -1,4 +1,4 @@
const removeFileExtension = (fileName: string) => { const removeMediaFileExtension = (fileName: string) => {
return fileName.replace(/\.(wav|flac|mp3|aac|jpg|jpeg|png|gif)$/i, '') return fileName.replace(/\.(wav|flac|mp3|aac|jpg|jpeg|png|gif)$/i, '')
} }
@ -10,7 +10,7 @@ export const composeMediaItems = (
return { return {
url: fileData.url, url: fileData.url,
source: '', source: '',
title: fileData.originalFilename ? removeFileExtension(fileData.originalFilename) : '', title: fileData.originalFilename ? removeMediaFileExtension(fileData.originalFilename) : '',
body: '', body: '',
...optionalParams ...optionalParams
} }

View File

@ -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(':', '@')

View File

@ -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
}

View File

@ -2,7 +2,7 @@ import { Shout } from '~/graphql/schema/core.gen'
const MAX_DESCRIPTION_LENGTH = 150 const MAX_DESCRIPTION_LENGTH = 150
export const getDescription = (body: string): string => { export const getArticleDescription = (body: string): string => {
if (!body) { if (!body) {
return '' return ''
} }
@ -20,6 +20,6 @@ export const getDescription = (body: string): string => {
return description.trim() return description.trim()
} }
export const getKeywords = (shout: Shout): string => { export const getArticleKeywords = (shout: Shout): string => {
return (shout.topics || [])?.map((topic) => topic?.title).join(', ') return (shout.topics || [])?.map((topic) => topic?.title).join(', ')
} }

View File

@ -1,7 +0,0 @@
import { translit } from './ru2en'
export const slugify = (text: string) => {
return translit(text.toLowerCase())
.replaceAll(' ', '-')
.replaceAll(/[^\da-z]/g, '')
}