mirror of
https://github.com/arsvendg/Stirling-PDF.git
synced 2026-07-16 03:20:46 +02:00
# Description of Changes Because we used string typing for IDs and names, it was really easy to make mistakes where variables named like `subcategory` would be stored as an ID in one file, but then read assuming it's a name in another file. This PR changes the code to consistently use enum cases when referring to IDs of categories, subcategories, and tools (at least in as many places as I can find them, ~I had to add a `ToolId` enum for this work~ I originally added a `ToolId` type for this work, but it caused too many issues when merging with #4222 so I've pulled it back out for now). Making that change made it obvious where we were inconsistently passing IDs and reading them as names etc. allowing me to fix rendering issues in the All Tools pane, where the subcategory IDs were being rendered directly (instead of being translated) or where IDs were being translated into names, but were then being re-translated, causing warnings in the log.
104 lines
3.5 KiB
TypeScript
104 lines
3.5 KiB
TypeScript
import { type TFunction } from 'i18next';
|
|
import React from 'react';
|
|
import { BaseToolProps } from '../types/tool';
|
|
|
|
export enum SubcategoryId {
|
|
SIGNING = 'signing',
|
|
DOCUMENT_SECURITY = 'documentSecurity',
|
|
VERIFICATION = 'verification',
|
|
DOCUMENT_REVIEW = 'documentReview',
|
|
PAGE_FORMATTING = 'pageFormatting',
|
|
EXTRACTION = 'extraction',
|
|
REMOVAL = 'removal',
|
|
AUTOMATION = 'automation',
|
|
GENERAL = 'general',
|
|
ADVANCED_FORMATTING = 'advancedFormatting',
|
|
DEVELOPER_TOOLS = 'developerTools'
|
|
}
|
|
|
|
export enum ToolCategoryId {
|
|
STANDARD_TOOLS = 'standardTools',
|
|
ADVANCED_TOOLS = 'advancedTools',
|
|
RECOMMENDED_TOOLS = 'recommendedTools'
|
|
}
|
|
|
|
export type ToolRegistryEntry = {
|
|
icon: React.ReactNode;
|
|
name: string;
|
|
component: React.ComponentType<BaseToolProps> | null;
|
|
view: 'sign' | 'security' | 'format' | 'extract' | 'view' | 'merge' | 'pageEditor' | 'convert' | 'redact' | 'split' | 'convert' | 'remove' | 'compress' | 'external';
|
|
description: string;
|
|
categoryId: ToolCategoryId;
|
|
subcategoryId: SubcategoryId;
|
|
maxFiles?: number;
|
|
supportedFormats?: string[];
|
|
endpoints?: string[];
|
|
link?: string;
|
|
type?: string;
|
|
}
|
|
|
|
export type ToolRegistry = Record<string /* FIX ME: Should be ToolId */, ToolRegistryEntry>;
|
|
|
|
export const SUBCATEGORY_ORDER: SubcategoryId[] = [
|
|
SubcategoryId.SIGNING,
|
|
SubcategoryId.DOCUMENT_SECURITY,
|
|
SubcategoryId.VERIFICATION,
|
|
SubcategoryId.DOCUMENT_REVIEW,
|
|
SubcategoryId.PAGE_FORMATTING,
|
|
SubcategoryId.EXTRACTION,
|
|
SubcategoryId.REMOVAL,
|
|
SubcategoryId.AUTOMATION,
|
|
SubcategoryId.GENERAL,
|
|
SubcategoryId.ADVANCED_FORMATTING,
|
|
SubcategoryId.DEVELOPER_TOOLS,
|
|
];
|
|
|
|
export const SUBCATEGORY_COLOR_MAP: Record<SubcategoryId, string> = {
|
|
[SubcategoryId.SIGNING]: '#FF7892',
|
|
[SubcategoryId.DOCUMENT_SECURITY]: '#FF7892',
|
|
[SubcategoryId.VERIFICATION]: '#1BB1D4',
|
|
[SubcategoryId.DOCUMENT_REVIEW]: '#48BD54',
|
|
[SubcategoryId.PAGE_FORMATTING]: '#7882FF',
|
|
[SubcategoryId.EXTRACTION]: '#1BB1D4',
|
|
[SubcategoryId.REMOVAL]: '#7882FF',
|
|
[SubcategoryId.AUTOMATION]: '#69DC95',
|
|
[SubcategoryId.GENERAL]: '#69DC95',
|
|
[SubcategoryId.ADVANCED_FORMATTING]: '#F55454',
|
|
[SubcategoryId.DEVELOPER_TOOLS]: '#F55454',
|
|
};
|
|
|
|
export const getCategoryLabel = (t: TFunction, id: ToolCategoryId): string => t(`toolPicker.categories.${id}`, id);
|
|
export const getSubcategoryLabel = (t: TFunction, id: SubcategoryId): string => t(`toolPicker.subcategories.${id}`, id);
|
|
export const getSubcategoryColor = (subcategory: SubcategoryId): string => SUBCATEGORY_COLOR_MAP[subcategory] || '#7882FF';
|
|
|
|
|
|
|
|
export const getAllEndpoints = (registry: ToolRegistry): string[] => {
|
|
const lists: string[][] = [];
|
|
Object.values(registry).forEach(entry => {
|
|
if (entry.endpoints && entry.endpoints.length > 0) {
|
|
lists.push(entry.endpoints);
|
|
}
|
|
});
|
|
return Array.from(new Set(lists.flat()));
|
|
};
|
|
|
|
export const getConversionEndpoints = (extensionToEndpoint: Record<string, Record<string, string>>): string[] => {
|
|
const endpoints = new Set<string>();
|
|
Object.values(extensionToEndpoint).forEach(toEndpoints => {
|
|
Object.values(toEndpoints).forEach(endpoint => {
|
|
endpoints.add(endpoint);
|
|
});
|
|
});
|
|
return Array.from(endpoints);
|
|
};
|
|
|
|
export const getAllApplicationEndpoints = (
|
|
registry: ToolRegistry,
|
|
extensionToEndpoint?: Record<string, Record<string, string>>
|
|
): string[] => {
|
|
const toolEp = getAllEndpoints(registry);
|
|
const convEp = extensionToEndpoint ? getConversionEndpoints(extensionToEndpoint) : [];
|
|
return Array.from(new Set([...toolEp, ...convEp]));
|
|
};
|