diff --git a/src/atoms/owner.ts b/src/atoms/owner.ts
index b0afec70ac..475530404b 100644
--- a/src/atoms/owner.ts
+++ b/src/atoms/owner.ts
@@ -6,6 +6,8 @@ import { aggregationDataAtom } from '~/providers/root/aggregation-data-provider'
import { getToken, removeToken, setToken } from '~/utils/cookie'
import { apiClient } from '~/utils/request'
+import { fetchAppUrl } from './url'
+
const ownerAtom = atom((get) => {
return get(aggregationDataAtom)?.user
})
@@ -23,6 +25,7 @@ export const login = async (username?: string, password?: string) => {
setToken(token)
jotaiStore.set(isLoggedAtom, true)
+ await fetchAppUrl()
toast(`欢迎回来,${jotaiStore.get(ownerAtom)?.name}`, 'success')
}
diff --git a/src/atoms/url.ts b/src/atoms/url.ts
index 3be0ccc5b2..833714a2ca 100644
--- a/src/atoms/url.ts
+++ b/src/atoms/url.ts
@@ -20,7 +20,7 @@ export const fetchAppUrl = async () => {
jotaiStore.set(adminUrlAtom, data.adminUrl)
}
-export const getAppUrl = () => jotaiStore.get(adminUrlAtom)
+export const getAdminUrl = () => jotaiStore.get(adminUrlAtom)
export const useAppUrl = () => {
const url = useAggregationSelector((a) => a.url)
const adminUrl = useAtomValue(adminUrlAtom)
diff --git a/src/components/layout/header/internal/AnimatedLogo.tsx b/src/components/layout/header/internal/AnimatedLogo.tsx
index 8183a45ba5..6c2125bd9c 100644
--- a/src/components/layout/header/internal/AnimatedLogo.tsx
+++ b/src/components/layout/header/internal/AnimatedLogo.tsx
@@ -3,7 +3,7 @@
import { AnimatePresence, motion } from 'framer-motion'
import { useRouter } from 'next/navigation'
-import { getAppUrl, isLogged, useViewport } from '~/atoms'
+import { getAdminUrl, isLogged, useViewport } from '~/atoms'
import { useSingleAndDoubleClick } from '~/hooks/common/use-single-double-click'
import { Routes } from '~/lib/route-builder'
import { toast } from '~/lib/toast'
@@ -19,7 +19,7 @@ const TapableLogo = () => {
},
() => {
if (isLogged()) {
- const adminUrl = getAppUrl()?.adminUrl
+ const adminUrl = getAdminUrl()
if (adminUrl) location.href = adminUrl
else {
toast('Admin url not found', 'error')
diff --git a/src/components/layout/header/internal/HeaderMeta.tsx b/src/components/layout/header/internal/HeaderMeta.tsx
index 41dbe3c199..0474965851 100644
--- a/src/components/layout/header/internal/HeaderMeta.tsx
+++ b/src/components/layout/header/internal/HeaderMeta.tsx
@@ -41,7 +41,9 @@ export const HeaderMeta = () => {
>
- {description}
+
+ {description}
+
{title}
@@ -49,10 +51,10 @@ export const HeaderMeta = () => {
-
+
{' '}
{slug}
-
+
{seoTitle}
diff --git a/src/components/widgets/comment/Comments.tsx b/src/components/widgets/comment/Comments.tsx
index cc89034b73..5e4d088100 100644
--- a/src/components/widgets/comment/Comments.tsx
+++ b/src/components/widgets/comment/Comments.tsx
@@ -4,7 +4,7 @@ export const Comments: FC<{
refId: string
}> = ({ refId }) => {
return (
-
+
Comments WIP, RefId: {refId}
)
diff --git a/src/providers/root/socket-provider.tsx b/src/providers/root/socket-provider.tsx
index 6b4bdaa83a..6810ed03cf 100644
--- a/src/providers/root/socket-provider.tsx
+++ b/src/providers/root/socket-provider.tsx
@@ -2,7 +2,6 @@
import { useEffect } from 'react'
-// const Context = createContext
(null as any)
export const SocketContainer: Component = () => {
useEffect(() => {
import('~/socket').then((module) => {
diff --git a/src/socket/handler.ts b/src/socket/handler.ts
index e4e1f6943f..5bbf0ce7b9 100644
--- a/src/socket/handler.ts
+++ b/src/socket/handler.ts
@@ -1,16 +1,34 @@
+import type { NoteModel } from '@mx-space/api-client'
+import type { EventTypes } from '~/types/events'
+
import { setOnlineCount } from '~/atoms'
-import { EventTypes } from '~/types/events'
+import { toast } from '~/lib/toast'
+import {
+ getCurrentNoteData,
+ setCurrentNoteData,
+} from '~/providers/note/CurrentNoteDataProvider'
import { isDev } from '~/utils/env'
export const eventHandler = (type: EventTypes, data: any) => {
switch (type) {
- case EventTypes.VISITOR_ONLINE:
- case EventTypes.VISITOR_OFFLINE: {
+ case 'VISITOR_ONLINE':
+ case 'VISITOR_OFFLINE': {
const { online } = data
setOnlineCount(online)
break
}
+ case 'NOTE_UPDATE': {
+ const note = data as NoteModel
+ if (getCurrentNoteData()?.data.id === note.id) {
+ setCurrentNoteData((draft) => {
+ Object.assign(draft.data, note)
+ })
+ toast('手记已更新')
+ }
+ break
+ }
+
default: {
if (isDev) {
console.log(type, data)
diff --git a/src/types/events.ts b/src/types/events.ts
index 4118a55bd6..03eaea7fad 100644
--- a/src/types/events.ts
+++ b/src/types/events.ts
@@ -1,3 +1,5 @@
+import type { NoteModel } from '@mx-space/api-client'
+
export enum EventTypes {
GATEWAY_CONNECT = 'GATEWAY_CONNECT',
GATEWAY_DISCONNECT = 'GATEWAY_DISCONNECT',
@@ -26,5 +28,11 @@ export enum EventTypes {
DANMAKU_CREATE = 'DANMAKU_CREATE',
RECENTLY_CREATE = 'RECENTLY_CREATE',
- RECENTLY_DElETE = 'RECENTLY_DElETE',
+ RECENTLY_DELETE = 'RECENTLY_DELETE',
+}
+
+export interface EventTypesPayload {
+ [EventTypes.VISITOR_ONLINE]: { online: number }
+ [EventTypes.VISITOR_OFFLINE]: { online: number }
+ [EventTypes.NOTE_UPDATE]: NoteModel
}