/* * SPDX-License-Identifier: Apache-2.0 * * The OpenSearch Contributors require contributions made to * this file be licensed under the Apache-2.0 license or a * compatible open source license. * * Modifications Copyright OpenSearch Contributors. See * GitHub history for details. */ /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch B.V. licenses this file to you under * the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import React, { ButtonHTMLAttributes, HTMLAttributes, FunctionComponent, ReactNode, useState, useCallback, } from 'react'; import classNames from 'classnames'; import { CommonProps } from '../../common'; import { htmlIdGenerator } from '../../../services/accessibility'; import { OuiIcon } from '../../icon'; export type OuiSwitchEvent = React.BaseSyntheticEvent< React.MouseEvent, HTMLButtonElement, EventTarget & { checked: boolean; } >; export type OuiSwitchProps = CommonProps & Omit< ButtonHTMLAttributes, 'onChange' | 'type' | 'disabled' > & { /** * Whether to render the render the text label */ showLabel?: boolean; /** * Must be a string if `showLabel` prop is false */ label: ReactNode | string; checked: boolean; onChange: (event: OuiSwitchEvent) => void; disabled?: boolean; compressed?: boolean; type?: 'submit' | 'reset' | 'button'; /** * Object of props passed to the label's */ labelProps?: CommonProps & HTMLAttributes; }; export const OuiSwitch: FunctionComponent = ({ label, id, checked, disabled, compressed, onChange, className, showLabel = true, type = 'button', labelProps, ...rest }) => { const [switchId] = useState(id || htmlIdGenerator()()); const [labelId] = useState(labelProps?.id || htmlIdGenerator()()); const onClick = useCallback( (e: React.MouseEvent) => { if (disabled) { return; } const event = (e as unknown) as OuiSwitchEvent; event.target.checked = !checked; onChange(event); }, [checked, disabled, onChange] ); const classes = classNames( 'ouiSwitch', { 'ouiSwitch--compressed': compressed, }, className ); const labelClasses = classNames('ouiSwitch__label', labelProps?.className); if (showLabel === false && typeof label !== 'string') { console.warn( 'OuiSwitch `label` must be a string when `showLabel` is false.' ); } return (
{showLabel && ( //
); };