mirror of
https://github.com/sergeyyarkov/yarkov.tech.git
synced 2026-10-11 02:19:08 +03:00
types fix + limit recent articles
This commit is contained in:
parent
0e951d2aca
commit
d8d812a282
@ -12,7 +12,7 @@
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "astro dev",
|
||||
"build": "astro build",
|
||||
"build": "astro check && astro build",
|
||||
"start": "node --env-file=.env ./dist/server/entry.mjs",
|
||||
"preview": "astro preview",
|
||||
"astro": "astro",
|
||||
|
||||
@ -7,7 +7,7 @@ const tocTitle = t("article.tableOfContents");
|
||||
|
||||
<div itemprop='articleBody' class='article-content'><slot /></div>
|
||||
|
||||
<script define:vars={{ tocTitle }}>
|
||||
<script is:inline define:vars={{ tocTitle }}>
|
||||
var $toc = document.querySelector(".toc");
|
||||
if ($toc) {
|
||||
$toc.querySelector("summary").textContent = tocTitle;
|
||||
|
||||
@ -6,7 +6,8 @@ import { getArticleList } from "@root/queries/article";
|
||||
|
||||
const t = useTranslation(Astro);
|
||||
const pageLang = getLanguageFromURL(Astro.url.pathname);
|
||||
const articles = (await getArticleList()).flatMap((a) => filterArticlesByPageLang(a.translations, pageLang));
|
||||
const data = await getArticleList();
|
||||
const articles = filterArticlesByPageLang(data, pageLang);
|
||||
const articleBlocks = formatToArticleBlocks(articles);
|
||||
---
|
||||
|
||||
|
||||
@ -5,16 +5,12 @@ import ArticleItem from "@components/ArticleItem";
|
||||
import EmptyList from "@components/EmptyList.astro";
|
||||
import UIString from "@components/UIString.astro";
|
||||
import TranslatedLink from "@components/TranslatedLink.astro";
|
||||
import { getRecentArticleList } from "../queries";
|
||||
import { getRecentArticleList, getSiteSettings } from "../queries";
|
||||
|
||||
export interface Props {
|
||||
limit?: number;
|
||||
}
|
||||
|
||||
const { limit = 1 } = Astro.props;
|
||||
const pageLang = getLanguageFromURL(Astro.url.pathname);
|
||||
const data = await getRecentArticleList();
|
||||
const articles = data.flatMap((a) => utils.filterArticlesByPageLang(a.translations, pageLang));
|
||||
const siteSettings = await getSiteSettings();
|
||||
const data = await getRecentArticleList(siteSettings?.recent_articles_limit || 5);
|
||||
const articles = utils.filterArticlesByPageLang(data, pageLang);
|
||||
const isEmpty = articles.length === 0;
|
||||
---
|
||||
|
||||
@ -30,21 +26,15 @@ const isEmpty = articles.length === 0;
|
||||
<div itemscope itemtype='http://schema.org/Blog'>
|
||||
{
|
||||
!isEmpty ? (
|
||||
articles
|
||||
.slice(0, limit)
|
||||
.reverse()
|
||||
.map(
|
||||
(a) =>
|
||||
a && (
|
||||
<ArticleItem
|
||||
slug={a.slug}
|
||||
title={a.title}
|
||||
languages_code={a.languages_code}
|
||||
pub_date={a.pub_date}
|
||||
pageLang={pageLang}
|
||||
/>
|
||||
)
|
||||
)
|
||||
articles.map((a) => (
|
||||
<ArticleItem
|
||||
slug={a.slug}
|
||||
title={a.title}
|
||||
languages_code={a.languages_code}
|
||||
pub_date={a.pub_date}
|
||||
pageLang={pageLang}
|
||||
/>
|
||||
))
|
||||
) : (
|
||||
<EmptyList />
|
||||
)
|
||||
|
||||
@ -1,60 +0,0 @@
|
||||
---
|
||||
import { buildToc } from "@root/utils";
|
||||
import type { MarkdownHeading } from "astro";
|
||||
import TableOfContentsHeading from "./TableOfContentsHeading.astro";
|
||||
import { useTranslation } from "@root/i18n/utils";
|
||||
|
||||
export interface Props {
|
||||
headings: MarkdownHeading[];
|
||||
}
|
||||
|
||||
const toc = buildToc(Astro.props.headings, 3);
|
||||
const t = useTranslation(Astro);
|
||||
---
|
||||
|
||||
<details class='toc'>
|
||||
<summary>{t("article.tableOfContents")}</summary>
|
||||
<nav>
|
||||
<div>
|
||||
<ul>
|
||||
{toc.map((heading) => <TableOfContentsHeading heading={heading} />)}
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
</details>
|
||||
|
||||
<script>
|
||||
var $toc = document.querySelector(".toc");
|
||||
if ($toc) {
|
||||
$toc.addEventListener("click", (e) => (e.target as HTMLElement).tagName === "A" && $toc!.removeAttribute("open"));
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang='scss' is:global>
|
||||
.toc {
|
||||
cursor: pointer;
|
||||
display: block;
|
||||
position: absolute;
|
||||
& summary {
|
||||
font-size: var(--font-size-lg);
|
||||
}
|
||||
& nav {
|
||||
background-color: var(--background-card);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: var(--border-radius-lg);
|
||||
margin-top: 10px;
|
||||
padding: 10px 16px;
|
||||
& ul {
|
||||
& a {
|
||||
display: block;
|
||||
margin-bottom: 10px;
|
||||
color: var(--font-color);
|
||||
text-decoration: none;
|
||||
}
|
||||
& li ul {
|
||||
margin-left: 15px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@ -1,16 +0,0 @@
|
||||
---
|
||||
import type { MarkdownHeadingToc } from "@root/utils";
|
||||
|
||||
export interface Props {
|
||||
heading: MarkdownHeadingToc;
|
||||
}
|
||||
|
||||
const { heading } = Astro.props;
|
||||
---
|
||||
|
||||
<li>
|
||||
<a href={`#${heading.slug}`}>{heading.text}</a>
|
||||
<ul>
|
||||
{heading.subheadings?.map((subheading) => <Astro.self heading={subheading} />)}
|
||||
</ul>
|
||||
</li>
|
||||
@ -17,8 +17,8 @@ import * as types from './graphql';
|
||||
type Documents = {
|
||||
"\n\t\tquery LatestAppealByClientIpQuery($client_ip: String!, $limit: Int!) {\n\t\t\tappeal(filter: { client_ip: { _eq: $client_ip } }, sort: [\"-date_created\"], limit: $limit) {\n\t\t\t\tclient_ip\n\t\t\t\tdate_created\n\t\t\t}\n\t\t}\n\t": typeof types.LatestAppealByClientIpQueryDocument,
|
||||
"\n\t\tmutation CreateAppealQuery(\n\t\t\t$name: String!\n\t\t\t$email: String!\n\t\t\t$subject: String!\n\t\t\t$message: String!\n\t\t\t$client_ip: String!\n\t\t) {\n\t\t\tcreate_appeal_item(\n\t\t\t\tdata: { name: $name, email: $email, subject: $subject, message: $message, client_ip: $client_ip }\n\t\t\t) {\n\t\t\t\tid\n\t\t\t}\n\t\t}\n\t": typeof types.CreateAppealQueryDocument,
|
||||
"\n\t\tquery Article {\n\t\t\tarticle {\n\t\t\t\ttranslations(filter: { status: { _eq: \"published\" } }) {\n\t\t\t\t\tid\n\t\t\t\t\ttitle\n\t\t\t\t\ttags {\n\t\t\t\t\t\ttag_id {\n\t\t\t\t\t\t\ttitle\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdescription\n\t\t\t\t\tslug\n\t\t\t\t\tpub_date\n\t\t\t\t\tlanguages_code {\n\t\t\t\t\t\tcode\n\t\t\t\t\t\tname\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t": typeof types.ArticleDocument,
|
||||
"\n\t\tquery RecentArticle {\n\t\t\tarticle {\n\t\t\t\ttranslations(filter: { status: { _eq: \"published\" } }, sort: [\"-pub_date\"]) {\n\t\t\t\t\ttitle\n\t\t\t\t\tcover_image {\n\t\t\t\t\t\tid\n\t\t\t\t\t\ttitle\n\t\t\t\t\t}\n\t\t\t\t\tslug\n\t\t\t\t\tpub_date\n\t\t\t\t\tviews\n\t\t\t\t\tlanguages_code {\n\t\t\t\t\t\tcode\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t": typeof types.RecentArticleDocument,
|
||||
"\n\t\tquery Article {\n\t\t\tarticle_translations(filter: { status: { _eq: \"published\" } }) {\n\t\t\t\tid\n\t\t\t\ttitle\n\t\t\t\ttags {\n\t\t\t\t\ttag_id {\n\t\t\t\t\t\ttitle\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdescription\n\t\t\t\tslug\n\t\t\t\tpub_date\n\t\t\t\tlanguages_code {\n\t\t\t\t\tcode\n\t\t\t\t\tname\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t": typeof types.ArticleDocument,
|
||||
"\n\t\tquery RecentArticle($limit: Int!) {\n\t\t\tarticle_translations(filter: { status: { _eq: \"published\" } }, sort: [\"-pub_date\"], limit: $limit) {\n\t\t\t\ttitle\n\t\t\t\tslug\n\t\t\t\tpub_date\n\t\t\t\tlanguages_code {\n\t\t\t\t\tcode\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t": typeof types.RecentArticleDocument,
|
||||
"\n\t\tquery Article_translations($slug: String!) {\n\t\t\tarticle_translations(filter: { slug: { _eq: $slug } }) {\n\t\t\t\tid\n\t\t\t\ttitle\n\t\t\t\ttags {\n\t\t\t\t\ttag_id {\n\t\t\t\t\t\ttitle\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdescription\n\t\t\t\tslug\n\t\t\t\tcontent\n\t\t\t\tauthor {\n\t\t\t\t\tfirst_name\n\t\t\t\t\tlast_name\n\t\t\t\t}\n\t\t\t\tpub_date\n\t\t\t\tviews\n\t\t\t\tlanguages_code {\n\t\t\t\t\tcode\n\t\t\t\t\tname\n\t\t\t\t}\n\t\t\t\tcover_image {\n\t\t\t\t\ttitle\n\t\t\t\t\ttype\n\t\t\t\t\tfilename_disk\n\t\t\t\t}\n\t\t\t\tarticle_id {\n\t\t\t\t\ttranslations {\n\t\t\t\t\t\tslug\n\t\t\t\t\t\tlanguages_code {\n\t\t\t\t\t\t\tcode\n\t\t\t\t\t\t\tname\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpub_date\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t": typeof types.Article_TranslationsDocument,
|
||||
"\n\t\tmutation Update_article_translations_item($id: ID!, $views: Int!) {\n\t\t\tupdate_article_translations_item(id: $id, data: { views: $views }) {\n\t\t\t\tviews\n\t\t\t}\n\t\t}\n\t": typeof types.Update_Article_Translations_ItemDocument,
|
||||
"\n\t\tquery AboutMeQuery($pageLang: String!) {\n\t\t\tglobal_translations(filter: { languages_code: { code: { _contains: $pageLang } } }) {\n\t\t\t\tabout\n\t\t\t}\n\t\t}\n\t": typeof types.AboutMeQueryDocument,
|
||||
@ -30,8 +30,8 @@ type Documents = {
|
||||
const documents: Documents = {
|
||||
"\n\t\tquery LatestAppealByClientIpQuery($client_ip: String!, $limit: Int!) {\n\t\t\tappeal(filter: { client_ip: { _eq: $client_ip } }, sort: [\"-date_created\"], limit: $limit) {\n\t\t\t\tclient_ip\n\t\t\t\tdate_created\n\t\t\t}\n\t\t}\n\t": types.LatestAppealByClientIpQueryDocument,
|
||||
"\n\t\tmutation CreateAppealQuery(\n\t\t\t$name: String!\n\t\t\t$email: String!\n\t\t\t$subject: String!\n\t\t\t$message: String!\n\t\t\t$client_ip: String!\n\t\t) {\n\t\t\tcreate_appeal_item(\n\t\t\t\tdata: { name: $name, email: $email, subject: $subject, message: $message, client_ip: $client_ip }\n\t\t\t) {\n\t\t\t\tid\n\t\t\t}\n\t\t}\n\t": types.CreateAppealQueryDocument,
|
||||
"\n\t\tquery Article {\n\t\t\tarticle {\n\t\t\t\ttranslations(filter: { status: { _eq: \"published\" } }) {\n\t\t\t\t\tid\n\t\t\t\t\ttitle\n\t\t\t\t\ttags {\n\t\t\t\t\t\ttag_id {\n\t\t\t\t\t\t\ttitle\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdescription\n\t\t\t\t\tslug\n\t\t\t\t\tpub_date\n\t\t\t\t\tlanguages_code {\n\t\t\t\t\t\tcode\n\t\t\t\t\t\tname\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t": types.ArticleDocument,
|
||||
"\n\t\tquery RecentArticle {\n\t\t\tarticle {\n\t\t\t\ttranslations(filter: { status: { _eq: \"published\" } }, sort: [\"-pub_date\"]) {\n\t\t\t\t\ttitle\n\t\t\t\t\tcover_image {\n\t\t\t\t\t\tid\n\t\t\t\t\t\ttitle\n\t\t\t\t\t}\n\t\t\t\t\tslug\n\t\t\t\t\tpub_date\n\t\t\t\t\tviews\n\t\t\t\t\tlanguages_code {\n\t\t\t\t\t\tcode\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t": types.RecentArticleDocument,
|
||||
"\n\t\tquery Article {\n\t\t\tarticle_translations(filter: { status: { _eq: \"published\" } }) {\n\t\t\t\tid\n\t\t\t\ttitle\n\t\t\t\ttags {\n\t\t\t\t\ttag_id {\n\t\t\t\t\t\ttitle\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdescription\n\t\t\t\tslug\n\t\t\t\tpub_date\n\t\t\t\tlanguages_code {\n\t\t\t\t\tcode\n\t\t\t\t\tname\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t": types.ArticleDocument,
|
||||
"\n\t\tquery RecentArticle($limit: Int!) {\n\t\t\tarticle_translations(filter: { status: { _eq: \"published\" } }, sort: [\"-pub_date\"], limit: $limit) {\n\t\t\t\ttitle\n\t\t\t\tslug\n\t\t\t\tpub_date\n\t\t\t\tlanguages_code {\n\t\t\t\t\tcode\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t": types.RecentArticleDocument,
|
||||
"\n\t\tquery Article_translations($slug: String!) {\n\t\t\tarticle_translations(filter: { slug: { _eq: $slug } }) {\n\t\t\t\tid\n\t\t\t\ttitle\n\t\t\t\ttags {\n\t\t\t\t\ttag_id {\n\t\t\t\t\t\ttitle\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdescription\n\t\t\t\tslug\n\t\t\t\tcontent\n\t\t\t\tauthor {\n\t\t\t\t\tfirst_name\n\t\t\t\t\tlast_name\n\t\t\t\t}\n\t\t\t\tpub_date\n\t\t\t\tviews\n\t\t\t\tlanguages_code {\n\t\t\t\t\tcode\n\t\t\t\t\tname\n\t\t\t\t}\n\t\t\t\tcover_image {\n\t\t\t\t\ttitle\n\t\t\t\t\ttype\n\t\t\t\t\tfilename_disk\n\t\t\t\t}\n\t\t\t\tarticle_id {\n\t\t\t\t\ttranslations {\n\t\t\t\t\t\tslug\n\t\t\t\t\t\tlanguages_code {\n\t\t\t\t\t\t\tcode\n\t\t\t\t\t\t\tname\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpub_date\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t": types.Article_TranslationsDocument,
|
||||
"\n\t\tmutation Update_article_translations_item($id: ID!, $views: Int!) {\n\t\t\tupdate_article_translations_item(id: $id, data: { views: $views }) {\n\t\t\t\tviews\n\t\t\t}\n\t\t}\n\t": types.Update_Article_Translations_ItemDocument,
|
||||
"\n\t\tquery AboutMeQuery($pageLang: String!) {\n\t\t\tglobal_translations(filter: { languages_code: { code: { _contains: $pageLang } } }) {\n\t\t\t\tabout\n\t\t\t}\n\t\t}\n\t": types.AboutMeQueryDocument,
|
||||
@ -52,11 +52,11 @@ export function graphql(source: "\n\t\tmutation CreateAppealQuery(\n\t\t\t$name:
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
export function graphql(source: "\n\t\tquery Article {\n\t\t\tarticle {\n\t\t\t\ttranslations(filter: { status: { _eq: \"published\" } }) {\n\t\t\t\t\tid\n\t\t\t\t\ttitle\n\t\t\t\t\ttags {\n\t\t\t\t\t\ttag_id {\n\t\t\t\t\t\t\ttitle\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdescription\n\t\t\t\t\tslug\n\t\t\t\t\tpub_date\n\t\t\t\t\tlanguages_code {\n\t\t\t\t\t\tcode\n\t\t\t\t\t\tname\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t"): typeof import('./graphql').ArticleDocument;
|
||||
export function graphql(source: "\n\t\tquery Article {\n\t\t\tarticle_translations(filter: { status: { _eq: \"published\" } }) {\n\t\t\t\tid\n\t\t\t\ttitle\n\t\t\t\ttags {\n\t\t\t\t\ttag_id {\n\t\t\t\t\t\ttitle\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdescription\n\t\t\t\tslug\n\t\t\t\tpub_date\n\t\t\t\tlanguages_code {\n\t\t\t\t\tcode\n\t\t\t\t\tname\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t"): typeof import('./graphql').ArticleDocument;
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
export function graphql(source: "\n\t\tquery RecentArticle {\n\t\t\tarticle {\n\t\t\t\ttranslations(filter: { status: { _eq: \"published\" } }, sort: [\"-pub_date\"]) {\n\t\t\t\t\ttitle\n\t\t\t\t\tcover_image {\n\t\t\t\t\t\tid\n\t\t\t\t\t\ttitle\n\t\t\t\t\t}\n\t\t\t\t\tslug\n\t\t\t\t\tpub_date\n\t\t\t\t\tviews\n\t\t\t\t\tlanguages_code {\n\t\t\t\t\t\tcode\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t"): typeof import('./graphql').RecentArticleDocument;
|
||||
export function graphql(source: "\n\t\tquery RecentArticle($limit: Int!) {\n\t\t\tarticle_translations(filter: { status: { _eq: \"published\" } }, sort: [\"-pub_date\"], limit: $limit) {\n\t\t\t\ttitle\n\t\t\t\tslug\n\t\t\t\tpub_date\n\t\t\t\tlanguages_code {\n\t\t\t\t\tcode\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t"): typeof import('./graphql').RecentArticleDocument;
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
|
||||
@ -4544,12 +4544,14 @@ export type CreateAppealQueryMutation = { __typename?: 'Mutation', create_appeal
|
||||
export type ArticleQueryVariables = Exact<{ [key: string]: never; }>;
|
||||
|
||||
|
||||
export type ArticleQuery = { __typename?: 'Query', article: Array<{ __typename?: 'article', translations?: Array<{ __typename?: 'article_translations', id: string, title: string, description: string, slug: string, pub_date: any, tags?: Array<{ __typename?: 'article_translations_tag', tag_id?: { __typename?: 'tag', title: string } | null } | null> | null, languages_code?: { __typename?: 'languages', code: string, name?: string | null } | null } | null> | null }> };
|
||||
export type ArticleQuery = { __typename?: 'Query', article_translations: Array<{ __typename?: 'article_translations', id: string, title: string, description: string, slug: string, pub_date: any, tags?: Array<{ __typename?: 'article_translations_tag', tag_id?: { __typename?: 'tag', title: string } | null } | null> | null, languages_code?: { __typename?: 'languages', code: string, name?: string | null } | null }> };
|
||||
|
||||
export type RecentArticleQueryVariables = Exact<{ [key: string]: never; }>;
|
||||
export type RecentArticleQueryVariables = Exact<{
|
||||
limit: Scalars['Int']['input'];
|
||||
}>;
|
||||
|
||||
|
||||
export type RecentArticleQuery = { __typename?: 'Query', article: Array<{ __typename?: 'article', translations?: Array<{ __typename?: 'article_translations', title: string, slug: string, pub_date: any, views: number, cover_image?: { __typename?: 'directus_files', id: string, title?: string | null } | null, languages_code?: { __typename?: 'languages', code: string } | null } | null> | null }> };
|
||||
export type RecentArticleQuery = { __typename?: 'Query', article_translations: Array<{ __typename?: 'article_translations', title: string, slug: string, pub_date: any, languages_code?: { __typename?: 'languages', code: string } | null }> };
|
||||
|
||||
export type Article_TranslationsQueryVariables = Exact<{
|
||||
slug: Scalars['String']['input'];
|
||||
@ -4637,41 +4639,36 @@ export const CreateAppealQueryDocument = new TypedDocumentString(`
|
||||
`) as unknown as TypedDocumentString<CreateAppealQueryMutation, CreateAppealQueryMutationVariables>;
|
||||
export const ArticleDocument = new TypedDocumentString(`
|
||||
query Article {
|
||||
article {
|
||||
translations(filter: {status: {_eq: "published"}}) {
|
||||
id
|
||||
title
|
||||
tags {
|
||||
tag_id {
|
||||
title
|
||||
}
|
||||
}
|
||||
description
|
||||
slug
|
||||
pub_date
|
||||
languages_code {
|
||||
code
|
||||
name
|
||||
article_translations(filter: {status: {_eq: "published"}}) {
|
||||
id
|
||||
title
|
||||
tags {
|
||||
tag_id {
|
||||
title
|
||||
}
|
||||
}
|
||||
description
|
||||
slug
|
||||
pub_date
|
||||
languages_code {
|
||||
code
|
||||
name
|
||||
}
|
||||
}
|
||||
}
|
||||
`) as unknown as TypedDocumentString<ArticleQuery, ArticleQueryVariables>;
|
||||
export const RecentArticleDocument = new TypedDocumentString(`
|
||||
query RecentArticle {
|
||||
article {
|
||||
translations(filter: {status: {_eq: "published"}}, sort: ["-pub_date"]) {
|
||||
title
|
||||
cover_image {
|
||||
id
|
||||
title
|
||||
}
|
||||
slug
|
||||
pub_date
|
||||
views
|
||||
languages_code {
|
||||
code
|
||||
}
|
||||
query RecentArticle($limit: Int!) {
|
||||
article_translations(
|
||||
filter: {status: {_eq: "published"}}
|
||||
sort: ["-pub_date"]
|
||||
limit: $limit
|
||||
) {
|
||||
title
|
||||
slug
|
||||
pub_date
|
||||
languages_code {
|
||||
code
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,23 +5,21 @@ import { Article_Translations } from "../graphql/graphql";
|
||||
export async function getArticleList() {
|
||||
const ArticleQuery = graphql(`
|
||||
query Article {
|
||||
article {
|
||||
translations(filter: { status: { _eq: "published" } }) {
|
||||
id
|
||||
title
|
||||
tags {
|
||||
tag_id {
|
||||
title
|
||||
}
|
||||
}
|
||||
description
|
||||
slug
|
||||
pub_date
|
||||
languages_code {
|
||||
code
|
||||
name
|
||||
article_translations(filter: { status: { _eq: "published" } }) {
|
||||
id
|
||||
title
|
||||
tags {
|
||||
tag_id {
|
||||
title
|
||||
}
|
||||
}
|
||||
description
|
||||
slug
|
||||
pub_date
|
||||
languages_code {
|
||||
code
|
||||
name
|
||||
}
|
||||
}
|
||||
}
|
||||
`);
|
||||
@ -30,35 +28,28 @@ export async function getArticleList() {
|
||||
|
||||
if (!result.data) return [];
|
||||
|
||||
return result.data.article;
|
||||
return result.data.article_translations;
|
||||
}
|
||||
|
||||
export async function getRecentArticleList() {
|
||||
export async function getRecentArticleList(limit: number = 5) {
|
||||
const RecentArticleQuery = graphql(`
|
||||
query RecentArticle {
|
||||
article {
|
||||
translations(filter: { status: { _eq: "published" } }, sort: ["-pub_date"]) {
|
||||
title
|
||||
cover_image {
|
||||
id
|
||||
title
|
||||
}
|
||||
slug
|
||||
pub_date
|
||||
views
|
||||
languages_code {
|
||||
code
|
||||
}
|
||||
query RecentArticle($limit: Int!) {
|
||||
article_translations(filter: { status: { _eq: "published" } }, sort: ["-pub_date"], limit: $limit) {
|
||||
title
|
||||
slug
|
||||
pub_date
|
||||
languages_code {
|
||||
code
|
||||
}
|
||||
}
|
||||
}
|
||||
`);
|
||||
|
||||
const result = await execute(RecentArticleQuery);
|
||||
const result = await execute(RecentArticleQuery, { limit });
|
||||
|
||||
if (!result.data) return [];
|
||||
|
||||
return result.data.article;
|
||||
return result.data.article_translations;
|
||||
}
|
||||
|
||||
export async function getArticleTranslationsBySlug(slug: string) {
|
||||
|
||||
@ -28,5 +28,5 @@ const t = useTranslation(Astro);
|
||||
</SplashLink>
|
||||
</SplashLinks>
|
||||
</Splash>
|
||||
<RecentArticles limit={5} />
|
||||
<RecentArticles />
|
||||
</PageLayout>
|
||||
|
||||
@ -1,13 +1,12 @@
|
||||
import type { MarkdownHeading } from "astro";
|
||||
import { DEFAULT_LANGUAGE } from "@root/constants";
|
||||
import { ArticleQuery } from "../graphql/graphql";
|
||||
import { Article_Translations, ArticleQuery } from "../graphql/graphql";
|
||||
|
||||
/**
|
||||
* If there is a translation of an article in the current language of the page,
|
||||
* the remaining articles with other translations should be removed.
|
||||
*/
|
||||
export function filterArticlesByPageLang(
|
||||
articles: ArticleQuery["article"][number]["translations"],
|
||||
export function filterArticlesByPageLang<T>(
|
||||
articles: Array<T & Pick<Article_Translations, "languages_code">>,
|
||||
pageLang: LanguageKeys
|
||||
) {
|
||||
if (!articles) return [];
|
||||
@ -33,8 +32,8 @@ export function createRelativeArticleUrl(
|
||||
return `${lang}/${prefix}/${date}/${slug}`;
|
||||
}
|
||||
|
||||
export function formatToArticleBlocks(articles: ArticleQuery["article"][0]["translations"]) {
|
||||
const blocks: Record<string, ArticleQuery["article"][0]["translations"]> = {};
|
||||
export function formatToArticleBlocks<T>(articles: Array<T & Pick<Article_Translations, "pub_date">>) {
|
||||
const blocks: Record<string, Array<T & Pick<Article_Translations, "pub_date">>> = {};
|
||||
|
||||
if (!articles) return {};
|
||||
|
||||
@ -48,21 +47,3 @@ export function formatToArticleBlocks(articles: ArticleQuery["article"][0]["tran
|
||||
|
||||
return blocks;
|
||||
}
|
||||
|
||||
export type MarkdownHeadingToc = MarkdownHeading & { subheadings?: MarkdownHeading[] };
|
||||
|
||||
export function buildToc(headings: MarkdownHeading[], maxDepth: number = 2) {
|
||||
const toc: MarkdownHeadingToc[] = [];
|
||||
const parentHeadings = new Map();
|
||||
|
||||
headings.forEach((h) => {
|
||||
const heading = { ...h, subheadings: [] };
|
||||
parentHeadings.set(heading.depth, heading);
|
||||
if (heading.depth === 1) {
|
||||
toc.push(heading);
|
||||
} else if (heading.depth <= maxDepth) {
|
||||
parentHeadings.get(heading.depth - 1)?.subheadings.push(heading);
|
||||
}
|
||||
});
|
||||
return toc;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user