diff --git a/desktop-app/src/renderer/components/Previewer/Device/ColorBlindnessTools/index.tsx b/desktop-app/src/renderer/components/Previewer/Device/ColorBlindnessTools/index.tsx index 66fa6774..f7769768 100644 --- a/desktop-app/src/renderer/components/Previewer/Device/ColorBlindnessTools/index.tsx +++ b/desktop-app/src/renderer/components/Previewer/Device/ColorBlindnessTools/index.tsx @@ -2,12 +2,14 @@ import { Icon } from '@iconify/react'; import cx from 'classnames'; import { useCallback, useEffect, useState } from 'react'; import { DropDown } from 'renderer/components/DropDown'; - -const redgreen = ['Deuteranopia', 'Deuteranomaly', 'Protanopia', 'Protanomaly']; -const blueyellow = ['Tritanopia', 'Tritanomaly']; -const full = ['Achromatomaly', 'Achromatopsia']; -const visualimpairments = ['Cataract', 'Farsightedness', 'Glaucome']; -const sunlight = ['Solarize']; +import { + BLUE_YELLOW, + FULL, + RED_GREEN, + SUNLIGHT, + VISUAL_IMPAIRMENTS, + VisionSimulationDropDown, +} from 'renderer/components/VisionSimulationDropDown'; interface InjectedCss { key: string; @@ -20,45 +22,6 @@ interface Props { webview: Electron.WebviewTag | null; } -const MenuItemLabel = ({ - label, - isActive, -}: { - label: string; - isActive: boolean; -}) => { - return ( -
- - - {label} - -
- ); -}; - -const MenuItemHeader = ({ label }: { label: string }) => { - return ( -
- - ); -}; - export const ColorBlindnessTools = ({ webview }: Props) => { const [injectCss, setInjectCss] = useState(); @@ -217,114 +180,30 @@ export const ColorBlindnessTools = ({ webview }: Props) => { return applyCss(visualImpairment, css, js); }; + const applySimulation = async (simulation = '') => { + if ( + RED_GREEN.indexOf(simulation) !== -1 || + BLUE_YELLOW.indexOf(simulation) !== -1 || + FULL.indexOf(simulation) !== -1 + ) { + return applyColorDeficiency(simulation); + } + + if (VISUAL_IMPAIRMENTS.indexOf(simulation) !== -1) { + return applyVisualImpairment(simulation); + } + + if (SUNLIGHT.indexOf(simulation) !== -1) { + return applySunlight(simulation); + } + + return clearSimulation(); + }; + return ( - } - options={[ - { - label: , - onClick: null, - }, - { - label: ( - - ), - onClick: () => { - clearSimulation(); - }, - }, - { - label: , - onClick: null, - }, - ...redgreen.map((x: string) => { - return { - label: ( - - ), - onClick: () => { - applyColorDeficiency(x.toLowerCase()); - }, - }; - }), - { - label: , - onClick: null, - }, - ...blueyellow.map((x: string) => { - return { - label: ( - - ), - onClick: () => { - applyColorDeficiency(x.toLowerCase()); - }, - }; - }), - { - label: , - onClick: null, - }, - ...full.map((x: string) => { - return { - label: ( - - ), - onClick: () => { - applyColorDeficiency(x.toLowerCase()); - }, - }; - }), - { - label: , - onClick: null, - }, - ...visualimpairments.map((x: string) => { - return { - label: ( - - ), - onClick: () => { - applyVisualImpairment(x.toLowerCase()); - }, - }; - }), - { - label: , - onClick: null, - }, - ...sunlight.map((x: string) => { - return { - label: ( - - ), - onClick: () => { - applySunlight(x.toLowerCase()); - }, - }; - }), - ]} + ); }; diff --git a/desktop-app/src/renderer/components/VisionSimulationDropDown/index.tsx b/desktop-app/src/renderer/components/VisionSimulationDropDown/index.tsx new file mode 100644 index 00000000..e29b5cb8 --- /dev/null +++ b/desktop-app/src/renderer/components/VisionSimulationDropDown/index.tsx @@ -0,0 +1,193 @@ +import cx from 'classnames'; +import { Icon } from '@iconify/react'; +import { DropDown } from '../DropDown'; + +const MenuItemLabel = ({ + label, + isActive, +}: { + label: string; + isActive: boolean; +}) => { + return ( +
+ + + {label} + +
+ ); +}; + +const MenuItemHeader = ({ label }: { label: string }) => { + return ( +
+ + ); +}; + +export const SIMULATIONS = { + DEUTERANOPIA: 'deuteranopia', + DEUTERANOMALY: 'deuteranomaly', + PROTANOPIA: 'protanopia', + PROTANOMALY: 'protanomaly', + TRITANOPIA: 'tritanopia', + TRITANOMALY: 'tritanomaly', + ACHROMATOMALY: 'achromatomaly', + ACHROMATOPSIA: 'achromatopsia', + CATARACT: 'cataract', + FAR: 'farsightedness', + GLAUCOME: 'glaucoma', + SOLARIZE: 'solarize', +}; + +export const RED_GREEN = [ + SIMULATIONS.DEUTERANOPIA, + SIMULATIONS.DEUTERANOMALY, + SIMULATIONS.PROTANOPIA, + SIMULATIONS.PROTANOMALY, +]; +export const BLUE_YELLOW = [SIMULATIONS.TRITANOPIA, SIMULATIONS.TRITANOMALY]; +export const FULL = [SIMULATIONS.ACHROMATOMALY, SIMULATIONS.ACHROMATOPSIA]; +export const VISUAL_IMPAIRMENTS = [ + SIMULATIONS.CATARACT, + SIMULATIONS.FAR, + SIMULATIONS.GLAUCOME, +]; +export const SUNLIGHT = [SIMULATIONS.SOLARIZE]; + +interface Props { + simulationName: string | undefined; + onChange: (name: string | undefined) => void; +} + +export const VisionSimulationDropDown = ({ + simulationName, + onChange, +}: Props) => { + return ( + } + options={[ + { + label: , + onClick: null, + }, + { + label: ( + + ), + onClick: () => { + onChange(undefined); + }, + }, + { + label: , + onClick: null, + }, + ...RED_GREEN.map((x: string) => { + return { + label: ( + + ), + onClick: () => { + onChange(x.toLowerCase()); + }, + }; + }), + { + label: , + onClick: null, + }, + ...BLUE_YELLOW.map((x: string) => { + return { + label: ( + + ), + onClick: () => { + onChange(x.toLowerCase()); + }, + }; + }), + { + label: , + onClick: null, + }, + ...FULL.map((x: string) => { + return { + label: ( + + ), + onClick: () => { + onChange(x.toLowerCase()); + }, + }; + }), + { + label: , + onClick: null, + }, + ...VISUAL_IMPAIRMENTS.map((x: string) => { + return { + label: ( + + ), + onClick: () => { + onChange(x.toLowerCase()); + }, + }; + }), + { + label: , + onClick: null, + }, + ...SUNLIGHT.map((x: string) => { + return { + label: ( + + ), + onClick: () => { + onChange(x.toLowerCase()); + }, + }; + }), + ]} + /> + ); +};