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
+ }
},
},
{