import React, { useMemo } from 'react'; import { Image, ScrollView, Text, TouchableOpacity, View, type ColorValue, } from 'react-native'; import { EditorHelper, useRemoteEditorBridge } from '../EditorHelper'; import { CustomKeyboardExtension } from './CustomKeyboardExtension'; import { Images } from '../../assets'; import type { Color, EditorTheme } from '../../types'; const ColorKeyboardComp = () => { const editor = useRemoteEditorBridge(); const activeColor = editor?.getEditorState().activeColor; const activeHighlight = editor?.getEditorState().activeHighlight; const theme = editor?.theme; const setColor = (color?: ColorValue) => { if (!EditorHelper.editorLastInstance) return; if (color) EditorHelper.editorLastInstance.setColor(color.toString()); else EditorHelper.editorLastInstance.unsetColor(); EditorHelper.editorLastInstance.focus(); }; const setHighlight = (color?: ColorValue) => { if (!EditorHelper.editorLastInstance) return; if (color) EditorHelper.editorLastInstance.setHighlight(color.toString()); else EditorHelper.editorLastInstance.unsetHighlight(); EditorHelper.editorLastInstance.focus(); }; const groupedTextColors = useMemo( () => groupInChunks(theme?.colorKeyboard.colorSelection || [], 3), [theme?.colorKeyboard.colorSelection] ); const groupedHighlightColors = useMemo( () => groupInChunks(theme?.colorKeyboard.highlightSelection || [], 3), [theme?.colorKeyboard.highlightSelection] ); return ( Color {groupedTextColors.map((colorRow) => { return ( ); })} Highlight {groupedHighlightColors.map((colorRow) => { return ( ); })} ); }; interface ColorRowProps { colors: Color[]; theme?: EditorTheme; onPress: (color?: ColorValue) => void; activeColor?: string; icon?: boolean; } const ColorRow = ({ theme, colors, onPress, activeColor, icon, }: ColorRowProps) => { return ( {colors.map((color) => ( onPress(color.value)} color={color} isActive={ color.value === activeColor || (!color.value && !activeColor) } theme={theme} icon={icon} /> ))} ); }; interface ColorButtonProps { onPress: () => void; color: Color; isActive: boolean; theme?: EditorTheme; icon?: boolean; } const ColorButton = ({ theme, onPress, color, isActive, icon, }: ColorButtonProps) => ( {icon && ( )} {!icon && ( )} {color.name} ); function groupInChunks(array: T[], chunkSize: number): T[][] { let result = []; for (let i = 0; i < array.length; i += chunkSize) { result.push(array.slice(i, i + chunkSize)); } return result; } export const ColorKeyboard = new CustomKeyboardExtension( 'keyboard.color', ColorKeyboardComp );