@compdfkit_pdf_sdk/react_native
Version:
ComPDFKit for React Native is a comprehensive SDK that allows you to quickly add PDF functionality to Android, iOS, and React Native applications.
99 lines (86 loc) • 3.04 kB
text/typescript
/**
* Copyright © 2014-2026 PDF Technologies, Inc. All Rights Reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*/
import type { CPDFContextMenuItem } from "../configuration/config/CPDFContextMenuConfig";
import type { CPDFBotaMenuItem } from "../configuration/config/CPDFGlobalConfig";
import { normalizeColorToARGB } from "../util/CPDFEnumUtils";
const HEX_COLOR_REGEX =
/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{4}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/;
/**
* Deep merge utility for configuration objects.
* Handles arrays, objects, and color normalization.
*/
export function mergeDeep(defaults: any, overrides: any): any {
const merged: any = {};
const keys = new Set([
...Object.keys(defaults || {}),
...Object.keys(overrides || {}),
]);
for (const key of keys) {
const defaultValue = defaults?.[key];
const overrideValue = overrides?.[key];
let value: any;
if (overrideValue !== undefined) {
if (Array.isArray(overrideValue)) {
value = [...overrideValue];
} else if (overrideValue && typeof overrideValue === "object") {
value = mergeDeep(defaultValue || {}, overrideValue);
} else {
value = overrideValue;
}
} else {
if (Array.isArray(defaultValue)) {
value = [...defaultValue];
} else if (defaultValue && typeof defaultValue === "object") {
value = mergeDeep(defaultValue, {});
} else {
value = defaultValue;
}
}
if (typeof value === "string" && HEX_COLOR_REGEX.test(value)) {
try {
value = normalizeColorToARGB(value);
} catch {}
}
merged[key] = value;
}
return merged;
}
export type CPDFContextMenuItemInput<T extends string = string> = Omit<
CPDFContextMenuItem<T>,
"showType"
> & { showType?: CPDFContextMenuItem<T>["showType"] };
/**
* Helper function to create context menu items with default showType.
*/
export const menus = <
T extends string,
A extends readonly (T | CPDFContextMenuItemInput<T>)[]
>(
...items: A
): CPDFContextMenuItem<T>[] =>
items.map((item) => {
if (typeof item === "string") {
// Provide default showType for simple string menu items
return { key: item as T, showType: "text" };
}
// Ensure object items have a showType; preserve provided value if exists
return (item as CPDFContextMenuItemInput<T>).showType
? (item as CPDFContextMenuItem<T>)
: ({ ...item, showType: "text" } as CPDFContextMenuItem<T>);
});
/**
* Helper function to create BOTA menu items.
*/
export const botaMenus = <
T extends string,
A extends readonly (T | CPDFBotaMenuItem<T>)[]
>(
...items: A
): CPDFBotaMenuItem<T>[] =>
items.map((item) => (typeof item === "string" ? { id: item } : item));