gatsby-theme-advanced
Version:
GatsbyJS theme equipped with advanced features.
97 lines (96 loc) • 4.63 kB
JavaScript
;
/* eslint "no-console": "off" */
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createFeed = exports.createPageMeta = exports.initFeedMeta = exports.getFeedRoute = exports.saveFeedPageMeta = void 0;
const path_1 = __importDefault(require("path"));
const fs_1 = __importDefault(require("fs"));
const config_1 = require("../../src/config");
const FEED_META_DIR = `public/${config_1.constants.feedMetaDirectory}`;
const POSTS_PER_PAGE = config_1.constants.postsPerFeedPage;
const FEED_COMPONENT = require.resolve("../../src/templates/feed/index.jsx");
// Save feed page metadata in the public folder for later retrieval by the client side code
const saveFeedPageMeta = (feedType, feedPageIndex, pageMeta, feedId) => __awaiter(void 0, void 0, void 0, function* () {
const filePath = path_1.default.join(FEED_META_DIR, `${feedType}${feedId ? `-${feedId}` : ""}-${feedPageIndex}.json`);
const stringifiedListing = JSON.stringify(pageMeta);
yield fs_1.default.promises.writeFile(filePath, stringifiedListing);
});
exports.saveFeedPageMeta = saveFeedPageMeta;
// Calculate feed path
const getFeedRoute = (config, feedType, feedId) => {
const slug = feedType === "index" ? "/" : `/${feedType}${feedId ? `/${feedId}` : ""}`;
// Add basePath
return (0, config_1.withBasePath)(config, slug);
};
exports.getFeedRoute = getFeedRoute;
// Cleans up and sets up the feed meta folder
const initFeedMeta = () => {
if (!fs_1.default.existsSync(FEED_META_DIR)) {
fs_1.default.mkdirSync(FEED_META_DIR);
}
else {
fs_1.default.rmSync(FEED_META_DIR, { recursive: true });
fs_1.default.mkdirSync(FEED_META_DIR);
}
};
exports.initFeedMeta = initFeedMeta;
// Calculate the metadata for a feed page
const createPageMeta = (pageIndex, pageCount, feedPosts) => {
const limit = POSTS_PER_PAGE;
const skip = pageIndex * POSTS_PER_PAGE;
const feedPagePosts = feedPosts.slice(skip, skip + limit);
// Compute and save a feed page metadata file
const nextPage = pageIndex + 1 < pageCount ? pageIndex + 1 : undefined;
const prevPage = pageIndex > 0 ? pageIndex - 1 : undefined;
// Calculate the amount of pages in the next batch
const postsLeft = feedPosts.length - skip - limit;
const nextCount = postsLeft > 0 ? Math.min(postsLeft, limit) : undefined;
const prevCount = typeof prevPage === "number" ? limit : undefined;
return {
current: pageIndex,
next: nextPage,
nextCount,
prev: prevPage,
prevCount,
posts: feedPagePosts,
};
};
exports.createPageMeta = createPageMeta;
// Creates a paginated feed with Gatsby pages and feed metadata
const createFeed = (config, actions, feedPosts, feedType, feedId) => __awaiter(void 0, void 0, void 0, function* () {
// Calculate the page count
const pageCount = Math.ceil(feedPosts.length / POSTS_PER_PAGE);
// For each page
const tasks = [...Array(pageCount).keys()].map((pageIndex) => __awaiter(void 0, void 0, void 0, function* () {
const pageMeta = (0, exports.createPageMeta)(pageIndex, pageCount, feedPosts);
yield (0, exports.saveFeedPageMeta)(feedType, pageIndex, pageMeta, feedId);
// Create an index page that resides on `${feedId}/`
if (pageIndex === 0) {
const route = (0, exports.getFeedRoute)(config, feedType, feedId);
actions.createPage({
path: route,
component: FEED_COMPONENT,
context: {
pageCount,
pageIndex,
feedType,
feedId,
feedPageMeta: pageMeta,
},
});
}
}));
yield Promise.all(tasks);
});
exports.createFeed = createFeed;