@@ -19,8 +19,9 @@ import Gateway404 from "../../components/gateway/Gateway404";
19import MetadataBlock from "../../components/gateway/MetadataBlock";
19import MetadataBlock from "../../components/gateway/MetadataBlock";
20import MetadataLink from "../../components/gateway/MetadataLink";
20import MetadataLink from "../../components/gateway/MetadataLink";
21import Description from "../../components/gateway/Description";
21import Description from "../../components/gateway/Description";
22+import { getGrantByShortcode } from "../../lib/lib";
23−const ApplicationPage = ({ data, markdown, organisation, search, params }) => {
24+const ApplicationPage = ({ data, markdown, organisation, matchedGrant, search, params }) => {
24 const { application } = params;
25 const { application } = params;
25 if (!ob.isValidPatp(application[0])) {
26 if (!ob.isValidPatp(application[0])) {
26 return <Gateway404 type="application" />;
27 return <Gateway404 type="application" />;
@@ -83,7 +84,7 @@ const ApplicationPage = ({ data, markdown, organisation, search, params }) => {
83 item="Application"
84 item="Application"
86− <div className="flex flex-wrap md:flex-nowrap justify-between">
87+ <div className="flex flex-wrap justify-between">
87 <MetadataBlock
88 <MetadataBlock
88 title="License"
89 title="License"
89 content={data.license ? data.license : "Unknown"}
90 content={data.license ? data.license : "Unknown"}
@@ -102,16 +103,20 @@ const ApplicationPage = ({ data, markdown, organisation, search, params }) => {
102 className="basis-1/2 sm:basis-1/4"
103 className="basis-1/2 sm:basis-1/4"
103 content={data.shortcode ? data.shortcode : data.title}
104 content={data.shortcode ? data.shortcode : data.title}
106+ {matchedGrant && <div className="basis-full flex flex-col space-y-1">
107+ <p className="font-semibold text-wall-400">Grant Proposal</p>
108+ <Link href={`/grants/${matchedGrant}`} passHref>
109+ <a className="text-green-400 font-medium">urbit.org/grants/{matchedGrant}
107 <Description
114 <Description
108 description={data.description}
115 description={data.description}
109 fallback="An application on Urbit."
116 fallback="An application on Urbit."
110 markdown={markdown}
117 markdown={markdown}
113− <hr className="text-white" />
115 <div class="bg-wall-100 py-4 px-6 border-2 border-wall-200 rounded-xl">
120 <div class="bg-wall-100 py-4 px-6 border-2 border-wall-200 rounded-xl">
116 <p class="text-sm text-wall-400">
121 <p class="text-sm text-wall-400">
117 <span class="font-bold">Disclaimer:</span> Applications may not be
122 <span class="font-bold">Disclaimer:</span> Applications may not be
@@ -175,6 +180,7 @@ export const getServerSideProps = async ({ params, res }) => {
175 ? JSON.stringify(Markdown.parse({ post: { content } }))
180 ? JSON.stringify(Markdown.parse({ post: { content } }))
183+ const matchedGrant = getGrantByShortcode(params.application);
178 if (!data.title) {
184 if (!data.title) {
180 title: params.application?.join("/"),
186 title: params.application?.join("/"),
@@ -187,6 +193,7 @@ export const getServerSideProps = async ({ params, res }) => {
188 markdown,
194 markdown,
189 organisation,
195 organisation,