Files
AFFiNE-Mirror/blocksuite/affine/block-database/src/utils/current-view.ts

53 lines
1.3 KiB
TypeScript

import { z } from 'zod';
const currentViewListSchema = z.array(
z.object({
blockId: z.string(),
viewId: z.string(),
})
);
const maxLength = 20;
const currentViewListKey = 'blocksuite:databaseBlock:view:currentViewList';
const storage = globalThis.sessionStorage;
const createCurrentViewStorage = () => {
const getList = () => {
const string = storage?.getItem(currentViewListKey);
if (!string) {
return;
}
try {
const result = currentViewListSchema.safeParse(JSON.parse(string));
if (result.success) {
return result.data;
}
} catch {
// do nothing
}
return;
};
const saveList = () => {
storage.setItem(currentViewListKey, JSON.stringify(list));
};
const list = getList() ?? [];
return {
getCurrentView: (blockId: string) => {
return list.find(item => item.blockId === blockId)?.viewId;
},
setCurrentView: (blockId: string, viewId: string) => {
const configIndex = list.findIndex(item => item.blockId === blockId);
if (configIndex >= 0) {
list.splice(configIndex, 1);
}
if (list.length >= maxLength) {
list.pop();
}
list.unshift({ blockId, viewId });
saveList();
},
};
};
export const currentViewStorage = createCurrentViewStorage();