mirror of
https://github.com/bitsocialnet/5chan.git
synced 2026-08-03 07:41:04 +02:00
fix(directory): load direct board routes
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
import directoryListsData from '../../data/5chan-directory-lists.json';
|
||||
import { normalizeDirectoryList, type DirectoryList, type DirectoryListBoard } from './directory-list-utils';
|
||||
|
||||
const DIRECTORY_ALIAS_SUFFIXES = ['.bso', '.eth'] as const;
|
||||
|
||||
let vendoredDirectoryListsCache: DirectoryList[] | null = null;
|
||||
|
||||
export const normalizeBoardAddress = (address: string): string => {
|
||||
for (const suffix of DIRECTORY_ALIAS_SUFFIXES) {
|
||||
if (address.endsWith(suffix)) {
|
||||
return address.slice(0, -suffix.length);
|
||||
}
|
||||
}
|
||||
|
||||
return address;
|
||||
};
|
||||
|
||||
export const getVendoredDirectoryLists = (): DirectoryList[] => {
|
||||
if (vendoredDirectoryListsCache) return vendoredDirectoryListsCache;
|
||||
|
||||
const directories = Array.isArray(directoryListsData.directories) ? directoryListsData.directories : [];
|
||||
vendoredDirectoryListsCache = directories.flatMap((directory) => {
|
||||
const directoryCode = typeof directory.directoryCode === 'string' ? directory.directoryCode : undefined;
|
||||
if (!directoryCode) return [];
|
||||
const normalized = normalizeDirectoryList(directory, directoryCode);
|
||||
return normalized ? [normalized] : [];
|
||||
});
|
||||
|
||||
return vendoredDirectoryListsCache;
|
||||
};
|
||||
|
||||
export const getVendoredDirectoryList = (directoryCode: string): DirectoryList | null =>
|
||||
getVendoredDirectoryLists().find((directory) => directory.directoryCode === directoryCode) ?? null;
|
||||
|
||||
const findBoardInList = (list: DirectoryList, address: string): DirectoryListBoard | undefined => {
|
||||
const normalizedAddress = normalizeBoardAddress(address);
|
||||
return list.boards.find((board) => normalizeBoardAddress(board.address) === normalizedAddress || board.publicKey === address);
|
||||
};
|
||||
|
||||
export const getDirectoryCandidateBoardByAddress = (address: string | undefined): DirectoryListBoard | undefined => {
|
||||
if (!address) return undefined;
|
||||
|
||||
for (const directory of getVendoredDirectoryLists()) {
|
||||
const board = findBoardInList(directory, address);
|
||||
if (board) return board;
|
||||
}
|
||||
|
||||
return undefined;
|
||||
};
|
||||
|
||||
export const getDirectoryCodeForBoardAddress = (address: string | undefined): string | undefined => {
|
||||
if (!address) return undefined;
|
||||
|
||||
return getVendoredDirectoryLists().find((directory) => findBoardInList(directory, address))?.directoryCode;
|
||||
};
|
||||
Reference in New Issue
Block a user