You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
2.4 KiB
125 lines
2.4 KiB
import * as React from 'react';
|
|
import { css } from '@emotion/react';
|
|
|
|
export interface Author {
|
|
avatar: string;
|
|
href: string;
|
|
type: 'design' | 'develop';
|
|
name: string;
|
|
}
|
|
|
|
export interface Article {
|
|
title: string;
|
|
href: string;
|
|
date: string;
|
|
type: 'design' | 'develop';
|
|
author: Author['name'];
|
|
}
|
|
|
|
export interface Recommendation {
|
|
title?: string;
|
|
img?: string;
|
|
href?: string;
|
|
popularize?: boolean;
|
|
description?: string;
|
|
}
|
|
|
|
type SourceType = 'zhihu' | 'yuque';
|
|
export interface Extra {
|
|
title: string;
|
|
description: string;
|
|
date: string;
|
|
img: string;
|
|
source: SourceType;
|
|
href: string;
|
|
}
|
|
|
|
export interface Icon {
|
|
name: string;
|
|
href: string;
|
|
}
|
|
|
|
export type Articles = {
|
|
cn: Article[];
|
|
en: Article[];
|
|
};
|
|
|
|
export type Authors = Author[];
|
|
|
|
export type Recommendations = {
|
|
cn: Recommendation[];
|
|
en: Recommendation[];
|
|
};
|
|
|
|
export type Extras = {
|
|
cn: Extra[];
|
|
en: Extra[];
|
|
};
|
|
|
|
export type Icons = Icon[];
|
|
|
|
export type SiteData = {
|
|
articles: Articles;
|
|
authors: Authors;
|
|
recommendations: Recommendations;
|
|
extras: Extras;
|
|
icons: Icons;
|
|
};
|
|
|
|
export function preLoad(list: string[]) {
|
|
if (typeof window !== 'undefined') {
|
|
// 图处预加载;
|
|
const div = document.createElement('div');
|
|
div.style.display = 'none';
|
|
document.body.appendChild(div);
|
|
list.forEach((src) => {
|
|
const img = new Image();
|
|
img.src = src;
|
|
div.appendChild(img);
|
|
});
|
|
}
|
|
}
|
|
|
|
export function useSiteData(): [Partial<SiteData>, boolean] {
|
|
const [data, setData] = React.useState<Partial<SiteData>>({});
|
|
const [loading, setLoading] = React.useState<boolean>(false);
|
|
|
|
React.useEffect(() => {
|
|
if (Object.keys(data ?? {}).length === 0 && typeof fetch !== 'undefined') {
|
|
setLoading(true);
|
|
fetch(`https://render.alipay.com/p/h5data/antd4-config_website-h5data.json`)
|
|
.then((res) => res.json())
|
|
.then((result) => {
|
|
setData(result);
|
|
setLoading(false);
|
|
});
|
|
}
|
|
}, []);
|
|
|
|
return [data, loading];
|
|
}
|
|
|
|
export const useCarouselStyle = () => ({
|
|
carousel: css`
|
|
.slick-dots.slick-dots-bottom {
|
|
bottom: -22px;
|
|
li {
|
|
width: 6px;
|
|
height: 6px;
|
|
background: #e1eeff;
|
|
border-radius: 50%;
|
|
button {
|
|
height: 6px;
|
|
background: #e1eeff;
|
|
border-radius: 50%;
|
|
}
|
|
&.slick-active {
|
|
background: #4b9cff;
|
|
button {
|
|
background: #4b9cff;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
`,
|
|
});
|
|
|