Skip to content

Commit d124e61

Browse files
authored
Merge pull request #1261 from mbifulco/feat/standard-site-followup
feat: add atproto metadata to individual pages
2 parents 7435340 + 3131aa1 commit d124e61

6 files changed

Lines changed: 60 additions & 9 deletions

File tree

next-env.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/// <reference types="next" />
22
/// <reference types="next/image-types/global" />
33
/// <reference types="next/navigation-types/compat/navigation" />
4-
import './.next/dev/types/routes.d.ts';
4+
import "./.next/types/routes.d.ts";
55

66
// NOTE: This file should not be edited
77
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.

src/components/seo.test.tsx

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,44 @@ describe('SEO', () => {
5757
expect(link).toBeNull();
5858
});
5959
});
60+
61+
describe('standard.site publication link', () => {
62+
it('renders site.standard.publication link tag when URI is provided', () => {
63+
const uri =
64+
'at://did:plc:icpcpp5txyow3prnfgi533lj/site.standard.publication/3mmx3e2b57l2m';
65+
const { container } = render(
66+
<SEO title="Test Post" standardSitePublicationUri={uri} />
67+
);
68+
69+
const link = container.querySelector(
70+
'link[rel="site.standard.publication"]'
71+
);
72+
const docLink = document.querySelector(
73+
'link[rel="site.standard.publication"]'
74+
);
75+
const found = link ?? docLink;
76+
expect(found).not.toBeNull();
77+
expect(found).toHaveAttribute('href', uri);
78+
});
79+
80+
it('does not render site.standard.publication link when URI is not provided', () => {
81+
const { container } = render(<SEO title="Test Post" />);
82+
83+
const link =
84+
container.querySelector('link[rel="site.standard.publication"]') ??
85+
document.querySelector('link[rel="site.standard.publication"]');
86+
expect(link).toBeNull();
87+
});
88+
89+
it('does not render site.standard.publication link when URI is undefined', () => {
90+
const { container } = render(
91+
<SEO title="Test Post" standardSitePublicationUri={undefined} />
92+
);
93+
94+
const link =
95+
container.querySelector('link[rel="site.standard.publication"]') ??
96+
document.querySelector('link[rel="site.standard.publication"]');
97+
expect(link).toBeNull();
98+
});
99+
});
60100
});

src/components/seo.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ type SEOProps = {
3232
tags?: string[];
3333
pagination?: SEOPagination;
3434
standardSiteDocumentUri?: string;
35+
standardSitePublicationUri?: string;
3536
};
3637

3738
const SEO: React.FC<SEOProps> = ({
@@ -47,6 +48,7 @@ const SEO: React.FC<SEOProps> = ({
4748
tags,
4849
pagination,
4950
standardSiteDocumentUri,
51+
standardSitePublicationUri,
5052
}) => {
5153
const router = useRouter();
5254

@@ -85,7 +87,10 @@ const SEO: React.FC<SEOProps> = ({
8587
rel="pingback"
8688
href="https://webmention.io/mikebifulco.com/xmlrpc"
8789
/>
88-
{/* standard.site AT Protocol document link */}
90+
{/* standard.site AT Protocol links */}
91+
{standardSitePublicationUri && (
92+
<link rel="site.standard.publication" href={standardSitePublicationUri} />
93+
)}
8994
{standardSiteDocumentUri && (
9095
<link rel="site.standard.document" href={standardSiteDocumentUri} />
9196
)}

src/data/newsletters/product-is-a-signal.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ slug: product-is-a-signal
99

1010
My first product launch was a disaster. I had spent the better part of a year building smpl with my two cofounders; our MVP worked great, we were using it to manage our own business, and on launch day... crickets.
1111

12-
Thousands of lines of code, months of effort, and a beautiful marketing site. We had decided to keep smpl a secret \_until it [was] ✌🏾ready✌🏾.
12+
Thousands of lines of code, months of effort, and a beautiful marketing site. We had decided to keep smpl a secret _until it [was] ✌🏾ready✌🏾.
1313

1414
**Our critical launch mistake: nobody knew the damn product existed!**
1515

src/pages/newsletter/[slug].tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ export const getStaticProps: GetStaticProps<
4949
params.slug
5050
);
5151

52+
const standardSitePublicationUri = (atprotoData as { publicationUri: string }).publicationUri;
53+
5254
return {
5355
props: {
5456
newsletter: {
@@ -58,6 +60,7 @@ export const getStaticProps: GetStaticProps<
5860
series: series ?? null,
5961
relatedContent,
6062
...(standardSiteDocumentUri ? { standardSiteDocumentUri } : {}),
63+
...(standardSitePublicationUri ? { standardSitePublicationUri } : {}),
6164
},
6265
};
6366
};
@@ -80,13 +83,15 @@ type NewsletterPageProps = {
8083
series?: Series | null;
8184
relatedContent: RelatedContent[];
8285
standardSiteDocumentUri?: string;
86+
standardSitePublicationUri?: string;
8387
};
8488

8589
const NewsletterPage: React.FC<NewsletterPageProps> = ({
8690
newsletter,
8791
series,
8892
relatedContent,
8993
standardSiteDocumentUri,
94+
standardSitePublicationUri,
9095
}) => {
9196
const { frontmatter } = newsletter;
9297

@@ -111,6 +116,7 @@ const NewsletterPage: React.FC<NewsletterPageProps> = ({
111116
publishedAt={date}
112117
tags={tags}
113118
standardSiteDocumentUri={standardSiteDocumentUri}
119+
standardSitePublicationUri={standardSitePublicationUri}
114120
/>
115121
<StructuredData structuredData={structuredData} />
116122

src/pages/posts/[slug].tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ type PostPageProps = {
2828
series?: Series | null;
2929
relatedContent: RelatedContent[];
3030
standardSiteDocumentUri?: string;
31+
standardSitePublicationUri?: string;
3132
};
3233

3334
export const getStaticProps: GetStaticProps<
@@ -53,12 +54,15 @@ export const getStaticProps: GetStaticProps<
5354
params.slug
5455
);
5556

57+
const standardSitePublicationUri = (atprotoData as { publicationUri: string }).publicationUri;
58+
5659
return {
5760
props: {
5861
post,
5962
series: series ?? null,
6063
relatedContent,
6164
...(standardSiteDocumentUri ? { standardSiteDocumentUri } : {}),
65+
...(standardSitePublicationUri ? { standardSitePublicationUri } : {}),
6266
},
6367
};
6468
};
@@ -76,12 +80,7 @@ export async function getStaticPaths() {
7680
};
7781
}
7882

79-
const PostPage: NextPage<PostPageProps> = ({
80-
post,
81-
series,
82-
relatedContent,
83-
standardSiteDocumentUri,
84-
}) => {
83+
const PostPage: NextPage<PostPageProps> = ({ post, series, relatedContent, standardSiteDocumentUri, standardSitePublicationUri }) => {
8584
const { frontmatter } = post;
8685

8786
const { coverImagePublicId, published, date, tags, title, excerpt, slug } =
@@ -121,6 +120,7 @@ const PostPage: NextPage<PostPageProps> = ({
121120
publishedAt={date}
122121
tags={tags}
123122
standardSiteDocumentUri={standardSiteDocumentUri}
123+
standardSitePublicationUri={standardSitePublicationUri}
124124
/>
125125
{published === false && process.env.NODE_ENV !== 'production' && (
126126
<div>

0 commit comments

Comments
 (0)