PromucFlow_constructor/app/client/src/components/ads/TextInput.tsx
satbir121 b9154f6ea9
Homepage redesign with themes (#482)
* Updating homepage body color

* WIP: Fixing scrolls and adding anchors

* Removing divider from bottom of the page.

* Adding hover background color to app card

* Changing edit and launch icons.

* Fixing app name paddding in card.

* Fixing workspaces overflow

* Adding right padding to applications view

* Adding share icon to share btn

* Fixing Application card styles.

* Fixing text decoration in button.

* Adding new workspace button

* Fixing new workspace and new app styles.

* Adding icon sizes.

* Fixing Org Name and Org settings menu.

* Application menu working

* Fixing overlay visibility on app card

* Fixing settings page content width.

* Fixing workspace icon

* Changing app card colors.

* Removing debugger

* Adding app icon.

* Fixing the spaces in application card

* Adding storybook-static folder to gitignore.

* Adding other storybook files.

* Adding menu items for app

* Removing cypress selector from text.

* Menu width issue fixed

* Default app icon color added

* Removing hardcoded colors

* Removing hardcoded colors.

* Light Mode on!

* Showing correct icon and color in menu

* Update color working properly.

* Updating appIcon

* Editable text working.

* Adding validator

* Adding edit permissions to menu

* Removing box shadow on app card.

* Fixing context menu fill color

* Fixing Menu hover issues.

* Fixing menu open close hover issues.

* Fixing settings pages

* Changed Workspace to org.

* Fix: State management in EditableText Component (#540)

* Error state height is fixed as per design

* savingState prop condition fixed

* Fixing createnew.

* Fixing saving state for application card.

* Fixed application card editable text error.

* Fixing issue caused during merge.

* Fixing tests in create org.

* Removing commented code.

* Removing unwanted vars.

* Fixing delete duplicate tests.

* Latest color palette.

* Fixing form and table widget.

* Removing switcher from header

* Removing unused files

* Fixing app card context dropdown

* Show overlay fix

* Adding localStorage support to theme.

* Making dark mode the default.

Co-authored-by: Rohit Kumawat <rohit.kumawat@primathon.in>
2020-09-16 17:20:47 +05:30

185 lines
4.7 KiB
TypeScript

import React, { forwardRef, Ref, useCallback, useMemo, useState } from "react";
import { CommonComponentProps, hexToRgba, Classes } from "./common";
import styled from "styled-components";
import Text, { TextType } from "./Text";
import {
FORM_VALIDATION_INVALID_EMAIL,
ERROR_MESSAGE_NAME_EMPTY,
} from "constants/messages";
import { isEmail } from "utils/formhelpers";
import { useSelector } from "react-redux";
import { getThemeDetails } from "selectors/themeSelectors";
export type Validator = (
value: string,
) => {
isValid: boolean;
message: string;
};
export function emailValidator(email: string) {
const isValid = isEmail(email);
return {
isValid: isValid,
message: !isValid ? FORM_VALIDATION_INVALID_EMAIL : "",
};
}
export function notEmptyValidator(value: string) {
const isValid = !!value;
return {
isValid: isValid,
message: !isValid ? ERROR_MESSAGE_NAME_EMPTY : "",
};
}
export type TextInputProps = CommonComponentProps & {
placeholder?: string;
fill?: boolean;
defaultValue?: string;
validator?: (value: string) => { isValid: boolean; message: string };
onChange?: (value: string) => void;
};
type boxReturnType = {
bgColor: string;
color: string;
borderColor: string;
};
const boxStyles = (
props: TextInputProps,
isValid: boolean,
theme: any,
): boxReturnType => {
let bgColor = theme.colors.blackShades[0];
let color = theme.colors.blackShades[9];
let borderColor = theme.colors.blackShades[0];
if (props.disabled) {
bgColor = theme.colors.blackShades[2];
color = theme.colors.blackShades[6];
borderColor = theme.colors.blackShades[2];
}
if (!isValid) {
bgColor = hexToRgba(theme.colors.danger.main, 0.1);
color = theme.colors.danger.main;
borderColor = theme.colors.danger.main;
}
return { bgColor, color, borderColor };
};
const StyledInput = styled.input<
TextInputProps & { inputStyle: boxReturnType; isValid: boolean }
>`
width: ${props => (props.fill ? "100%" : "260px")};
border-radius: 0;
outline: 0;
box-shadow: none;
border: 1px solid ${props => props.inputStyle.borderColor};
padding: ${props => props.theme.spaces[4]}px
${props => props.theme.spaces[6]}px;
background-color: ${props => props.inputStyle.bgColor};
color: ${props => props.inputStyle.color};
&::placeholder {
color: ${props => props.theme.colors.blackShades[5]};
}
&:focus {
border: 1px solid
${props =>
props.isValid
? props.theme.colors.info.main
: props.theme.colors.danger.main};
box-shadow: ${props =>
props.isValid
? "0px 0px 4px 4px rgba(203, 72, 16, 0.18)"
: "0px 0px 4px 4px rgba(226, 44, 44, 0.18)"};
}
&:disabled {
cursor: not-allowed;
}
`;
const InputWrapper = styled.div`
display: flex;
flex-direction: column;
align-items: flex-start;
position: relative;
.${Classes.TEXT} {
color: ${props => props.theme.colors.danger.main};
}
`;
const ErrorWrapper = styled.div`
position absolute;
bottom: -17px;
`;
const TextInput = forwardRef(
(props: TextInputProps, ref: Ref<HTMLInputElement>) => {
const initialValidation = () => {
let validationObj = { isValid: true, message: "" };
if (props.defaultValue && props.validator) {
validationObj = props.validator(props.defaultValue);
}
return validationObj;
};
const [validation, setValidation] = useState<{
isValid: boolean;
message: string;
}>(initialValidation());
const theme = useSelector(getThemeDetails).theme;
const inputStyle = useMemo(
() => boxStyles(props, validation.isValid, theme),
[props, validation.isValid],
);
const memoizedChangeHandler = useCallback(
el => {
const validation = props.validator && props.validator(el.target.value);
if (validation) {
props.validator && setValidation(validation);
return (
validation.isValid &&
props.onChange &&
props.onChange(el.target.value)
);
} else {
return props.onChange && props.onChange(el.target.value);
}
},
[props],
);
const ErrorMessage = (
<ErrorWrapper>
<Text type={TextType.P3}>{validation.message}</Text>
</ErrorWrapper>
);
return (
<InputWrapper data-cy={props.cypressSelector}>
<StyledInput
type="text"
ref={ref}
inputStyle={inputStyle}
isValid={validation.isValid}
defaultValue={props.defaultValue}
{...props}
placeholder={props.placeholder}
onChange={memoizedChangeHandler}
/>
{ErrorMessage}
</InputWrapper>
);
},
);
TextInput.displayName = "TextInput";
export default TextInput;