diff --git a/src/lib/helpers.ts b/src/lib/helpers.ts index fbc8fb9f..36588f4a 100644 --- a/src/lib/helpers.ts +++ b/src/lib/helpers.ts @@ -1,3 +1,5 @@ +import { NoteEntity } from "crossbell.js" + import { IS_PROD } from "./constants" import { OUR_DOMAIN } from "./env" @@ -18,3 +20,13 @@ export const getSiteLink = ({ } return `${IS_PROD ? "https" : "http"}://${subdomain}.${OUR_DOMAIN}` } + +export const getNoteSlug = (note: NoteEntity) => { + return ( + note.metadata?.content?.attributes?.find( + (a) => a?.trait_type === "xlog_slug", + )?.value || + (note.metadata?.content as any)?._xlog_slug || + (note.metadata?.content as any)?._crosslog_slug + )?.toLowerCase?.() +} diff --git a/src/lib/url-composer.ts b/src/lib/url-composer.ts new file mode 100644 index 00000000..ffff3a13 --- /dev/null +++ b/src/lib/url-composer.ts @@ -0,0 +1,34 @@ +import { UrlComposer } from "@crossbell/ui" + +import { getNoteSlug, getSiteLink } from "~/lib/helpers" +import { CSB_IO } from "~/lib/env" + +export const urlComposer: Partial = { + characterUrl: ({ handle }) => getSiteLink({ subdomain: handle }), + noteUrl: (note) => { + let originalNote = note + + while (originalNote?.toNote) { + originalNote = originalNote.toNote + } + + if (originalNote.metadata?.content?.sources?.includes("xlog")) { + const { character } = originalNote + + if (character) { + return ( + getSiteLink({ + subdomain: character.handle, + }) + + "/" + + getNoteSlug(originalNote) + + (originalNote !== note ? `#comments` : "") + ) + } else { + return "" + } + } else { + return `${CSB_IO}/notes/${note.characterId}-${note.noteId}` + } + }, +} diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index c22ff9b3..2f98d0c2 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -12,21 +12,17 @@ import { useConnectModal, useUpgradeAccountModal, } from "@crossbell/connect-kit" -import { UrlComposer } from "@crossbell/ui" - +import { NotificationModal } from "@crossbell/notification" import { InitContractProvider } from "@crossbell/contract" import { useRefCallback } from "@crossbell/util-hooks" import NextNProgress from "nextjs-progressbar" -import { CharacterEntity, Network } from "crossbell.js" +import { Network } from "crossbell.js" -import { IPFS_GATEWAY, CSB_IO } from "~/lib/env" +import { IPFS_GATEWAY } from "~/lib/env" import { toGateway } from "~/lib/ipfs-parser" import { connectors, provider } from "~/lib/wallet-config" import { createIDBPersister } from "~/lib/persister.client" - -import { NotificationModal } from "@crossbell/notification" -import { getSiteLink } from "~/lib/helpers" -import type { NoteEntity } from "crossbell.js" +import { urlComposer } from "~/lib/url-composer" Network.setIpfsGateway(IPFS_GATEWAY) @@ -58,41 +54,6 @@ try { console.warn(error) } -const urlComposer: Partial = { - characterUrl: ({ handle }) => getSiteLink({ subdomain: handle }), - noteUrl: (note) => { - let originalNote = note - while (originalNote?.toNote) { - originalNote = originalNote.toNote - } - - if (originalNote.metadata?.content?.sources?.includes("xlog")) { - const { character } = originalNote - - if (character) { - return ( - getSiteLink({ - subdomain: character.handle, - }) + - "/" + - ( - originalNote.metadata?.content?.attributes?.find( - (a: any) => a?.trait_type === "xlog_slug", - )?.value || - (originalNote as any).metadata?.content?._xlog_slug || - (originalNote as any).metadata?.content?._crosslog_slug - )?.toLowerCase?.() + - (originalNote !== note ? `#comments` : "") - ) - } else { - return "" - } - } else { - return `${CSB_IO}/notes/${note.characterId}-${note.noteId}` - } - }, -} - function MyApp({ Component, pageProps }: any) { const getLayout = Component.getLayout ?? ((page: any) => page) const connectModal = useConnectModal() diff --git a/src/pages/api/slug2id.ts b/src/pages/api/slug2id.ts index 439ec3fb..4c91a688 100644 --- a/src/pages/api/slug2id.ts +++ b/src/pages/api/slug2id.ts @@ -1,15 +1,7 @@ import { NextApiRequest, NextApiResponse } from "next" -import { cacheGet, cacheDelete } from "~/lib/redis.server" -const getSlug = (note: any) => { - return ( - note.metadata?.content?.attributes?.find( - (a: any) => a?.trait_type === "xlog_slug", - )?.value || - note.metadata?.content?._xlog_slug || - note.metadata?.content?._crosslog_slug - )?.toLowerCase?.() -} +import { cacheGet, cacheDelete } from "~/lib/redis.server" +import { getNoteSlug } from "~/lib/helpers" export async function getIdBySlug(slug: string, handle: string) { slug = (slug as string)?.toLowerCase?.() @@ -44,7 +36,7 @@ export async function getIdBySlug(slug: string, handle: string) { cursor = response.cursor note = response?.list?.find( (item: any) => - slug === getSlug(item) || slug === `${cid}-${item.noteId}`, + slug === getNoteSlug(item) || slug === `${cid}-${item.noteId}`, ) } while (!note && cursor) @@ -67,7 +59,7 @@ export async function getIdBySlug(slug: string, handle: string) { ) .then((res) => res.json()) .then((note) => { - if ((note && getSlug(note) !== slug) || note.deleted) { + if ((note && getNoteSlug(note) !== slug) || note.deleted) { cacheDelete(["slug2id", handle, slug]) } })