diff --git a/src/components/Nav/AuthModal/LoginForm.tsx b/src/components/Nav/AuthModal/LoginForm.tsx
index c7a26d68..1a50aeda 100644
--- a/src/components/Nav/AuthModal/LoginForm.tsx
+++ b/src/components/Nav/AuthModal/LoginForm.tsx
@@ -95,8 +95,8 @@ export const LoginForm = () => {
try {
const { errors } = await signIn({ email: email(), password: password() })
- console.error('[signIn errors]', errors)
if (errors?.length > 0) {
+ console.debug('[signIn] errors:', errors)
if (
errors.some(
(error) =>
diff --git a/src/components/Topic/TopicBadge/TopicBadge.module.scss b/src/components/Topic/TopicBadge/TopicBadge.module.scss
index 52edb734..6b818c60 100644
--- a/src/components/Topic/TopicBadge/TopicBadge.module.scss
+++ b/src/components/Topic/TopicBadge/TopicBadge.module.scss
@@ -45,7 +45,6 @@
.info {
@include font-size(1.4rem);
-
border: none;
// display: flex;
@@ -63,13 +62,11 @@
.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;
@@ -107,7 +104,6 @@
.title {
@include font-size(1.4rem);
-
font-weight: 500;
line-height: 1em;
color: var(--blue-500);
@@ -116,9 +112,7 @@
.description {
color: var(--black-400);
-
@include font-size(1.2rem);
-
font-weight: 500;
margin: 0;
}
diff --git a/src/components/Topic/TopicBadge/TopicBadge.tsx b/src/components/Topic/TopicBadge/TopicBadge.tsx
index fa7e577b..73afe366 100644
--- a/src/components/Topic/TopicBadge/TopicBadge.tsx
+++ b/src/components/Topic/TopicBadge/TopicBadge.tsx
@@ -48,7 +48,7 @@ export const TopicBadge = (props: Props) => {
lang() === 'en' ? capitalize(props.topic.slug.replaceAll('-', ' ')) : props.topic.title
return (
-
+
diff --git a/src/context/connect.tsx b/src/context/connect.tsx
index 2b2dc808..f8ebb1c9 100644
--- a/src/context/connect.tsx
+++ b/src/context/connect.tsx
@@ -30,53 +30,57 @@ const ConnectContext = createContext()
export const ConnectProvider = (props: { children: JSX.Element }) => {
const [messageHandlers, setHandlers] = createSignal([])
- // const [messages, setMessages] = createSignal>([]);
const [connected, setConnected] = createSignal(false)
const { session } = useSession()
+ const [retried, setRetried] = createSignal(0)
const addHandler = (handler: MessageHandler) => {
setHandlers((hhh) => [...hhh, handler])
}
- const [retried, setRetried] = createSignal(0)
createEffect(async () => {
const token = session()?.access_token
- if (token && !connected()) {
+ if (token && !connected() && retried() <= RECONNECT_TIMES) {
console.info('[context.connect] init SSE connection')
- await fetchEventSource('https://connect.discours.io', {
- method: 'GET',
- headers: {
- 'Content-Type': 'application/json',
- Authorization: token,
- },
- onmessage(event) {
- const m: SSEMessage = JSON.parse(event.data || '{}')
- console.log('[context.connect] Received message:', m)
-
- // Iterate over all registered handlers and call them
- messageHandlers().forEach((handler) => handler(m))
- },
- async onopen(response) {
- console.log('[context.connect] SSE connection opened', response)
- if (response.ok && response.headers.get('content-type') === EventStreamContentType) {
- setConnected(true)
- } else if (response.status === 401) {
- throw new Error('SSE: cannot connect to real-time updates')
- } else {
- setRetried((r) => r + 1)
- throw new Error(`SSE: failed to connect ${retried()} times`)
- }
- },
- onclose() {
- console.log('[context.connect] SSE connection closed by server')
- setConnected(false)
- },
- onerror(err) {
- if (err.message === 'unauthorized' || retried() > RECONNECT_TIMES) {
- throw err // rethrow to stop the operation
- }
- },
- })
+ try {
+ await fetchEventSource('https://connect.discours.io', {
+ method: 'GET',
+ headers: {
+ 'Content-Type': 'application/json',
+ Authorization: token,
+ },
+ onmessage(event) {
+ const m: SSEMessage = JSON.parse(event.data || '{}')
+ console.log('[context.connect] Received message:', m)
+ messageHandlers().forEach((handler) => handler(m))
+ },
+ onopen: (response) => {
+ console.log('[context.connect] SSE connection opened', response)
+ if (response.ok && response.headers.get('content-type') === EventStreamContentType) {
+ setConnected(true)
+ setRetried(0)
+ return Promise.resolve()
+ }
+ return Promise.reject(`SSE: cannot connect to real-time updates, status: ${response.status}`)
+ },
+ onclose() {
+ console.log('[context.connect] SSE connection closed by server')
+ setConnected(false)
+ if (retried() < RECONNECT_TIMES) {
+ setRetried((r) => r + 1)
+ }
+ },
+ onerror(err) {
+ console.error('[context.connect] SSE connection error:', err)
+ setConnected(false)
+ if (retried() < RECONNECT_TIMES) {
+ setRetried((r) => r + 1)
+ } else throw Error(err)
+ },
+ })
+ } catch (error) {
+ console.error('[context.connect] SSE connection failed:', error)
+ }
}
})
diff --git a/src/pages/edit.page.tsx b/src/pages/edit.page.tsx
index 21353681..f729e50b 100644
--- a/src/pages/edit.page.tsx
+++ b/src/pages/edit.page.tsx
@@ -1,4 +1,4 @@
-import { Show, Suspense, createEffect, createMemo, createSignal, lazy, on, onMount } from 'solid-js'
+import { Show, Suspense, createEffect, createMemo, createSignal, lazy, on } from 'solid-js'
import { AuthGuard } from '../components/AuthGuard'
import { Loading } from '../components/_shared/Loading'
@@ -7,7 +7,7 @@ import { useLocalize } from '../context/localize'
import { useSession } from '../context/session'
import { apiClient } from '../graphql/client/core'
import { Shout } from '../graphql/schema/core.gen'
-import { router } from '../stores/router'
+import { router, useRouter } from '../stores/router'
import { redirectPage } from '@nanostores/router'
import { useSnackbar } from '../context/snackbar'
@@ -33,6 +33,7 @@ const getContentTypeTitle = (layout: LayoutType) => {
export const EditPage = () => {
const { t } = useLocalize()
const { session } = useSession()
+ const { page } = useRouter()
const snackbar = useSnackbar()
const fail = async (error: string) => {
@@ -45,12 +46,18 @@ export const EditPage = () => {
const [shoutId, setShoutId] = createSignal(0)
const [shout, setShout] = createSignal()
- onMount(() => {
- const shoutId = window.location.pathname.split('/').pop()
- const shoutIdFromUrl = Number.parseInt(shoutId ?? '0', 10)
- console.debug(`editing shout ${shoutIdFromUrl}`)
- if (shoutIdFromUrl) setShoutId(shoutIdFromUrl)
- })
+ createEffect(
+ on(
+ page,
+ (p) => {
+ const shoutId = p?.path.split('/').pop()
+ const shoutIdFromUrl = Number.parseInt(shoutId ?? '0', 10)
+ console.debug(`editing shout ${shoutIdFromUrl}`)
+ if (shoutIdFromUrl) setShoutId(shoutIdFromUrl)
+ },
+ { defer: true },
+ ),
+ )
createEffect(
on([session, shout, shoutId], async ([ses, sh, shid]) => {