diff options
Diffstat (limited to 'src/utils/helpers/format.ts')
| -rw-r--r-- | src/utils/helpers/format.ts | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/src/utils/helpers/format.ts b/src/utils/helpers/format.ts new file mode 100644 index 0000000..8c5e545 --- /dev/null +++ b/src/utils/helpers/format.ts @@ -0,0 +1,226 @@ +import { + Article, + ArticlePreview, + RawArticle, + RawArticlePreview, +} from '@ts/types/articles'; +import { Comment, RawComment } from '@ts/types/comments'; +import { Page, RawPage } from '@ts/types/pages'; +import { + RawSubject, + RawThematic, + Subject, + Thematic, +} from '@ts/types/taxonomies'; + +/** + * Format a post preview from RawArticlePreview to ArticlePreview type. + * @param rawPost - A post preview coming from WP GraphQL. + * @returns A formatted post preview. + */ +export const getFormattedPostPreview = (rawPost: RawArticlePreview) => { + const { + acfPosts, + commentCount, + contentParts, + date, + featuredImage, + id, + modified, + slug, + title, + } = rawPost; + + const dates = { + publication: date, + update: modified, + }; + + const thematics = acfPosts.postsInThematic ? acfPosts.postsInThematic : []; + + const formattedPost: ArticlePreview = { + commentCount, + dates, + featuredImage: featuredImage ? featuredImage.node : null, + id, + intro: contentParts.beforeMore, + slug, + thematics, + title, + }; + + return formattedPost; +}; + +/** + * Format an array of posts list from RawArticlePreview to ArticlePreview type. + * @param rawPosts - A posts list coming from WP GraphQL. + * @returns A formatted posts list. + */ +export const getFormattedPostsList = ( + rawPosts: RawArticlePreview[] +): ArticlePreview[] => { + const formattedPosts = rawPosts + .filter((post) => Object.getOwnPropertyNames(post).length > 0) + .map((post) => { + const formattedPost = getFormattedPostPreview(post); + + return formattedPost; + }); + + return formattedPosts; +}; + +/** + * Format a subject from RawSubject to Subject type. + * @param rawSubject - A subject coming from WP GraphQL. + * @returns A formatted subject. + */ +export const getFormattedSubject = (rawSubject: RawSubject): Subject => { + const { + acfSubjects, + contentParts, + databaseId, + date, + featuredImage, + id, + modified, + title, + } = rawSubject; + + const dates = { + publication: date, + update: modified, + }; + + const posts = getFormattedPostsList(acfSubjects.postsInSubject); + + const formattedSubject: Subject = { + content: contentParts.afterMore, + databaseId, + dates, + featuredImage: featuredImage ? featuredImage.node : null, + id, + intro: contentParts.beforeMore, + officialWebsite: acfSubjects.officialWebsite, + posts, + title, + }; + + return formattedSubject; +}; + +/** + * Format a thematic from RawThematic to Thematic type. + * @param rawThematic - A thematic coming from wP GraphQL. + * @returns A formatted thematic. + */ +export const getFormattedThematic = (rawThematic: RawThematic): Thematic => { + const { acfThematics, contentParts, databaseId, date, id, modified, title } = + rawThematic; + + const dates = { + publication: date, + update: modified, + }; + + const posts = getFormattedPostsList(acfThematics.postsInThematic); + + const formattedThematic: Thematic = { + content: contentParts.afterMore, + databaseId, + dates, + id, + intro: contentParts.beforeMore, + posts, + title, + }; + + return formattedThematic; +}; + +/** + * Format a comments list from RawComment to Comment type. + * @param rawComments - A comments list coming from WP GraphQL. + * @returns A formatted comments list. + */ +export const getFormattedComments = (rawComments: RawComment[]): Comment[] => { + const formattedComments: Comment[] = rawComments.map((comment) => { + const formattedComment: Comment = { + ...comment, + author: comment.author.node, + replies: [], + }; + + return formattedComment; + }); + + return formattedComments; +}; + +/** + * Format an article from RawArticle to Article type. + * @param rawPost - An article coming from WP GraphQL. + * @returns A formatted article. + */ +export const getFormattedPost = (rawPost: RawArticle): Article => { + const { + acfPosts, + author, + commentCount, + comments, + contentParts, + databaseId, + date, + id, + modified, + seo, + title, + } = rawPost; + + const dates = { + publication: date, + update: modified, + }; + + const formattedComments = getFormattedComments(comments.nodes); + + const formattedPost: Article = { + author: author.node, + commentCount, + comments: formattedComments, + content: contentParts.afterMore, + databaseId, + dates, + id, + intro: contentParts.beforeMore, + seo, + subjects: acfPosts.postsInSubject ? acfPosts.postsInSubject : [], + thematics: acfPosts.postsInThematic ? acfPosts.postsInThematic : [], + title, + }; + + return formattedPost; +}; + +/** + * Format a page from RawPage to Page type. + * @param page - A page coming from WP GraphQL. + * @returns A formatted page. + */ +export const getFormattedPage = (rawPage: RawPage): Page => { + const { date, modified } = rawPage; + const dates = { + publication: date, + update: modified, + }; + + const formattedPage: Page = { + ...rawPage, + content: rawPage.contentParts.afterMore, + dates, + intro: rawPage.contentParts.beforeMore, + }; + + return formattedPage; +}; |
