This commit is contained in:
Untone 2024-05-05 19:13:48 +03:00
parent 6aa84c17be
commit fa78483a38
40 changed files with 2431 additions and 1280 deletions

View File

@ -1,8 +1,21 @@
{
"$schema": "https://biomejs.dev/schemas/1.5.3/schema.json",
"files": {
"include": ["*.tsx", "*.ts", "*.js", "*.json"],
"ignore": ["./dist", "./node_modules", ".husky", "docs", "gen", "*.gen.ts", "*.d.ts"]
"include": [
"*.tsx",
"*.ts",
"*.js",
"*.json"
],
"ignore": [
"./dist",
"./node_modules",
".husky",
"docs",
"gen",
"*.gen.ts",
"*.d.ts"
]
},
"vcs": {
"defaultBranch": "dev",
@ -10,13 +23,19 @@
},
"organizeImports": {
"enabled": true,
"ignore": ["./api", "./gen"]
"ignore": [
"./api",
"./gen"
]
},
"formatter": {
"indentStyle": "space",
"indentWidth": 2,
"lineWidth": 108,
"ignore": ["./src/graphql/schema", "./gen"]
"ignore": [
"./src/graphql/schema",
"./gen"
]
},
"javascript": {
"formatter": {
@ -29,14 +48,21 @@
}
},
"linter": {
"ignore": ["*.scss", "*.md", ".DS_Store", "*.svg", "*.d.ts"],
"ignore": [
"*.scss",
"*.md",
".DS_Store",
"*.svg",
"*.d.ts"
],
"enabled": true,
"rules": {
"all": true,
"complexity": {
"noForEach": "off",
"useOptionalChain": "warn",
"useLiteralKeys": "off"
"useLiteralKeys": "off",
"noExcessiveCognitiveComplexity": "off"
},
"correctness": {
"useHookAtTopLevel": "off"
@ -54,15 +80,18 @@
"noSvgWithoutTitle": "off"
},
"nursery": {
"useImportRestrictions": "off",
"useImportType": "off",
"useFilenamingConvention": "off"
"useImportRestrictions": "off"
},
"performance": {
"noBarrelFile": "off"
},
"style": {
"useBlockStatements": "off",
"noImplicitBoolean": "off",
"useNamingConvention": "off",
"noDefaultExport": "off"
"useImportType": "off",
"noDefaultExport": "off",
"useFilenamingConvention": "off"
},
"suspicious": {
"noConsoleLog": "off",

3492
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -11,12 +11,12 @@
"deploy": "graphql-codegen && npm run typecheck && vite build && vercel",
"dev": "vite",
"e2e": "npx playwright test --project=chromium",
"fix": "npm run check:code:fix && stylelint **/*.{scss,css} --fix",
"fix": "npm run lint:code:fix && stylelint **/*.{scss,css} --fix",
"format": "npx @biomejs/biome format src/. --write",
"hygen": "HYGEN_TMPLS=gen hygen",
"postinstall": "npm run codegen && npx patch-package",
"check:code": "npx @biomejs/biome check src --log-kind=compact --verbose",
"check:code:fix": "npx @biomejs/biome check src --log-kind=compact",
"check:code:fix": "npx @biomejs/biome lint src --log-kind=compact",
"lint": "npm run lint:code && stylelint **/*.{scss,css}",
"lint:code": "npx @biomejs/biome lint src --log-kind=compact --verbose",
"lint:code:fix": "npx @biomejs/biome lint src --apply-unsafe --log-kind=compact --verbose",
@ -35,7 +35,7 @@
"devDependencies": {
"@authorizerdev/authorizer-js": "2.0.0",
"@babel/core": "7.23.3",
"@biomejs/biome": "^1.5.3",
"@biomejs/biome": "^1.7.2",
"@graphql-codegen/cli": "^5.0.0",
"@graphql-codegen/typescript": "^4.0.1",
"@graphql-codegen/typescript-operations": "^4.0.1",
@ -47,7 +47,7 @@
"@nanostores/solid": "0.4.2",
"@playwright/test": "1.41.2",
"@popperjs/core": "2.11.8",
"@sentry/browser": "7.99.0",
"@sentry/browser": "^7.113.0",
"@solid-primitives/media": "2.2.3",
"@solid-primitives/memo": "1.2.4",
"@solid-primitives/pagination": "0.2.10",
@ -129,8 +129,9 @@
"typograf": "7.3.0",
"uniqolor": "1.1.0",
"vike": "0.4.148",
"vite": "5.1.2",
"vite": "5.2.10",
"vite-plugin-mkcert": "^1.17.3",
"vite-plugin-node-polyfills": "0.21.0",
"vite-plugin-sass-dts": "^1.3.17",
"vite-plugin-solid": "2.10.1",
"y-prosemirror": "1.2.2",
@ -139,5 +140,8 @@
"overrides": {
"y-prosemirror": "1.2.2",
"yjs": "13.6.12"
}
},
"trustedDependencies": [
"@biomejs/biome"
]
}

View File

@ -45,7 +45,7 @@ import { ProfileSubscriptionsPage } from '../pages/profile/profileSubscriptions.
import { SearchPage } from '../pages/search.page'
import { TopicPage } from '../pages/topic.page'
import { ROUTES, useRouter } from '../stores/router'
import { MODALS, hideModal, showModal } from '../stores/ui'
import { MODALS, showModal } from '../stores/ui'
// TODO: lazy load
// const SomePage = lazy(() => import('./Pages/SomePage'))

View File

@ -14,7 +14,7 @@ type Props = {
}
export const CommentDate = (props: Props) => {
const { t, formatDate } = useLocalize()
const { formatDate } = useLocalize()
const formattedDate = (date: number) => {
const formatDateOptions: Intl.DateTimeFormatOptions = props.isShort

View File

@ -1,6 +1,6 @@
import { openPage } from '@nanostores/router'
import { clsx } from 'clsx'
import { Match, Show, Switch, createEffect, createMemo, createSignal, on } from 'solid-js'
import { Match, Show, Switch, createEffect, createMemo, createSignal } from 'solid-js'
import { useFollowing } from '../../../context/following'
import { useLocalize } from '../../../context/localize'
@ -37,7 +37,7 @@ export const AuthorBadge = (props: Props) => {
const [isSubscribed, setIsSubscribed] = createSignal<boolean>()
createEffect(() => {
if (!subscriptions || !props.author) return
if (!(subscriptions && props.author)) return
const subscribed = subscriptions.authors?.some((authorEntity) => authorEntity.id === props.author?.id)
setIsSubscribed(subscribed)
})
@ -46,7 +46,6 @@ export const AuthorBadge = (props: Props) => {
setIsMobileView(!mediaMatches.sm)
})
const { setFollowing } = useFollowing()
const { changeSearchParams } = useRouter()
const { t, formatDate, lang } = useLocalize()

View File

@ -43,7 +43,7 @@ export const AuthorCard = (props: Props) => {
})
createEffect(() => {
if (!subscriptions || !props.author) return
if (!(subscriptions && props.author)) return
const subscribed = subscriptions.authors?.some((authorEntity) => authorEntity.id === props.author?.id)
setIsSubscribed(subscribed)
})

View File

@ -1,9 +1,7 @@
import { clsx } from 'clsx'
import { For, Show, createEffect, createSignal, on, onMount } from 'solid-js'
import { useFollowing } from '../../context/following'
import { For, Show, createEffect, createSignal, on, } from 'solid-js'
import { useLocalize } from '../../context/localize'
import { apiClient } from '../../graphql/client/core'
import { Author } from '../../graphql/schema/core.gen'
import { setAuthorsByFollowers, setAuthorsByShouts, useAuthorsStore } from '../../stores/zine/authors'
import { AuthorBadge } from '../Author/AuthorBadge'
import { InlineLoader } from '../InlineLoader'

View File

@ -1,4 +1,4 @@
import { Buffer } from 'buffer'
import { Buffer } from 'node:buffer'
import { clsx } from 'clsx'
import { Show } from 'solid-js'

View File

@ -1,5 +1,3 @@
import type { Doc } from 'yjs/dist/src/utils/Doc'
import { HocuspocusProvider } from '@hocuspocus/provider'
import { isTextSelection } from '@tiptap/core'
import { Bold } from '@tiptap/extension-bold'
@ -30,7 +28,7 @@ import { Underline } from '@tiptap/extension-underline'
import { createEffect, createSignal, onCleanup } from 'solid-js'
import { createTiptapEditor, useEditorHTML } from 'solid-tiptap'
import uniqolor from 'uniqolor'
import * as Y from 'yjs'
import { Doc } from 'yjs'
import { useEditorContext } from '../../context/editor'
import { useLocalize } from '../../context/localize'
@ -85,7 +83,7 @@ export const Editor = (props: Props) => {
const docName = `shout-${props.shoutId}`
if (!yDocs[docName]) {
yDocs[docName] = new Y.Doc()
yDocs[docName] = new Doc()
}
if (!providers[docName]) {

View File

@ -28,6 +28,7 @@ const embedData = (data) => {
const result: { src: string; width?: string; height?: string } = { src: '' }
// biome-ignore lint/style/useForOf: <explanation>
for (let i = 0; i < attributes.length; i++) {
const attribute = attributes[i]
result[attribute.name] = attribute.value

View File

@ -13,8 +13,6 @@ import { useOutsideClickHandler } from '../../../utils/useOutsideClickHandler'
import { Button } from '../../_shared/Button'
import { DarkModeToggle } from '../../_shared/DarkModeToggle'
import { Icon } from '../../_shared/Icon'
import { useSnackbar } from '../../../context/snackbar'
import styles from './Panel.module.scss'
const typograf = new Typograf({ locale: ['ru', 'en-US'] })

View File

@ -4,8 +4,6 @@ import type { Author, Shout, Topic } from '../../graphql/schema/core.gen'
import { clsx } from 'clsx'
import { For, Show } from 'solid-js'
import { useFollowing } from '../../context/following'
import { useLocalize } from '../../context/localize'
import { AuthorBadge } from '../Author/AuthorBadge'
import { TopicCard } from '../Topic/Card'

View File

@ -1,4 +1,4 @@
import { clsx } from 'clsx'
import { useLocalize } from '../../context/localize'
import { Loading } from '../_shared/Loading'
import styles from './InlineLoader.module.scss'
@ -7,7 +7,7 @@ type Props = {
class?: string
}
export const InlineLoader = (props: Props) => {
export const InlineLoader = (_props: Props) => {
const { t } = useLocalize()
return (
<div class={styles.InlineLoader}>

View File

@ -1,7 +1,7 @@
import type { AuthModalSearchParams } from './types'
import { clsx } from 'clsx'
import { JSX, Show, createEffect, createSignal } from 'solid-js'
import { JSX, Show, createSignal } from 'solid-js'
import { useLocalize } from '../../../context/localize'
import { useSession } from '../../../context/session'
@ -32,7 +32,7 @@ export const LoginForm = () => {
const [password, setPassword] = createSignal('')
const [validationErrors, setValidationErrors] = createSignal<ValidationErrors>({})
const [isLinkSent, setIsLinkSent] = createSignal(false)
const [_isLinkSent, setIsLinkSent] = createSignal(false)
const authFormRef: { current: HTMLFormElement } = { current: null }
const { showSnackbar } = useSnackbar()
const { signIn } = useSession()

View File

@ -32,7 +32,7 @@ export const RegisterForm = () => {
const { changeSearchParams } = useRouter<AuthModalSearchParams>()
const { t } = useLocalize()
const { signUp, isRegistered, resendVerifyEmail } = useSession()
const [submitError, setSubmitError] = createSignal('')
const [_submitError, setSubmitError] = createSignal('')
const [fullName, setFullName] = createSignal('')
const [password, setPassword] = createSignal('')
const [isSubmitting, setIsSubmitting] = createSignal(false)
@ -116,7 +116,7 @@ export const RegisterForm = () => {
const handleCheckEmailStatus = (status: EmailStatus | string) => {
switch (status) {
case 'not verified':
case 'not verified': {
setValidationErrors((prev) => ({
...prev,
email: (
@ -129,8 +129,9 @@ export const RegisterForm = () => {
),
}))
break
case 'verified':
setValidationErrors((prev) => ({
}
case 'verified': {
setValidationErrors((_prev) => ({
email: (
<>
{t('This email is registered')}. {t('try')}
@ -142,7 +143,8 @@ export const RegisterForm = () => {
),
}))
break
case 'registered':
}
case 'registered': {
setValidationErrors((prev) => ({
...prev,
email: (
@ -156,9 +158,11 @@ export const RegisterForm = () => {
),
}))
break
default:
}
default: {
console.info('[RegisterForm] email is not registered')
break
}
}
}

View File

@ -59,7 +59,7 @@ export const HeaderAuth = (props: Props) => {
toggleEditorPanel()
}
const handleSaveButtonClick = () => {
const _handleSaveButtonClick = () => {
saveShout(form)
}
@ -251,7 +251,10 @@ export const HeaderAuth = (props: Props) => {
}
>
<Show when={!isSaveButtonVisible()}>
<div class={clsx(styles.userControlItem, styles.userControlItemInbox)}>
<div class={clsx(
styles.userControlItem,
// styles.userControlItemInbox
)}>
<a href={getPagePath(router, 'inbox')}>
<div classList={{ entered: page().path === '/inbox' }}>
<Icon name="inbox-white" class={styles.icon} />

View File

@ -63,7 +63,7 @@ export const NotificationGroup = (props: NotificationGroupProps) => {
return (
<>
<For each={props.notifications}>
{(n: Group, index) => (
{(n: Group, _index) => (
<>
{t(threadCaption(n.thread), { commentsCount: n.reactions.length })}{' '}
<div

View File

@ -42,14 +42,18 @@ export const TopicCard = (props: TopicProps) => {
const { follow, unfollow, subscriptions, subscribeInAction } = useFollowing()
createEffect(() => {
if (!subscriptions || !props.topic) return
if (!(subscriptions && props.topic)) return
const subscribed = subscriptions.topics?.some((topics) => topics.id === props.topic?.id)
setIsSubscribed(subscribed)
})
const handleFollowClick = () => {
requireAuthentication(() => {
follow(FollowingEntity.Topic, props.topic.slug)
if (isSubscribed()) {
unfollow(FollowingEntity.Topic, props.topic.slug)
} else {
follow(FollowingEntity.Topic, props.topic.slug)
}
}, 'subscribe')
}

View File

@ -45,9 +45,11 @@
.info {
@include font-size(1.4rem);
border: none;
//display: flex;
//flex-direction: column;
// display: flex;
// flex-direction: column;
&:hover {
background: unset;
@ -61,11 +63,13 @@
.title {
@include font-size(2.2rem);
font-weight: bold;
}
.description {
@include font-size(1.6rem);
line-height: 1.4;
margin: 0.8rem 0;
-webkit-line-clamp: 2;
@ -103,6 +107,7 @@
.title {
@include font-size(1.4rem);
font-weight: 500;
line-height: 1em;
color: var(--blue-500);
@ -111,7 +116,9 @@
.description {
color: var(--black-400);
@include font-size(1.2rem);
font-weight: 500;
margin: 0;
}

View File

@ -1,5 +1,5 @@
import { clsx } from 'clsx'
import { Show, createEffect, createSignal, on } from 'solid-js'
import { Show, createEffect, createSignal, } from 'solid-js'
import { useFollowing } from '../../../context/following'
import { useLocalize } from '../../../context/localize'
@ -27,7 +27,7 @@ export const TopicBadge = (props: Props) => {
const { follow, unfollow, subscriptions, subscribeInAction } = useFollowing()
createEffect(() => {
if (!subscriptions || !props.topic) return
if (!(subscriptions && props.topic)) return
const subscribed = subscriptions.topics?.some((topics) => topics.id === props.topic?.id)
setIsSubscribed(subscribed)
})

View File

@ -2,11 +2,11 @@ import type { Author } from '../../../graphql/schema/core.gen'
import { Meta } from '@solidjs/meta'
import { clsx } from 'clsx'
import { For, Show, createEffect, createMemo, createSignal } from 'solid-js'
import { For, Show, createMemo, createSignal } from 'solid-js'
import { useLocalize } from '../../../context/localize'
import { useRouter } from '../../../stores/router'
import { setAuthorsSort, useAuthorsStore } from '../../../stores/zine/authors'
import { useAuthorsStore } from '../../../stores/zine/authors'
import { getImageUrl } from '../../../utils/getImageUrl'
import { scrollHandler } from '../../../utils/scroll'
import { authorLetterReduce, translateAuthor } from '../../../utils/translate'
@ -33,7 +33,7 @@ export const AllAuthors = (props: Props) => {
const [searchQuery, setSearchQuery] = createSignal('')
const ALPHABET =
lang() === 'ru' ? [...'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ@'] : [...'ABCDEFGHIJKLMNOPQRSTUVWXYZ@']
const { searchParams, changeSearchParams } = useRouter<AllAuthorsPageSearchParams>()
const { searchParams } = useRouter<AllAuthorsPageSearchParams>()
const { sortedAuthors } = useAuthorsStore({
authors: props.authors,
sortBy: searchParams().by || 'name',
@ -42,7 +42,8 @@ export const AllAuthors = (props: Props) => {
const filteredAuthors = createMemo(() => {
const query = searchQuery().toLowerCase()
return sortedAuthors().filter((author) => {
return author.name.toLowerCase().includes(query) // Предполагаем, что у автора есть свойство name
// Предполагаем, что у автора есть свойство name
return author.name.toLowerCase().includes(query)
})
})

View File

@ -3,8 +3,6 @@ import type { Topic } from '../../../graphql/schema/core.gen'
import { Meta } from '@solidjs/meta'
import { clsx } from 'clsx'
import { For, Show, createEffect, createMemo, createSignal } from 'solid-js'
import { useFollowing } from '../../../context/following'
import { useLocalize } from '../../../context/localize'
import { useRouter } from '../../../stores/router'
import { setTopicsSort, useTopicsStore } from '../../../stores/zine/topics'

View File

@ -11,7 +11,7 @@ import { useSession } from '../../../context/session'
import { apiClient } from '../../../graphql/client/core'
import { router, useRouter } from '../../../stores/router'
import { loadShouts, useArticlesStore } from '../../../stores/zine/articles'
import { loadAuthor, useAuthorsStore } from '../../../stores/zine/authors'
import { loadAuthor } from '../../../stores/zine/authors'
import { getImageUrl } from '../../../utils/getImageUrl'
import { getDescription } from '../../../utils/meta'
import { restoreScrollPosition, saveScrollPosition } from '../../../utils/scroll'
@ -39,10 +39,10 @@ const LOAD_MORE_PAGE_SIZE = 9
export const AuthorView = (props: Props) => {
const { t } = useLocalize()
const { subscriptions, followers: myFollowers, loadSubscriptions } = useFollowing()
const { followers: myFollowers } = useFollowing()
const { session } = useSession()
const { sortedArticles } = useArticlesStore({ shouts: props.shouts })
const { authorEntities } = useAuthorsStore({ authors: [props.author] })
// const { authorEntities } = useAuthorsStore({ authors: [props.author] })
const { page: getPage, searchParams } = useRouter()
const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false)
const [isBioExpanded, setIsBioExpanded] = createSignal(false)

View File

@ -1,8 +1,7 @@
import { getPagePath } from '@nanostores/router'
import { For, Show, batch, createMemo, createSignal, onMount } from 'solid-js'
import { For, Show, createMemo, createSignal, onMount } from 'solid-js'
import { useLocalize } from '../../context/localize'
import { apiClient } from '../../graphql/client/core'
import { Shout, Topic } from '../../graphql/schema/core.gen'
import { router } from '../../stores/router'
import {
@ -52,8 +51,8 @@ export const HomeView = (props: Props) => {
const { topAuthors } = useTopAuthorsStore()
const { t } = useLocalize()
const [randomTopic, setRandomTopic] = createSignal<Topic>(null)
const [randomTopicArticles, setRandomTopicArticles] = createSignal<Shout[]>([])
const [randomTopic, _setRandomTopic] = createSignal<Topic>(null)
const [randomTopicArticles, _setRandomTopicArticles] = createSignal<Shout[]>([])
onMount(async () => {
loadTopArticles()

View File

@ -1,10 +1,8 @@
import { clsx } from 'clsx'
import { For, Show, createEffect, createSignal, onMount } from 'solid-js'
import { For, Show, createEffect, createSignal, } from 'solid-js'
import { useFollowing } from '../../../context/following'
import { useLocalize } from '../../../context/localize'
import { useSession } from '../../../context/session'
import { apiClient } from '../../../graphql/client/core'
import { Author, Topic } from '../../../graphql/schema/core.gen'
import { SubscriptionFilter } from '../../../pages/types'
import { dummyFilter } from '../../../utils/dummyFilter'
@ -21,7 +19,6 @@ import stylesSettings from '../../../styles/FeedSettings.module.scss'
export const ProfileSubscriptions = () => {
const { t, lang } = useLocalize()
const { author, session } = useSession()
const { subscriptions } = useFollowing()
const [following, setFollowing] = createSignal<Array<Author | Topic>>([])
const [filtered, setFiltered] = createSignal<Array<Author | Topic>>([])

View File

@ -127,10 +127,10 @@ export const PublishSettings = (props: Props) => {
}
const handlePublishSubmit = () => {
const shoutData = { ...props.form, ...settingsForm }
if (!shoutData?.mainTopic) {
showSnackbar({ body: t('Please, set the main topic first') })
} else {
if (shoutData?.mainTopic) {
publishShout(shoutData)
} else {
showSnackbar({ body: t('Please, set the main topic first') })
}
}
const handleSaveDraft = () => {

View File

@ -1,6 +1,5 @@
import { clsx } from 'clsx'
import { Show, createMemo } from 'solid-js'
import { useFollowing } from '../../../context/following'
import { useLocalize } from '../../../context/localize'
import { Button } from '../Button'
import stylesButton from '../Button/Button.module.scss'

View File

@ -1 +1 @@
export * from './Icon'
export { Icon } from './Icon'

View File

@ -10,7 +10,6 @@ import { useAuthorsStore } from '../../../stores/zine/authors'
import { AuthorBadge } from '../../Author/AuthorBadge'
import { Button } from '../Button'
import { DropdownSelect } from '../DropdownSelect'
import { Loading } from '../Loading'
import { InlineLoader } from '../../InlineLoader'
import styles from './InviteMembers.module.scss'

View File

@ -1 +1 @@
export * from './Popup'
export { Popup, PopupProps } from './Popup'

View File

@ -57,11 +57,11 @@ export const ImageSwiper = (props: Props) => {
const { register } = await import('swiper/element/bundle')
register()
SwiperCore.use([Pagination, Navigation, Manipulation, HashNavigation])
while (!mainSwipeRef.current || !mainSwipeRef.current.swiper) {
while (!(mainSwipeRef.current?.swiper)) {
await new Promise((resolve) => setTimeout(resolve, 10)) // wait 10 ms
}
mainSwipeRef.current.swiper.on('slideChange', handleSlideChange)
const initialSlide = parseInt(searchParams().slide) - 1
const initialSlide = Number.parseInt(searchParams().slide) - 1
if (initialSlide && !Number.isNaN(initialSlide) && initialSlide < props.images.length) {
mainSwipeRef.current.swiper.slideTo(initialSlide, 0)
} else {

View File

@ -1,4 +1,4 @@
import { Accessor, JSX, createContext, createEffect, createMemo, createSignal, useContext } from 'solid-js'
import { Accessor, JSX, createContext, createEffect, createSignal, useContext } from 'solid-js'
import { createStore } from 'solid-js/store'
import { apiClient } from '../graphql/client/core'
@ -16,7 +16,7 @@ type SubscribeAction = { slug: string; type: 'subscribe' | 'unsubscribe' }
interface FollowingContextType {
loading: Accessor<boolean>
followers: Accessor<Array<Author>>
followers: Accessor<Author[]>
subscriptions: AuthorFollowsResult
setSubscriptions: (subscriptions: AuthorFollowsResult) => void
setFollowing: (what: FollowingEntity, slug: string, value: boolean) => void
@ -41,7 +41,7 @@ const EMPTY_SUBSCRIPTIONS: AuthorFollowsResult = {
export const FollowingProvider = (props: { children: JSX.Element }) => {
const [loading, setLoading] = createSignal<boolean>(false)
const [followers, setFollowers] = createSignal<Array<Author>>([])
const [followers, setFollowers] = createSignal<Author[]>([])
const [subscriptions, setSubscriptions] = createStore<AuthorFollowsResult>(EMPTY_SUBSCRIPTIONS)
const { author, session } = useSession()

View File

@ -72,6 +72,7 @@ export type SessionContextType = {
resendVerifyEmail: (params: ResendVerifyEmailInput) => Promise<GenericResponse>
}
// biome-ignore lint/suspicious/noEmptyBlockStatements: <explanation>
const noop = () => {}
const SessionContext = createContext<SessionContextType>()

View File

@ -25,7 +25,7 @@ const setupIndexedDB = async () => {
})
}
const getTopicsFromIndexedDB = async (db) => {
const getTopicsFromIndexedDB = (db) => {
const tx = db.transaction(STORE_NAME, 'readonly')
const store = tx.objectStore(STORE_NAME)
return store.getAll()
@ -44,7 +44,7 @@ export const TopicsProvider = (props: { children: JSX.Element }) => {
onMount(async () => {
const db = await setupIndexedDB()
let topics = await getTopicsFromIndexedDB(db)
let topics = getTopicsFromIndexedDB(db)
if (topics.length === 0) {
topics = await apiClient.getAllTopics()

View File

@ -1,4 +1,4 @@
import { createGraphQLClient } from '../createGraphQLClient'
import markSeenMutation from '../mutation/notifier/mark-seen'
import markSeenAfterMutation from '../mutation/notifier/mark-seen-after'
import markThreadSeenMutation from '../mutation/notifier/mark-seen-thread'

View File

@ -1,6 +1,6 @@
import type { PageProps } from './types'
import { createEffect, createSignal, onMount } from 'solid-js'
import { createSignal, onMount } from 'solid-js'
import { AllAuthors } from '../components/Views/AllAuthors/'
import { PAGE_SIZE } from '../components/Views/AllTopics/AllTopics'

View File

@ -6,7 +6,6 @@ import { PageLayout } from '../components/_shared/PageLayout'
import { useLocalize } from '../context/localize'
import { apiClient } from '../graphql/client/core'
import { Shout } from '../graphql/schema/core.gen'
import { useRouter } from '../stores/router'
import { router } from '../stores/router'
import { redirectPage } from '@nanostores/router'
@ -16,7 +15,6 @@ import { LayoutType } from './types'
const EditView = lazy(() => import('../components/Views/EditView/EditView'))
export const EditPage = () => {
const { page } = useRouter()
const snackbar = useSnackbar()
const { t } = useLocalize()
@ -38,7 +36,7 @@ export const EditPage = () => {
const shout_id = window.location.pathname.split('/').pop()
if (shout_id) {
try {
await loadMyShout(parseInt(shout_id, 10))
await loadMyShout(Number.parseInt(shout_id, 10))
} catch (e) {
console.error(e)
}

View File

@ -69,7 +69,7 @@ const checkOpenOnClient = (link: HTMLAnchorElement, event) => {
)
}
const scrollToHash = (hash: string) => {
const _scrollToHash = (hash: string) => {
let selector = hash
if (/^#\d+/.test(selector)) {

View File

@ -1,5 +1,5 @@
import { createLazyMemo } from '@solid-primitives/memo'
import { createEffect, createSignal } from 'solid-js'
import { createSignal } from 'solid-js'
import { apiClient } from '../../graphql/client/core'
import { Author, QueryLoad_Authors_ByArgs } from '../../graphql/schema/core.gen'
@ -7,7 +7,7 @@ import { Author, QueryLoad_Authors_ByArgs } from '../../graphql/schema/core.gen'
export type AuthorsSortBy = 'shouts' | 'name' | 'followers'
type SortedAuthorsSetter = (prev: Author[]) => Author[]
const [sortAllBy, setSortAllBy] = createSignal<AuthorsSortBy>('name')
const [_sortAllBy, setSortAllBy] = createSignal<AuthorsSortBy>('name')
export const setAuthorsSort = (sortBy: AuthorsSortBy) => setSortAllBy(sortBy)