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 }