session-fixes
This commit is contained in:
parent
c12d752ad0
commit
dd370144a7
|
@ -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))
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 */}
|
||||||
|
|
|
@ -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 },
|
||||||
|
|
|
@ -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(() => {
|
||||||
|
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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'
|
||||||
|
|
||||||
|
|
|
@ -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}`)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user