authors-with-counters
This commit is contained in:
parent
8ffb0ca7ce
commit
89450336e7
|
@ -9,6 +9,8 @@ import styles from '../../styles/AllTopics.module.scss'
|
|||
import { clsx } from 'clsx'
|
||||
import { useSession } from '../../context/session'
|
||||
import { locale } from '../../stores/ui'
|
||||
import { translit } from '../../utils/ru2en'
|
||||
import { SearchField } from '../_shared/SearchField'
|
||||
|
||||
type AllAuthorsPageSearchParams = {
|
||||
by: '' | 'name' | 'shouts' | 'rating'
|
||||
|
@ -19,6 +21,7 @@ type Props = {
|
|||
}
|
||||
|
||||
const PAGE_SIZE = 20
|
||||
const ALPHABET = Array.from('@АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ')
|
||||
|
||||
export const AllAuthorsView = (props: Props) => {
|
||||
const { sortedAuthors } = useAuthorsStore({ authors: props.authors })
|
||||
|
@ -32,7 +35,7 @@ export const AllAuthorsView = (props: Props) => {
|
|||
|
||||
const subscribed = (s) => Boolean(session()?.news?.authors && session()?.news?.authors?.includes(s || ''))
|
||||
|
||||
const { searchParams } = useRouter<AllAuthorsPageSearchParams>()
|
||||
const { searchParams, changeSearchParam } = useRouter<AllAuthorsPageSearchParams>()
|
||||
|
||||
const byLetter = createMemo<{ [letter: string]: Author[] }>(() => {
|
||||
return sortedAuthors().reduce((acc, author) => {
|
||||
|
@ -51,82 +54,113 @@ export const AllAuthorsView = (props: Props) => {
|
|||
})
|
||||
|
||||
const showMore = () => setLimit((oldLimit) => oldLimit + PAGE_SIZE)
|
||||
const AllAuthorsHead = () => (
|
||||
<div class="row">
|
||||
<div class={clsx(styles.pageHeader, 'col-lg-10 col-xl-9')}>
|
||||
<h1>{t('Authors')}</h1>
|
||||
<p>{t('Subscribe who you like to tune your personal feed')}</p>
|
||||
|
||||
<ul class={clsx(styles.viewSwitcher, 'view-switcher')}>
|
||||
<li classList={{ selected: searchParams().by === 'shouts' }}>
|
||||
<a href="/authors?by=shouts">{t('By shouts')}</a>
|
||||
</li>
|
||||
<li classList={{ selected: searchParams().by === 'rating' }}>
|
||||
<a href="/authors?by=rating">{t('By rating')}</a>
|
||||
</li>
|
||||
<li classList={{ selected: !searchParams().by || searchParams().by === 'name' }}>
|
||||
<a href="/authors?by=name">{t('By name')}</a>
|
||||
</li>
|
||||
<li class="view-switcher__search">
|
||||
<SearchField onChange={searchAuthors} />
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
const scrollHandler = (elemId) => {
|
||||
const anchor = document.querySelector('#' + elemId)
|
||||
// console.debug(elemId)
|
||||
if (anchor) {
|
||||
window.scrollTo({
|
||||
top: anchor.getBoundingClientRect().top - 100,
|
||||
behavior: 'smooth'
|
||||
})
|
||||
}
|
||||
}
|
||||
const [searchResults, setSearchResults] = createSignal<Author[]>([])
|
||||
// eslint-disable-next-line sonarjs/cognitive-complexity
|
||||
const searchAuthors = (value) => {
|
||||
/* very stupid search algorithm with no deps */
|
||||
let q = value.toLowerCase()
|
||||
if (q.length > 0) {
|
||||
console.debug(q)
|
||||
setSearchResults([])
|
||||
|
||||
if (locale() === 'ru') q = translit(q, 'ru')
|
||||
const aaa: Author[] = []
|
||||
sortedAuthors().forEach((a) => {
|
||||
let flag = false
|
||||
a.slug.split('-').forEach((w) => {
|
||||
if (w.startsWith(q)) flag = true
|
||||
})
|
||||
|
||||
if (!flag) {
|
||||
let wrds: string = a.name.toLowerCase()
|
||||
if (locale() === 'ru') wrds = translit(wrds, 'ru')
|
||||
wrds.split(' ').forEach((w: string) => {
|
||||
if (w.startsWith(q)) flag = true
|
||||
})
|
||||
}
|
||||
|
||||
if (flag && !aaa.includes(a)) aaa.push(a)
|
||||
})
|
||||
|
||||
setSearchResults((sr: Author[]) => [...sr, ...aaa])
|
||||
changeSearchParam('by', '')
|
||||
}
|
||||
}
|
||||
return (
|
||||
<div class={clsx(styles.allTopicsPage, 'container')}>
|
||||
<Show when={sortedAuthors().length > 0}>
|
||||
<Show when={sortedAuthors().length > 0 || searchResults().length > 0}>
|
||||
<div class="shift-content">
|
||||
<div class="row">
|
||||
<div class={clsx(styles.pageHeader, 'col-lg-10 col-xl-9')}>
|
||||
<h1>{t('Authors')}</h1>
|
||||
<p>{t('Subscribe who you like to tune your personal feed')}</p>
|
||||
<AllAuthorsHead />
|
||||
|
||||
<ul class={clsx(styles.viewSwitcher, 'view-switcher')}>
|
||||
<li classList={{ selected: searchParams().by === 'shouts' }}>
|
||||
<a href="/authors?by=shouts">{t('By shouts')}</a>
|
||||
</li>
|
||||
<li classList={{ selected: searchParams().by === 'rating' }}>
|
||||
<a href="/authors?by=rating">{t('By rating')}</a>
|
||||
</li>
|
||||
<li classList={{ selected: !searchParams().by || searchParams().by === 'name' }}>
|
||||
<a href="/authors">{t('By alphabet')}</a>
|
||||
</li>
|
||||
<li class="view-switcher__search">
|
||||
<a href="/authors/search">
|
||||
<Icon name="search" />
|
||||
{t('Search author')}
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<Show
|
||||
when={!searchParams().by || searchParams().by === 'name'}
|
||||
fallback={() => (
|
||||
<div class={styles.stats}>
|
||||
<div class="row">
|
||||
<div class="col-lg-10 col-xl-9">
|
||||
<For each={sortedAuthors().slice(0, limit())}>
|
||||
{(author) => (
|
||||
<AuthorCard
|
||||
author={author}
|
||||
compact={false}
|
||||
hasLink={true}
|
||||
subscribed={subscribed(author.slug)}
|
||||
noSocialButtons={true}
|
||||
isAuthorsList={true}
|
||||
truncateBio={true}
|
||||
/>
|
||||
)}
|
||||
</For>
|
||||
</div>
|
||||
</div>
|
||||
<Show when={sortedAuthors().length > limit()}>
|
||||
<div class="row">
|
||||
<div class={clsx(styles.loadMoreContainer, 'col-12 col-md-10')}>
|
||||
<button class={clsx('button', styles.loadMoreButton)} onClick={showMore}>
|
||||
{t('Load more')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</Show>
|
||||
<Show when={searchParams().by === 'name'}>
|
||||
<div class="row">
|
||||
<div class="col-lg-10 col-xl-9">
|
||||
<ul class={clsx('nodash', styles.alphabet)}>
|
||||
<For each={ALPHABET}>
|
||||
{(letter: string, index) => (
|
||||
<li>
|
||||
<Show when={letter in byLetter()} fallback={letter}>
|
||||
<a
|
||||
href={`/authors?by=name#letter-${index()}`}
|
||||
onClick={() => scrollHandler(`letter-${index()}`)}
|
||||
>
|
||||
{letter}
|
||||
</a>
|
||||
</Show>
|
||||
</li>
|
||||
)}
|
||||
</For>
|
||||
</ul>
|
||||
</div>
|
||||
)}
|
||||
>
|
||||
</div>
|
||||
|
||||
<For each={sortedKeys()}>
|
||||
{(letter) => (
|
||||
{(letter, index) => (
|
||||
<div class={clsx(styles.group, 'group')}>
|
||||
<h2>{letter}</h2>
|
||||
<h2 id={`letter-${index()}`}>{letter}</h2>
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-lg-10">
|
||||
<div class="row">
|
||||
<For each={byLetter()[letter]}>
|
||||
{(author: Author) => (
|
||||
{(author) => (
|
||||
<div class={clsx(styles.topic, 'topic col-sm-6 col-md-4')}>
|
||||
<div class="topic-title">
|
||||
<a href={`/author/${author.slug}`}>{author.name}</a>
|
||||
<sup>{author.stat.shouts}</sup>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
@ -139,6 +173,54 @@ export const AllAuthorsView = (props: Props) => {
|
|||
)}
|
||||
</For>
|
||||
</Show>
|
||||
|
||||
<div class={styles.stats}>
|
||||
<Show when={searchResults().length > 0}>
|
||||
<For each={searchResults().slice(0, limit())}>
|
||||
{(author) => (
|
||||
<AuthorCard
|
||||
author={author}
|
||||
compact={false}
|
||||
hasLink={true}
|
||||
subscribed={subscribed(author.slug)}
|
||||
noSocialButtons={true}
|
||||
isAuthorsList={true}
|
||||
truncateBio={true}
|
||||
/>
|
||||
)}
|
||||
</For>
|
||||
</Show>
|
||||
|
||||
<Show when={searchParams().by && searchParams().by !== 'name'}>
|
||||
<div class="row">
|
||||
<div class="col-lg-10 col-xl-9">
|
||||
<For each={sortedAuthors().slice(0, limit())}>
|
||||
{(author) => (
|
||||
<AuthorCard
|
||||
author={author}
|
||||
compact={false}
|
||||
hasLink={true}
|
||||
subscribed={subscribed(author.slug)}
|
||||
noSocialButtons={true}
|
||||
isAuthorsList={true}
|
||||
truncateBio={true}
|
||||
/>
|
||||
)}
|
||||
</For>
|
||||
</div>
|
||||
</div>
|
||||
</Show>
|
||||
|
||||
<Show when={sortedAuthors().length > limit()}>
|
||||
<div class="row">
|
||||
<div class={clsx(styles.loadMoreContainer, 'col-12 col-md-10')}>
|
||||
<button class={clsx('button', styles.loadMoreButton)} onClick={showMore}>
|
||||
{t('Load more')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</Show>
|
||||
</div>
|
||||
</div>
|
||||
</Show>
|
||||
</div>
|
||||
|
|
|
@ -20,46 +20,11 @@ type AllTopicsViewProps = {
|
|||
}
|
||||
|
||||
const PAGE_SIZE = 20
|
||||
const ALPHABET = Array.from('#АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ')
|
||||
|
||||
export const AllTopicsView = (props: AllTopicsViewProps) => {
|
||||
const { searchParams, changeSearchParam } = useRouter<AllTopicsPageSearchParams>()
|
||||
const [limit, setLimit] = createSignal(PAGE_SIZE)
|
||||
const ALPHABET = [
|
||||
'#',
|
||||
'А',
|
||||
'Б',
|
||||
'В',
|
||||
'Г',
|
||||
'Д',
|
||||
'Е',
|
||||
'Ё',
|
||||
'Ж',
|
||||
'З',
|
||||
'И',
|
||||
'Й',
|
||||
'К',
|
||||
'Л',
|
||||
'М',
|
||||
'Н',
|
||||
'О',
|
||||
'П',
|
||||
'Р',
|
||||
'С',
|
||||
'Т',
|
||||
'У',
|
||||
'Ф',
|
||||
'Х',
|
||||
'Ц',
|
||||
'Ч',
|
||||
'Ш',
|
||||
'Щ',
|
||||
'Ъ',
|
||||
'Ы',
|
||||
'Ь',
|
||||
'Э',
|
||||
'Ю',
|
||||
'Я'
|
||||
]
|
||||
|
||||
const { sortedTopics } = useTopicsStore({
|
||||
topics: props.topics,
|
||||
|
@ -139,7 +104,7 @@ export const AllTopicsView = (props: AllTopicsViewProps) => {
|
|||
<a href="/topics?by=authors">{t('By authors')}</a>
|
||||
</li>
|
||||
<li classList={{ selected: searchParams().by === 'title' }}>
|
||||
<a href="/topics?by=title">{t('By alphabet')}</a>
|
||||
<a href="/topics?by=title">{t('By title')}</a>
|
||||
</li>
|
||||
<li class="view-switcher__search">
|
||||
<SearchField onChange={searchTopics} />
|
||||
|
@ -148,6 +113,17 @@ export const AllTopicsView = (props: AllTopicsViewProps) => {
|
|||
</div>
|
||||
</div>
|
||||
)
|
||||
|
||||
const scrollHandler = (elemId) => {
|
||||
const anchor = document.querySelector('#' + elemId)
|
||||
// console.debug(elemId)
|
||||
if (anchor) {
|
||||
window.scrollTo({
|
||||
top: anchor.getBoundingClientRect().top - 100,
|
||||
behavior: 'smooth'
|
||||
})
|
||||
}
|
||||
}
|
||||
return (
|
||||
<div class={clsx(styles.allTopicsPage, 'container')}>
|
||||
<div class="shift-content">
|
||||
|
@ -161,10 +137,14 @@ export const AllTopicsView = (props: AllTopicsViewProps) => {
|
|||
<For each={ALPHABET}>
|
||||
{(letter, index) => (
|
||||
<li>
|
||||
<Show when={sortedKeys().includes(letter)}>
|
||||
<a href={`#letter-${index()}`}>{letter}</a>
|
||||
<Show when={letter in byLetter()} fallback={letter}>
|
||||
<a
|
||||
href={`/topics?by=title#letter-${index()}`}
|
||||
onClick={() => scrollHandler(`letter-${index()}`)}
|
||||
>
|
||||
{letter}
|
||||
</a>
|
||||
</Show>
|
||||
<Show when={!sortedKeys().includes(letter)}>{letter}</Show>
|
||||
</li>
|
||||
)}
|
||||
</For>
|
||||
|
@ -211,20 +191,7 @@ export const AllTopicsView = (props: AllTopicsViewProps) => {
|
|||
</For>
|
||||
</Show>
|
||||
|
||||
<Show when={searchParams().by === 'authors'}>
|
||||
<For each={sortedTopics().slice(0, limit())}>
|
||||
{(topic) => (
|
||||
<TopicCard
|
||||
topic={topic}
|
||||
compact={false}
|
||||
subscribed={subscribed(topic.slug)}
|
||||
showPublications={true}
|
||||
/>
|
||||
)}
|
||||
</For>
|
||||
</Show>
|
||||
|
||||
<Show when={searchParams().by === 'shouts'}>
|
||||
<Show when={searchParams().by && searchParams().by !== 'title'}>
|
||||
<For each={sortedTopics().slice(0, limit())}>
|
||||
{(topic) => (
|
||||
<TopicCard
|
||||
|
|
|
@ -36,7 +36,7 @@ export const FourOuFourView = (_props) => {
|
|||
</div>
|
||||
</form>
|
||||
<p class={styles.textCenter}>
|
||||
<a href="/">{t('Back to mainpage')}</a>
|
||||
<a href="/">{t('Back to main page')}</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
|
20
src/graphql/client.ts
Normal file
20
src/graphql/client.ts
Normal file
|
@ -0,0 +1,20 @@
|
|||
import { createClient } from '@urql/core'
|
||||
import { isDev } from '../utils/config'
|
||||
|
||||
const localClient = (options) => {
|
||||
console.info('[graphql] using local client')
|
||||
const url = 'http://localhost:8080'
|
||||
return createClient({ ...options, url })
|
||||
}
|
||||
|
||||
export const initClient = (options) => {
|
||||
try {
|
||||
if (isDev) {
|
||||
console.info('[graphql] devmode detected')
|
||||
return localClient(options)
|
||||
} else return createClient(options)
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
return localClient(options)
|
||||
}
|
||||
}
|
|
@ -1,6 +1,7 @@
|
|||
import { createClient, ClientOptions, dedupExchange, fetchExchange, Exchange } from '@urql/core'
|
||||
import { ClientOptions, dedupExchange, fetchExchange, Exchange } from '@urql/core'
|
||||
import { devtoolsExchange } from '@urql/devtools'
|
||||
import { isDev, apiBaseUrl } from '../utils/config'
|
||||
import { initClient } from './client'
|
||||
|
||||
const TOKEN_LOCAL_STORAGE_KEY = 'token'
|
||||
|
||||
|
@ -37,4 +38,4 @@ const options: ClientOptions = {
|
|||
exchanges
|
||||
}
|
||||
|
||||
export const privateGraphQLClient = createClient(options)
|
||||
export const privateGraphQLClient = initClient(options)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import { ClientOptions, dedupExchange, fetchExchange, createClient, Exchange } from '@urql/core'
|
||||
import { ClientOptions, dedupExchange, fetchExchange, Exchange } from '@urql/core'
|
||||
import { devtoolsExchange } from '@urql/devtools'
|
||||
import { isDev, apiBaseUrl } from '../utils/config'
|
||||
import { initClient } from './client'
|
||||
|
||||
const exchanges: Exchange[] = [dedupExchange, fetchExchange]
|
||||
|
||||
|
@ -15,4 +16,4 @@ const options: ClientOptions = {
|
|||
exchanges
|
||||
}
|
||||
|
||||
export const publicGraphQLClient = createClient(options)
|
||||
export const publicGraphQLClient = initClient(options)
|
||||
|
|
|
@ -39,6 +39,7 @@ export type AuthorStat = {
|
|||
followers?: Maybe<Scalars['Int']>
|
||||
followings?: Maybe<Scalars['Int']>
|
||||
rating?: Maybe<Scalars['Int']>
|
||||
shouts?: Maybe<Scalars['Int']>
|
||||
}
|
||||
|
||||
export type AuthorsBy = {
|
||||
|
|
|
@ -2,26 +2,32 @@
|
|||
"...subscribing": "...подписываем",
|
||||
"About the project": "О проекте",
|
||||
"All": "Все",
|
||||
"All authors": "Все авторы",
|
||||
"All posts": "Все публикации",
|
||||
"All topics": "Все темы",
|
||||
"All authors": "Все авторы",
|
||||
"Almost done! Check your email.": "Почти готово! Осталось подтвердить вашу почту.",
|
||||
"Artworks": "Артворки",
|
||||
"Audio": "Аудио",
|
||||
"Authors": "Авторы",
|
||||
"Back to mainpage": "Вернуться на главную",
|
||||
"Back to main page": "Вернуться на главную",
|
||||
"Become an author": "Стать автором",
|
||||
"Bookmarked": "Сохранено",
|
||||
"By alphabet": "По алфавиту",
|
||||
"By authors": "По авторам",
|
||||
"By name": "По имени",
|
||||
"By rating": "По популярности",
|
||||
"By relevance": "По релевантности",
|
||||
"By shouts": "По публикациям",
|
||||
"By signing up you agree with our": "Регистрируясь, вы соглашаетесь с",
|
||||
"By title": "По названию",
|
||||
"By updates": "По обновлениям",
|
||||
"By views": "По просмотрам",
|
||||
"Collaborate": "Помочь редактировать",
|
||||
"Comments": "Комментарии",
|
||||
"Communities": "Сообщества",
|
||||
"Create account": "Создать аккаунт",
|
||||
"Copy link": "Скопировать ссылку",
|
||||
"Create account": "Создать аккаунт",
|
||||
"Create post": "Создать публикацию",
|
||||
"Delete": "Удалить",
|
||||
"Discours": "Дискурс",
|
||||
"Discours is an intellectual environment, a web space and tools that allows authors to collaborate with readers and come together to co-create publications and media projects": "Дискурс — это интеллектуальная среда, веб-пространство и инструменты, которые позволяют авторам сотрудничать с читателями и объединяться для совместного создания публикаций и медиапроектов",
|
||||
|
@ -31,6 +37,8 @@
|
|||
"Dogma": "Догма",
|
||||
"Edit": "Редактировать",
|
||||
"Email": "Почта",
|
||||
"Enter": "Войти",
|
||||
"Enter text": "Введите текст",
|
||||
"Enter the Discours": "Войти в Дискурс",
|
||||
"Enter the code or click the link from email to confirm": "Введите код из письма или пройдите по ссылке в письме для подтверждения регистрации",
|
||||
"Enter your new password": "Введите новый пароль",
|
||||
|
@ -44,18 +52,26 @@
|
|||
"Follow": "Подписаться",
|
||||
"Follow the topic": "Подписаться на тему",
|
||||
"Forgot password?": "Забыли пароль?",
|
||||
"Full name": "Имя и фамилия",
|
||||
"Get to know the most intelligent people of our time, edit and discuss the articles, share your expertise, rate and decide what to publish in the magazine": "Познакомитесь с выдающимися людьми нашего времени, участвуйте в редактировании и обсуждении статей, выступайте экспертом, оценивайте материалы других авторов со всего мира и определяйте, какие статьи будут опубликованы в журнале",
|
||||
"Go to main page": "Перейти на главную",
|
||||
"Help to edit": "Помочь редактировать",
|
||||
"Hooray! Welcome!": "Ура! Добро пожаловать!",
|
||||
"Horizontal collaborative journalistic platform": "Горизонтальная платформа для коллаборативной журналистики",
|
||||
"How it works": "Как это работает",
|
||||
"How to write an article": "Как написать статью",
|
||||
"I have an account": "У меня есть аккаунт!",
|
||||
"I have no account yet": "У меня еще нет аккаунта",
|
||||
"I know the password": "Я знаю пароль",
|
||||
"Invalid email": "Проверьте правильность ввода почты",
|
||||
"Join": "Присоединиться",
|
||||
"Join our maillist": "Чтобы получать рассылку лучших публикаций, просто укажите свою почту",
|
||||
"Join the community": "Присоединиться к сообществу",
|
||||
"Join the global community of authors!": "Присоединятесь к глобальному сообществу авторов со всего мира!",
|
||||
"Just start typing...": "Просто начните печатать...",
|
||||
"Knowledge base": "База знаний",
|
||||
"Link sent, check your email": "Ссылка отправлена, проверьте почту",
|
||||
"Literature": "Литература",
|
||||
"Load more": "Показать ещё",
|
||||
"Loading": "Загрузка",
|
||||
"Manifest": "Манифест",
|
||||
|
@ -76,6 +92,11 @@
|
|||
"Passwords are not equal": "Пароли не совпадают",
|
||||
"Please check your email address": "Пожалуйста, проверьте введенный адрес почты",
|
||||
"Please confirm your email to finish": "Подтвердите почту и действие совершится",
|
||||
"Please enter a name to sign your comments and publication": "Пожалуйста, введите имя, которое будет отображаться на сайте",
|
||||
"Please enter email": "Пожалуйста, введите почту",
|
||||
"Please enter password": "Пожалуйста, введите пароль",
|
||||
"Please enter password again": "Пожалуйста, введите пароль ещё рез",
|
||||
"Please, confirm email": "Пожалуйста, подтвердите электронную почту",
|
||||
"Popular": "Популярное",
|
||||
"Popular authors": "Популярные авторы",
|
||||
"Principles": "Принципы сообщества",
|
||||
|
@ -86,12 +107,15 @@
|
|||
"Reply": "Ответить",
|
||||
"Report": "Пожаловаться",
|
||||
"Resend code": "Выслать подтверждение",
|
||||
"Restore password": "Восстановить пароль",
|
||||
"Search": "Поиск",
|
||||
"Search author": "Поиск автора",
|
||||
"Search topic": "Поиск темы",
|
||||
"Sections": "Разделы",
|
||||
"Send link again": "Прислать ссылку ещё раз",
|
||||
"Share": "Поделиться",
|
||||
"Show": "Показать",
|
||||
"Something went wrong, check email and password": "Что-то пошло не так. Проверьте адрес электронной почты и пароль",
|
||||
"Special projects": "Спецпроекты",
|
||||
"Subscribe": "Подписаться",
|
||||
"Subscribe what you like to tune your personal feed": "Подпишитесь на интересующие вас темы, чтобы настроить вашу персональную ленту и моментально узнавать о новых публикациях и обсуждениях",
|
||||
|
@ -102,6 +126,7 @@
|
|||
"Support us": "Помочь журналу",
|
||||
"Terms of use": "Правила сайта",
|
||||
"Thank you": "Благодарности",
|
||||
"This email is already taken. If it's you": "Такой email уже зарегистрирован. Если это вы",
|
||||
"To leave a comment please": "Чтобы оставить комментарий, необходимо",
|
||||
"Top authors": "Рейтинг авторов",
|
||||
"Top commented": "Самое комментируемое",
|
||||
|
@ -118,16 +143,21 @@
|
|||
"Unfollow": "Отписаться",
|
||||
"Unfollow the topic": "Отписаться от темы",
|
||||
"Username": "Имя пользователя",
|
||||
"Video": "Видео",
|
||||
"Views": "Просмотры",
|
||||
"We are convinced that one voice is good, but many is better": "Мы убеждены, один голос хорошо, а много — лучше",
|
||||
"We can't find you, check email or": "Не можем вас найти, проверьте адрес электронной почты или",
|
||||
"We create the most amazing stories together": "Самые потрясающиe истории мы создаём вместе",
|
||||
"We know you, please try to login": "Такой адрес почты уже зарегистрирован, попробуйте залогиниться",
|
||||
"We've sent you a message with a link to enter our website.": "Мы выслали вам письмо с ссылкой на почту. Перейдите по ссылке в письме, чтобы войти на сайт.",
|
||||
"Work with us": "Сотрудничать с Дискурсом",
|
||||
"Write": "Написать",
|
||||
"Write about the topic": "Написать в тему",
|
||||
"Write comment": "Написать комментарий",
|
||||
"Write to us": "Напишите нам",
|
||||
"You are subscribed": "Вы подписаны",
|
||||
"You was successfully authorized": "Вы были успешно авторизованы",
|
||||
"You've confirmed email": "Вы подтвердили почту",
|
||||
"You've reached a non-existed page": "Вы попали на несуществующую страницу",
|
||||
"actions": "действия",
|
||||
"all topics": "все темы",
|
||||
|
@ -136,46 +166,17 @@
|
|||
"collections": "коллекции",
|
||||
"community": "сообщество",
|
||||
"email not confirmed": "email не подтвержден",
|
||||
"Enter": "Войти",
|
||||
"enter": "войдите",
|
||||
"feed": "лента",
|
||||
"follower": "подписчик",
|
||||
"invalid password": "некорректный пароль",
|
||||
"personal data usage and email notifications": "на обработку персональных данных и на получение почтовых уведомлений",
|
||||
"post": "пост",
|
||||
"register": "зарегистрируйтесь",
|
||||
"sign up or sign in": "зарегистрироваться или войти",
|
||||
"terms of use": "правилами пользования сайтом",
|
||||
"topics": "темы",
|
||||
"user already exist": "пользователь уже существует",
|
||||
"view": "просмотр",
|
||||
"zine": "журнал",
|
||||
"Please, confirm email": "Пожалуйста, подтвердите электронную почту",
|
||||
"Something went wrong, check email and password": "Что-то пошло не так. Проверьте адрес электронной почты и пароль",
|
||||
"You was successfully authorized": "Вы были успешно авторизованы",
|
||||
"Invalid email": "Проверьте правильность ввода почты",
|
||||
"Please enter email": "Пожалуйста, введите почту",
|
||||
"Please enter password": "Пожалуйста, введите пароль",
|
||||
"Please enter password again": "Пожалуйста, введите пароль ещё рез",
|
||||
"Join": "Присоединиться",
|
||||
"Please enter a name to sign your comments and publication": "Пожалуйста, введите имя, которое будет отображаться на сайте",
|
||||
"Full name": "Имя и фамилия",
|
||||
"Restore password": "Восстановить пароль",
|
||||
"Hooray! Welcome!": "Ура! Добро пожаловать!",
|
||||
"You've confirmed email": "Вы подтвердили почту",
|
||||
"This email is already taken. If it's you": "Такой email уже зарегистрирован. Если это вы",
|
||||
"enter": "войдите",
|
||||
"Go to main page": "Перейти на главную",
|
||||
"Back to main page": "Вернуться на главную",
|
||||
"Almost done! Check your email.": "Почти готово! Осталось подтвердить вашу почту.",
|
||||
"We've sent you a message with a link to enter our website.": "Мы выслали вам письмо с ссылкой на почту. Перейдите по ссылке в письме, чтобы войти на сайт.",
|
||||
"Send link again": "Прислать ссылку ещё раз",
|
||||
"Link sent, check your email": "Ссылка отправлена, проверьте почту",
|
||||
"Create post": "Создать публикацию",
|
||||
"Just start typing...": "Просто начните печатать...",
|
||||
"Artworks": "Артворки",
|
||||
"Audio": "Аудио",
|
||||
"Video": "Видео",
|
||||
"Literature": "Литература",
|
||||
"We can't find you, check email or": "Не можем вас найти, проверьте адрес электронной почты или",
|
||||
"register": "зарегистрируйтесь",
|
||||
"Enter text": "Введите текст"
|
||||
"zine": "журнал"
|
||||
}
|
||||
|
|
|
@ -64,5 +64,6 @@
|
|||
li {
|
||||
min-width: 1.5em;
|
||||
margin-right: 3%;
|
||||
color: gray;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,4 @@
|
|||
export const isDev = import.meta.env.MODE === 'development'
|
||||
|
||||
export const apiBaseUrl = 'https://v2.discours.io'
|
||||
// export const apiBaseUrl = 'https://newapi.discours.io'
|
||||
// testapi.discours.io
|
||||
// export const apiBaseUrl = 'http://localhost:8080'
|
||||
// export const apiBaseUrl = 'https://testapi.discours.io'
|
||||
|
|
Loading…
Reference in New Issue
Block a user