diff --git a/src/app/dashboard/[subdomain]/editor/page.tsx b/src/app/dashboard/[subdomain]/editor/page.tsx index 79834a29..a3c9078d 100644 --- a/src/app/dashboard/[subdomain]/editor/page.tsx +++ b/src/app/dashboard/[subdomain]/editor/page.tsx @@ -1,5 +1,16 @@ -import PageComponent from "./page-component" +import PortfolioEditor from "./portfolio-editor" +import PostEditor from "./post-editor" -export default function SubdomainEditor() { - return +export default function SubdomainEditor({ + searchParams, +}: { + searchParams?: { + type: string + } +}) { + if (searchParams?.type === "portfolio") { + return + } else { + return + } } diff --git a/src/app/dashboard/[subdomain]/editor/page-component.tsx b/src/app/dashboard/[subdomain]/editor/post-editor.tsx similarity index 99% rename from src/app/dashboard/[subdomain]/editor/page-component.tsx rename to src/app/dashboard/[subdomain]/editor/post-editor.tsx index 9ffe99df..e9d8853f 100644 --- a/src/app/dashboard/[subdomain]/editor/page-component.tsx +++ b/src/app/dashboard/[subdomain]/editor/post-editor.tsx @@ -89,7 +89,7 @@ const DynamicPageContent = dynamic( }, ) -export default function SubdomainEditor() { +export default function PostEditor() { const router = useRouter() const queryClient = useQueryClient() const { t } = useTranslation("dashboard") @@ -940,7 +940,7 @@ const EditorAdvancedModal: FC<{ {t("Publish at")} href === pathname, icon: "icon-[mingcute--add-circle-line]", - text: "Creation", + text: "Publishing", }, { href: `/dashboard/${subdomain}/posts`, @@ -120,6 +120,13 @@ export default function DashboardLayout({ text: "Pages", lever: 2, }, + { + href: `/dashboard/${subdomain}/portfolios`, + isActive: ({ href, pathname }) => href === pathname, + icon: "icon-[mingcute--cloud-line]", + text: "Portfolios", + lever: 2, + }, { href: `/dashboard/${subdomain}/import`, isActive: ({ pathname }) => diff --git a/src/app/dashboard/[subdomain]/portfolios/page.tsx b/src/app/dashboard/[subdomain]/portfolios/page.tsx new file mode 100644 index 00000000..c6d01c31 --- /dev/null +++ b/src/app/dashboard/[subdomain]/portfolios/page.tsx @@ -0,0 +1,5 @@ +import { PagesManager } from "~/components/dashboard/PagesManager" + +export default function SubdomainPages() { + return +} diff --git a/src/hooks/useEditorState.ts b/src/hooks/useEditorState.ts index 96ab9550..d9ea9808 100644 --- a/src/hooks/useEditorState.ts +++ b/src/hooks/useEditorState.ts @@ -13,6 +13,7 @@ export const initialEditorState = { mime_type: "", }, disableAISummary: false, + externalUrl: "", } export type Values = { title: string @@ -27,6 +28,7 @@ export type Values = { mime_type?: string } disableAISummary: boolean + externalUrl: string } export const useEditorState = create< diff --git a/src/lib/expand-unit.ts b/src/lib/expand-unit.ts index fbef1035..f47e36a9 100644 --- a/src/lib/expand-unit.ts +++ b/src/lib/expand-unit.ts @@ -32,12 +32,10 @@ export const expandCrossbellNote = async ({ ) if (expandedNote.metadata?.content) { + let rendered if (expandedNote.metadata?.content?.content) { const { renderPageContent } = await import("~/markdown") - const rendered = renderPageContent( - expandedNote.metadata.content.content, - true, - ) + rendered = renderPageContent(expandedNote.metadata.content.content, true) if (keyword) { const position = expandedNote.metadata.content.content .toLowerCase() @@ -51,23 +49,6 @@ export const expandCrossbellNote = async ({ expandedNote.metadata.content.summary = rendered.excerpt } } - expandedNote.metadata.content.cover = - expandedNote.metadata?.content?.attachments?.find( - (attachment) => attachment.name === "cover", - )?.address || rendered.cover - - expandedNote.metadata.content.images = [] - const cover = expandedNote.metadata?.content?.attachments?.find( - (attachment) => attachment.name === "cover", - )?.address - if (cover) { - expandedNote.metadata.content.images.push(cover) - } - expandedNote.metadata.content.images = - expandedNote.metadata.content.images.concat(rendered.images) - expandedNote.metadata.content.images = [ - ...new Set(expandedNote.metadata.content.images), - ] expandedNote.metadata.content.audio = rendered.audio expandedNote.metadata.content.frontMatter = rendered.frontMatter @@ -76,6 +57,24 @@ export const expandCrossbellNote = async ({ expandedNote.metadata.content.contentHTML = rendered.contentHTML } } + expandedNote.metadata.content.cover = + expandedNote.metadata?.content?.attachments?.find( + (attachment) => attachment.name === "cover", + )?.address || rendered?.cover + + expandedNote.metadata.content.images = [] + const cover = expandedNote.metadata?.content?.attachments?.find( + (attachment) => attachment.name === "cover", + )?.address + if (cover) { + expandedNote.metadata.content.images.push(cover) + } + expandedNote.metadata.content.images = + expandedNote.metadata.content.images.concat(rendered?.images || []) + expandedNote.metadata.content.images = [ + ...new Set(expandedNote.metadata.content.images), + ] + expandedNote.metadata.content.slug = getNoteSlug(expandedNote) if (!expandedNote.metadata.content.date_published && expandedNote.noteId) { expandedNote.metadata.content.date_published = expandedNote.createdAt diff --git a/src/lib/i18n/locales/zh/dashboard.json b/src/lib/i18n/locales/zh/dashboard.json index 0f1a2c3c..aa76af6f 100644 --- a/src/lib/i18n/locales/zh/dashboard.json +++ b/src/lib/i18n/locales/zh/dashboard.json @@ -221,5 +221,6 @@ "Disable AI-generated summary": "禁用 AI 生成的摘要", "Pin": "置顶", "Unpin": "取消置顶", - "Interaction": "互动" + "Interaction": "互动", + "External Url": "外部链接" } diff --git a/src/models/page.model.ts b/src/models/page.model.ts index efa72457..23743d46 100644 --- a/src/models/page.model.ts +++ b/src/models/page.model.ts @@ -118,7 +118,7 @@ const getLocalPages = (input: { date_published: page.values?.publishedAt, summary: page.values?.excerpt, tags: [ - input.type, + page.type, ...(page.values?.tags ?.split(",") .map((tag: string) => tag.trim()) @@ -127,6 +127,22 @@ const getLocalPages = (input: { slug: page.values?.slug, sources: ["xlog"], disableAISummary: page.values?.disableAISummary, + external_urls: page.values?.external_url + ? [page.values?.external_url] + : undefined, + cover: page.values?.cover?.address, + images: [page.values?.cover?.address], + attachments: [ + ...(page.values?.cover?.address + ? [ + { + name: "cover", + address: page.values?.cover.address, + mime_type: page.values?.cover.mime_type, + }, + ] + : []), + ], }, }, local: true, diff --git a/src/queries/page.ts b/src/queries/page.ts index ef47f4bd..806865e1 100644 --- a/src/queries/page.ts +++ b/src/queries/page.ts @@ -227,6 +227,7 @@ export function useCreatePage() { mime_type?: string } disableAISummary?: boolean + externalUrl?: string }) => { if (!input.characterId) { throw new Error("characterId is required") @@ -273,6 +274,7 @@ export function useCreatePage() { ] : []), ], + external_urls: [input.externalUrl], } as NoteMetadata & { summary?: string }, @@ -313,6 +315,7 @@ export function useUpdatePage() { mime_type?: string } disableAISummary?: boolean + externalUrl?: string }) => { if (!input.characterId || !input.noteId) { throw new Error("characterId and noteId are required") @@ -407,6 +410,13 @@ export function useUpdatePage() { }) } } + + if (input.externalUrl) { + if (!metadataDraft.external_urls) { + metadataDraft.external_urls = [] + } + metadataDraft.external_urls[0] = input.externalUrl + } }, }, {