Files
TechRadarAJR/src/lib/data.ts
2024-03-13 14:32:38 +01:00

105 lines
2.5 KiB
TypeScript

import data from "../../data/data.json";
import config from "./config";
import { format } from "@/lib/format";
import { Flag, Item, Quadrant, Ring } from "@/lib/types";
export function getLabel(key: keyof typeof config.labels) {
return config.labels[key] || "";
}
export function getAppName() {
return getLabel("title");
}
export function getChartConfig() {
return config.chart;
}
export function getColors() {
return config.colors;
}
export function getFlags() {
return config.flags;
}
export function getFlag(flag: Flag) {
return config.flags[flag];
}
export function getRings(): Ring[] {
return config.rings;
}
export function getRing(id: string): Ring | undefined {
return getRings().find((r) => r.id === id);
}
export function getReleases(): string[] {
return data.releases;
}
export function getSocialLinks() {
return config.social;
}
export function getTags(): string[] {
return data.tags;
}
export function getEditUrl(props: { id: string; release: string }) {
if (!config.editUrl) return "";
return format(config.editUrl, props);
}
export function getQuadrants(): Quadrant[] {
return config.quadrants.map((q, i) => ({ ...q, position: i + 1 }));
}
export function getQuadrant(id: string): Quadrant | undefined {
return getQuadrants().find((q) => q.id === id);
}
export function getItems(quadrant?: string, featured?: boolean): Item[] {
return data.items.filter((item) => {
if (quadrant && item.quadrant !== quadrant) return false;
return !(featured && !item.featured);
}) as Item[];
}
export function getImprintUrl() {
return config.imprint;
}
export function getItem(id: string): Item | undefined {
return data.items.find((item) => item.id === id) as Item;
}
export const sortByFeaturedAndTitle = (a: Item, b: Item) =>
Number(b.featured) - Number(a.featured) || a.title.localeCompare(b.title);
export const groupItemsByRing = (items: Item[]) => {
return getRings().reduce(
(acc, ring) => {
const ringItems = items.filter((item) => item.ring === ring.id);
if (ringItems.length) acc[ring.id] = ringItems;
return acc;
},
{} as { [ringId: string]: Item[] },
);
};
export const groupItemsByQuadrant = (items: Item[]) => {
return getQuadrants().reduce(
(acc, quadrant) => {
const quadrantItems = items.filter(
(item) => item.quadrant === quadrant.id,
);
if (quadrantItems.length) acc[quadrant.id] = quadrantItems;
return acc;
},
{} as { [quadrantId: string]: Item[] },
);
};