Skip to content

Commit

Permalink
添加tag栏个性化排序
Browse files Browse the repository at this point in the history
  • Loading branch information
master1lan committed Jan 11, 2023
1 parent 88eef8d commit e3f9829
Show file tree
Hide file tree
Showing 7 changed files with 258 additions and 152 deletions.
125 changes: 13 additions & 112 deletions src/routers/layout/nav/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,21 @@ import {
restrictToHorizontalAxis,
restrictToParentElement,
} from "@dnd-kit/modifiers";
import { nanoid } from "nanoid";
import styles from "./nav.module.less";
import { FC, useState, useEffect, useMemo, memo } from "react";
import { Pick } from "@utils/index";
import { Flipped, Flipper } from "react-flip-toolkit";
import {
NavListItemType,
NavRouterItemType,
NavQueryItemType,
useNavList,
} from "./tools";
import { setLocalstorage } from "../tools";
//todo 拆分组件
//todo 修改文件夹
export default function Header_Nav() {
//todo 这里在loacalstorage中查找
const [navLists, setLists] = useState<NavListItemType[]>(nav_tag_list);
const [navLists, setLists] = useNavList();
//tag区是否展开
const [showed, setShow] = useState(false);
//拖拽事件绑定
Expand All @@ -52,9 +57,11 @@ export default function Header_Nav() {
const { active, over } = event;
if (over && active.id !== over.id) {
setLists((items) => {
const oldIndex = items.findIndex((item) => item.id === active.id);
const newIndex = items.findIndex((item) => item.id === over.id);
return arrayMove(items, oldIndex, newIndex);
const oldIndex = items.findIndex((item) => item.id === active.id),
newIndex = items.findIndex((item) => item.id === over.id),
newLists = arrayMove(items, oldIndex, newIndex);
setLocalstorage("navTagLists", newLists);
return newLists;
});
}
}
Expand Down Expand Up @@ -179,109 +186,3 @@ const NavTagChipItem: FC<Pick<NavQueryItemType, "query">> = memo((props) => {
);
});
//todo:修复展示更多栏的bug

type NavRouterItemType = {
id: string;
type: "router";
pathname: string;
name: string;
cancelable: boolean;
};
type NavQueryItemType = {
id: string;
type: "query";
query: string;
queryType: "q" | "tname" | "copyright";
queryString: string;
cancelable: boolean;
};
type NavListItemType = NavQueryItemType | NavRouterItemType;

const nav_tag_list = [
{
type: "router",
pathname: "photo",
name: "图片",
},
{
type: "router",
pathname: "video",
name: "视频",
},
{
type: "query",
query: "所有二创",
queryType: "q",
queryString: "",
},
{
type: "query",
query: "露早",
queryType: "q",
queryString: "露早",
},
{
type: "query",
query: "柚恩",
queryType: "q",
queryString: "柚恩",
},
{
type: "query",
query: "莞儿",
queryType: "q",
queryString: "莞儿",
},
{
type: "query",
query: "米诺",
queryType: "q",
queryString: "米诺",
},
{
type: "query",
query: "虞莫",
queryType: "q",
queryString: "虞莫",
},
{
type: "query",
query: "动画分区",
queryType: "tname",
queryString: "animation",
},
{
type: "query",
query: "音乐分区",
queryType: "tname",
queryString: "music",
},
{
type: "query",
query: "舞蹈分区",
queryType: "tname",
queryString: "dance",
},
{
type: "query",
query: "游戏分区",
queryType: "tname",
queryString: "delicacy",
},
{
type: "query",
query: "鬼畜分区",
queryType: "tname",
queryString: "guichu",
},
{
type: "query",
query: "其他分区",
queryType: "tname",
queryString: "other",
},
].map((item) => ({
...item,
id: nanoid(3),
cancelable: false,
})) as NavListItemType[];
184 changes: 184 additions & 0 deletions src/routers/layout/nav/tools.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
import { nanoid } from "nanoid";
import { useMemo, useState } from "react";
import { getLocalStorage } from "../tools";
//todo 将数据加密
export function useNavList(): [
NavListItemType[],
React.Dispatch<React.SetStateAction<NavListItemType[]>>
] {
const nav_ok_lists = useMemo(() => {
const local_lists = getLocalStorage("navTagLists", [] as NavListItemType[]);
if (PassNavList(local_lists)) {
return local_lists;
}
return nav_tag_list;
}, []);
const [navLists, setLists] = useState<NavListItemType[]>(nav_ok_lists);
return [navLists, setLists];
}
// 判断类型
const isNavRouterItemType = (
input: NavListItemType
): input is NavRouterItemType => {
return input.type === "router";
};
//检查对象是否有相应属性且类型相同
function checkPropertyType<T extends { [k: string]: any }>(
input: T,
property: string,
type: string
) {
return input.hasOwnProperty(property) && typeof input[property] === type;
}
//检测从localstorage提取的list是否满足条件
function PassNavList(lists: NavListItemType[]) {
if (
lists.length > 0 &&
lists.every((item) => {
if (
!allHasTypes.every(({ name, type }) =>
checkPropertyType(item, name, type)
)
) {
return false;
}
if (isNavRouterItemType(item)) {
return routerHasTypes.every(({ name, type }) =>
checkPropertyType(item, name, type)
);
} else {
return queryHasTypes.every(({ name, type }) =>
checkPropertyType(item, name, type)
);
}
})
) {
return true;
}
return false;
}
//构造器
const createHasType = (...rest: string[]) => {
return { name: rest[0], type: rest[1] || "string" };
};
//构造器
const createHasTypeList = (inputList: string[][]) =>
inputList.map((items) => createHasType(...items));

