@etsoo/website
Version:
ETSOO CMS Based NextJs Website Framework
111 lines (110 loc) • 4.13 kB
JavaScript
import { TabLayout } from '../dto/site/TabLayout';
import { StaticPage } from './StaticPage';
/**
* Create tab page getStaticProps
* 创建栏目的 getStaticProps
* @param site Static site
* @param tabFilter Tab filter
* @param maxArticles Max artciles to read
* @param revalidate Revalidate setting
* @returns Result
*/
export function StaticTabPage(site, tabFilter, maxArticles, revalidate) {
return StaticPage(site, async (siteData, context) => {
var _a, _b, _c;
// Current tab
let tab;
let articleUrl;
if (tabFilter === true) {
const { params = {} } = context;
// Named as the file name [...param]
const { param } = params;
if (Array.isArray(param)) {
// First path is 'home' reserved for the home tab
if (param[0] === 'home') {
tab = siteData.tabs.find((tab) => tab.url === '/');
}
else {
const targetUrl = '/' + param.join('/').toLowerCase();
tab = siteData.tabs.find((tab) => tab.url.toLowerCase() === targetUrl);
if (tab == null) {
// Local copy
const locals = [...param];
// Is article?
articleUrl = locals.pop();
const tabUrl = '/' + locals.join('/').toLowerCase();
tab = siteData.tabs.find((tab) => tab.url.toLowerCase() === tabUrl);
}
}
}
if (tab == null) {
// Not found
console.log(`No Tab Matched with ISR ${param}`);
return {
notFound: true
};
}
}
else if (typeof tabFilter === 'string') {
tabFilter = tabFilter.toLowerCase();
tab = siteData.tabs.find((tab) => tab.name.toLowerCase() === tabFilter ||
tab.url.toLowerCase() === `/${tabFilter}`);
if (tab == null) {
// Not found
console.log(`No Tab Matched with ${tabFilter}`);
return {
notFound: true
};
}
}
else {
const callback = tabFilter;
tab = siteData.tabs.find((tab) => callback(tab, context));
// Not found
console.log(`No Tab Matched with Filter`);
return {
notFound: true
};
}
let parent = tab.parent;
if (parent && tab.ancestorTabs == null) {
// Avoid duplicate calculation
tab.ancestorTabs = [];
do {
const ancestor = siteData.tabs.find((tab) => tab.id === parent);
if (ancestor) {
tab.ancestorTabs.push(ancestor);
parent = ancestor.parent;
}
else {
break;
}
} while (parent);
}
const article = tab.layout === TabLayout.Article
? (_a = (await site.getArticle({
tab: tab.id,
withContent: true
}))) !== null && _a !== void 0 ? _a : null
: articleUrl
? (_b = (await site.getArticle({
tab: tab.id,
url: articleUrl,
withContent: true
}))) !== null && _b !== void 0 ? _b : null
: null;
const articles = tab.layout === TabLayout.Article || tab.layout === TabLayout.None
? []
: (_c = (await site.getArticles({
tab: tab.id,
withContent: tab.layout === TabLayout.ContentList,
batchSize: typeof maxArticles === 'function'
? maxArticles(tab)
: maxArticles
}))) !== null && _c !== void 0 ? _c : [];
return {
props: { siteData, article, articles, tab },
revalidate
};
});
}