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.
37 lines
1.3 KiB
37 lines
1.3 KiB
/**
|
|
* 行业技能词云 hook:按行业拉取技能词数据,统一管理 loading / error / refresh。
|
|
* 切换行业时自动重新取数(fetcher 依赖 industry);
|
|
* 搜索关键词的过滤规则放在接口层(filterSkillWords),这里只编排状态。
|
|
*/
|
|
import { useCallback, useState } from 'react';
|
|
import { fetchSkillCloud, filterSkillWords } from '../api';
|
|
import type { SkillCloudData, SkillWord } from '../types';
|
|
import { useAsyncData } from './useAsyncData';
|
|
|
|
export function useSkillCloud(initialIndustry = '互联网/IT') {
|
|
const [industry, setIndustry] = useState(initialIndustry);
|
|
const [keyword, setKeyword] = useState('');
|
|
const fetcher = useCallback(() => fetchSkillCloud(industry), [industry]);
|
|
|
|
const { data, loading, error, refresh } = useAsyncData(fetcher);
|
|
const cloud = (data as SkillCloudData | null) ?? null;
|
|
|
|
/** 按关键词过滤后的技能词;未输入关键词时即全量 */
|
|
const words: SkillWord[] = cloud ? filterSkillWords(cloud.words, keyword) : [];
|
|
|
|
return {
|
|
industry,
|
|
setIndustry,
|
|
cloud,
|
|
/** 搜索关键词 */
|
|
keyword,
|
|
setKeyword,
|
|
/** 过滤后的技能词(渲染词云用) */
|
|
words,
|
|
/** 有关键词但一条没命中 */
|
|
isEmpty: cloud !== null && words.length === 0,
|
|
loading,
|
|
error,
|
|
refresh,
|
|
};
|
|
}
|
|
|