const allHasTypes = createHasTypeList([
["id"],
["type"],
["cancelable", "boolean"],
]),
routerHasTypes = createHasTypeList([["pathname"], ["name"]]),
queryHasTypes = createHasTypeList([
["query"],
["queryType"],
["queryString"],
]);

export type NavRouterItemType = {
id: string;
type: "router";
pathname: string;
name: string;
cancelable: boolean;
};
export type NavQueryItemType = {
id: string;
type: "query";
query: string;
queryType: "q" | "tname" | "copyright";
queryString: string;
cancelable: boolean;
};
export type NavListItemType = NavQueryItemType | NavRouterItemType;

const nav_tag_list = [
{
type: "router",
pathname: "photo",
name: "图片",
},
{
type: "router",
pathname: "video",
name: "视频",
},
{
type: "query",
query: "所有二创",
queryType: "q",
queryString: "",
},
{
type: "query",
query: "露早",
queryType: "q",
queryString: "露早",
},
{
type: "query",
query: "柚恩",
queryType: "q",
queryString: "柚恩",
},
{
type: "query",
query: "莞儿",
queryType: "q",
queryString: "莞儿",
},
{
type: "query",
query: "米诺",
queryType: "q",
queryString: "米诺",
},
{
type: "query",
query: "虞莫",
queryType: "q",
queryString: "虞莫",
},
{
type: "query",
query: "动画分区",
queryType: "tname",
queryString: "animation",
},
{
type: "query",
query: "音乐分区",
queryType: "tname",
queryString: "music",
},
{
type: "query",
query: "舞蹈分区",
queryType: "tname",
queryString: "dance",
},
{
type: "query",
query: "游戏分区",
queryType: "tname",
queryString: "delicacy",
},
{
type: "query",
query: "鬼畜分区",
queryType: "tname",
queryString: "guichu",
},
{
type: "query",
query: "其他分区",
queryType: "tname",
queryString: "other",
},
].map((item) => ({
...item,
id: nanoid(3),
cancelable: false,
})) as NavListItemType[];
7 changes: 5 additions & 2 deletions src/routers/layout/tools.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
export function getLocalStorage<T>(searchName: string, defaultRes: T) {
export function getLocalStorage<T>(searchName: string, defaultRes: T): T {
if (!localStorage) {
return defaultRes;
}
if (!localStorage.getItem(searchName)) {
localStorage.setItem(searchName, JSON.stringify(defaultRes));
}
return JSON.parse(localStorage.getItem(searchName) as string);
}
export function setLocalstorage(itemName: string, targetRes: unknown): void {
localStorage.setItem(itemName, JSON.stringify(targetRes));
if (localStorage) localStorage.setItem(itemName, JSON.stringify(targetRes));
}
15 changes: 15 additions & 0 deletions src/routers/video/item/icon.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,18 @@ export const CoinIcon: FC<{
/>
</svg>
);

export const BiliIcon: FC<{
height: number | string;
width?: number | string;
color?: string;
}> = ({ height, width = height, color = "#fff" }) => (
<svg viewBox='0 0 18 18' height={height} width={width}>
<path
fill={color}
fillRule='evenodd'
clipRule='evenodd'
d='M3.73252 2.67094C3.33229 2.28484 3.33229 1.64373 3.73252 1.25764C4.11291 0.890684 4.71552 0.890684 5.09591 1.25764L7.21723 3.30403C7.27749 3.36218 7.32869 3.4261 7.37081 3.49407H10.5789C10.6211 3.4261 10.6723 3.36218 10.7325 3.30403L12.8538 1.25764C13.2342 0.890684 13.8368 0.890684 14.2172 1.25764C14.6175 1.64373 14.6175 2.28484 14.2172 2.67094L13.364 3.49407H14C16.2091 3.49407 18 5.28493 18 7.49407V12.9996C18 15.2087 16.2091 16.9996 14 16.9996H4C1.79086 16.9996 0 15.2087 0 12.9996V7.49406C0 5.28492 1.79086 3.49407 4 3.49407H4.58579L3.73252 2.67094ZM4 5.42343C2.89543 5.42343 2 6.31886 2 7.42343V13.0702C2 14.1748 2.89543 15.0702 4 15.0702H14C15.1046 15.0702 16 14.1748 16 13.0702V7.42343C16 6.31886 15.1046 5.42343 14 5.42343H4ZM5 9.31747C5 8.76519 5.44772 8.31747 6 8.31747C6.55228 8.31747 7 8.76519 7 9.31747V10.2115C7 10.7638 6.55228 11.2115 6 11.2115C5.44772 11.2115 5 10.7638 5 10.2115V9.31747ZM12 8.31747C11.4477 8.31747 11 8.76519 11 9.31747V10.2115C11 10.7638 11.4477 11.2115 12 11.2115C12.5523 11.2115 13 10.7638 13 10.2115V9.31747C13 8.76519 12.5523 8.31747 12 8.31747Z'
></path>
</svg>
);
Loading

0 comments on commit e3f9829

Please sign in to comment.