session-fixes
Some checks failed
deploy / test (push) Failing after 1m41s
deploy / deploy (push) Has been skipped

This commit is contained in:
Untone 2023-12-17 15:36:47 +03:00
parent c12d752ad0
commit dd370144a7
9 changed files with 60 additions and 67 deletions

View File

@ -86,10 +86,10 @@ const getTitleAndSubtitle = (
export const ArticleCard = (props: ArticleCardProps) => { export const ArticleCard = (props: ArticleCardProps) => {
const { t, lang, formatDate } = useLocalize() const { t, lang, formatDate } = useLocalize()
const { author } = useSession() const { author } = useSession()
const mainTopicSlug = props.article.main_topic const mainTopicSlug = props.article.main_topic || ''
const mainTopic = props.article.topics.find((tpc: Topic) => tpc.slug === mainTopicSlug) const mainTopic = props.article.topics.find((tpc: Topic) => tpc.slug === mainTopicSlug)
const mainTopicTitle = const mainTopicTitle =
lang() === 'ru' && mainTopic?.title ? mainTopic.title : mainTopicSlug.replace('-', ' ') mainTopicSlug && lang() === 'en' ? mainTopicSlug.replace('-', ' ') : mainTopic.title
const formattedDate = createMemo<string>(() => { const formattedDate = createMemo<string>(() => {
return formatDate(new Date(props.article.created_at * 1000)) return formatDate(new Date(props.article.created_at * 1000))

View File

@ -40,8 +40,8 @@
.authImage { .authImage {
@include font-size(1.5rem); @include font-size(1.5rem);
background: var(--background-color-invert) url('https://cdn.discours.io/production/image/auth-page.jpg') background: var(--background-color-invert)
center no-repeat; url('https://images.discours.io/unsafe/1600x/production/image/auth-page.jpg') center no-repeat;
background-size: cover; background-size: cover;
color: var(--default-color-invert); color: var(--default-color-invert);
display: flex; display: flex;

View File

@ -1,7 +1,7 @@
import type { ConfirmEmailSearchParams } from './types' import type { ConfirmEmailSearchParams } from './types'
import { clsx } from 'clsx' import { clsx } from 'clsx'
import { createMemo, createSignal, onMount, Show } from 'solid-js' import { createEffect, createMemo, createSignal, onMount, Show } from 'solid-js'
import { useLocalize } from '../../../context/localize' import { useLocalize } from '../../../context/localize'
import { useSession } from '../../../context/session' import { useSession } from '../../../context/session'
@ -17,7 +17,9 @@ export const EmailConfirm = () => {
actions: { confirmEmail, loadSession, loadAuthor }, actions: { confirmEmail, loadSession, loadAuthor },
session, session,
} = useSession() } = useSession()
const confirmedEmail = createMemo(() => session()?.user?.email_verified) const [confirmedEmail, setConfirmedEmail] = createSignal<boolean>(
Boolean(session()?.user?.email_verified),
)
const [isTokenExpired, setIsTokenExpired] = createSignal(false) const [isTokenExpired, setIsTokenExpired] = createSignal(false)
const [isTokenInvalid, setIsTokenInvalid] = createSignal(false) const [isTokenInvalid, setIsTokenInvalid] = createSignal(false)
@ -29,6 +31,7 @@ export const EmailConfirm = () => {
try { try {
await confirmEmail({ token }) await confirmEmail({ token })
await loadSession() await loadSession()
changeSearchParam({})
await loadAuthor() await loadAuthor()
} catch (error) { } catch (error) {
if (error instanceof ApiError) { if (error instanceof ApiError) {
@ -48,6 +51,8 @@ export const EmailConfirm = () => {
} }
}) })
createEffect(() => setConfirmedEmail(session()?.user?.email_verified))
return ( return (
<div> <div>
{/* TODO: texts */} {/* TODO: texts */}

View File

@ -81,11 +81,11 @@ export const AuthorView = (props: Props) => {
await loadMore() await loadMore()
} }
const { authors, topics } = await fetchSubscriptions() const { authors, topics } = await fetchSubscriptions()
setFollowing([...authors, ...topics]) setFollowing([...(authors || []), ...(topics || [])])
}) })
onMount(() => { createEffect(() => {
document.title = author().name document.title = author()?.name
}) })
const loadMore = async () => { const loadMore = async () => {
@ -115,7 +115,7 @@ export const AuthorView = (props: Props) => {
const [commented, setCommented] = createSignal([]) const [commented, setCommented] = createSignal([])
createEffect(async () => { createEffect(async () => {
if (getPage().route === 'authorComments') { if (getPage().route === 'authorComments' && props.author) {
try { try {
const data = await apiClient.getReactionsBy({ const data = await apiClient.getReactionsBy({
by: { comment: true, created_by: props.author.id }, by: { comment: true, created_by: props.author.id },

View File

@ -18,7 +18,8 @@ export const DraftsView = () => {
const loadDrafts = async () => { const loadDrafts = async () => {
const loadedDrafts = await apiClient.getDrafts() const loadedDrafts = await apiClient.getDrafts()
setDrafts(loadedDrafts.reverse()) if (loadedDrafts) setDrafts(loadedDrafts.reverse())
else setDrafts([])
} }
onMount(() => { onMount(() => {

View File

@ -28,10 +28,8 @@ const ConnectContext = createContext<ConnectContextType>()
export const ConnectProvider = (props: { children: JSX.Element }) => { export const ConnectProvider = (props: { children: JSX.Element }) => {
const [messageHandlers, setHandlers] = createSignal<Array<MessageHandler>>([]) const [messageHandlers, setHandlers] = createSignal<Array<MessageHandler>>([])
// const [messages, setMessages] = createSignal<Array<SSEMessage>>([]); // const [messages, setMessages] = createSignal<Array<SSEMessage>>([]);
const [connected, setConnected] = createSignal(false) const [connected, setConnected] = createSignal(false)
const { const {
isAuthenticated,
actions: { getToken }, actions: { getToken },
} = useSession() } = useSession()
@ -41,9 +39,8 @@ export const ConnectProvider = (props: { children: JSX.Element }) => {
const [retried, setRetried] = createSignal<number>(0) const [retried, setRetried] = createSignal<number>(0)
createEffect(async () => { createEffect(async () => {
if (isAuthenticated() && !connected()) {
const token = getToken() const token = getToken()
if (token) { if (token && !connected()) {
await fetchEventSource('https://connect.discours.io', { await fetchEventSource('https://connect.discours.io', {
method: 'GET', method: 'GET',
headers: { headers: {
@ -61,12 +58,11 @@ export const ConnectProvider = (props: { children: JSX.Element }) => {
console.log('[context.connect] SSE connection opened', response) console.log('[context.connect] SSE connection opened', response)
if (response.ok && response.headers.get('content-type') === EventStreamContentType) { if (response.ok && response.headers.get('content-type') === EventStreamContentType) {
setConnected(true) setConnected(true)
return
} else if (response.status === 401) { } else if (response.status === 401) {
throw new Error('unauthorized') throw new Error('unauthorized')
} else { } else {
setRetried((r) => r + 1) setRetried((r) => r + 1)
throw new Error() throw new Error('Internal Error')
} }
}, },
onclose() { onclose() {
@ -74,17 +70,11 @@ export const ConnectProvider = (props: { children: JSX.Element }) => {
setConnected(false) setConnected(false)
}, },
onerror(err) { onerror(err) {
if (err.message == 'unauthorized' || retried() > RECONNECT_TIMES) { if (err.message === 'unauthorized' || retried() > RECONNECT_TIMES) {
throw err // rethrow to stop the operation throw err // rethrow to stop the operation
} else {
// do nothing to automatically retry. You can also
// return a specific retry interval here.
} }
}, },
}) })
return
}
} }
}) })

View File

@ -62,7 +62,7 @@ export const InboxProvider = (props: { children: JSX.Element }) => {
setChats(newChats) setChats(newChats)
} }
} catch (error) { } catch (error) {
console.log('[loadChats] error: ', error) console.log('[loadChats] error:', error)
} }
} }

View File

@ -1,6 +1,6 @@
import type { Accessor, JSX } from 'solid-js' import type { Accessor, JSX } from 'solid-js'
import { createContext, createEffect, createMemo, createSignal, onMount, useContext } from 'solid-js' import { createContext, createMemo, createSignal, onMount, useContext } from 'solid-js'
import { createStore } from 'solid-js/store' import { createStore } from 'solid-js/store'
import { Portal } from 'solid-js/web' import { Portal } from 'solid-js/web'

View File

@ -6,7 +6,6 @@ import {
VerifyEmailInput, VerifyEmailInput,
LoginInput, LoginInput,
AuthToken, AuthToken,
User,
Authorizer, Authorizer,
ConfigType, ConfigType,
} from '@authorizerdev/authorizer-js' } from '@authorizerdev/authorizer-js'
@ -22,11 +21,11 @@ import {
} from 'solid-js' } from 'solid-js'
import { apiClient } from '../graphql/client/core' import { apiClient } from '../graphql/client/core'
import { useRouter } from '../stores/router'
import { showModal } from '../stores/ui' import { showModal } from '../stores/ui'
import { useLocalize } from './localize' import { useLocalize } from './localize'
import { useSnackbar } from './snackbar' import { useSnackbar } from './snackbar'
import { useRouter } from '../stores/router'
const config: ConfigType = { const config: ConfigType = {
authorizerURL: 'https://auth.discours.io', authorizerURL: 'https://auth.discours.io',
@ -86,13 +85,13 @@ export const SessionProvider = (props: {
const getSession = async (): Promise<AuthToken> => { const getSession = async (): Promise<AuthToken> => {
try { try {
const tkn = getToken() const tkn = getToken()
console.debug('[context.session] token before: ', tkn) console.debug('[context.session] token before:', tkn)
const authResult = await authorizer().getSession({ const authResult = await authorizer().getSession({
Authorization: tkn, Authorization: tkn,
}) })
if (authResult?.access_token) { if (authResult?.access_token) {
mutate(authResult) mutate(authResult)
console.debug('[context.session] token after: ', authResult.access_token) console.debug('[context.session] token after:', authResult.access_token)
await loadSubscriptions() await loadSubscriptions()
return authResult return authResult
} }
@ -112,8 +111,6 @@ export const SessionProvider = (props: {
initialValue: null, initialValue: null,
}) })
const user = createMemo(() => session()?.user)
createEffect(() => { createEffect(() => {
// detect confirm redirect // detect confirm redirect
const params = searchParams() const params = searchParams()
@ -196,10 +193,10 @@ export const SessionProvider = (props: {
setConfig({ ...config, ...metaRes, redirectURL: window.location.origin + '/?modal=auth' }) setConfig({ ...config, ...metaRes, redirectURL: window.location.origin + '/?modal=auth' })
console.log('[context.session] refreshing session...') console.log('[context.session] refreshing session...')
const s = await getSession() const s = await getSession()
console.debug('[context.session] session: ', s) console.debug('[context.session] session:', s)
console.log('[context.session] loading author...') console.log('[context.session] loading author...')
const a = await loadAuthor() const a = await loadAuthor()
console.debug('[context.session] author: ', a) console.debug('[context.session] author:', a)
setIsSessionLoaded(true) setIsSessionLoaded(true)
console.log('[context.session] loaded') console.log('[context.session] loaded')
}) })
@ -224,7 +221,7 @@ export const SessionProvider = (props: {
} }
const confirmEmail = async (input: VerifyEmailInput) => { const confirmEmail = async (input: VerifyEmailInput) => {
console.log(`[context.session] calling authorizer's verify email with ${input}`) console.debug(`[context.session] calling authorizer's verify email with`, input)
const at: void | AuthToken = await authorizer().verifyEmail(input) const at: void | AuthToken = await authorizer().verifyEmail(input)
if (at) mutate(at) if (at) mutate(at)
console.log(`[context.session] confirmEmail got result ${at}`) console.log(`[context.session] confirmEmail got result ${at}`)