* chore: empty state asset and theme improvement (#7542) * chore: empty state asset and theme improvement * chore: upgrade modal improvement and code refactor * feat: onboarding revamp and theme changes (#7541) * refactor: consolidate password strength indicator into shared UI package * chore: remove old password strength meter implementations * chore: update package dependencies for password strength refactor * chore: code refactor * chore: brand logo added * chore: terms and conditions refactor * chore: auth form refactor * chore: oauth enhancements and refactor * chore: plane new logos added * chore: auth input form field added to ui package * chore: password input component added * chore: web auth refactor * chore: update brand colors and remove onboarding-specific styles * chore: clean up unused assets * chore: profile menu text overflow * chore: theme related changes * chore: logo spinner updated * chore: onboarding constant and types updated * chore: theme changes and code refactor * feat: onboarding flow revamp * fix: build error and code refactoring * chore: code refactor * fix: build error * chore: consent option added to onboarding and code refactor * fix: build fix * chore: code refactor * chore: auth screen revamp and code refactor * chore: onboarding enhancements * chore: code refactor * chore: onboarding logic improvement * chore: code refactor * fix: onboarding pre release improvements * chore: color token updated * chore: color token updated * chore: auth screen line height and size improvements * chore: input height updated * chore: n-progress theme updated * chore: theme and logo enhancements * chore: space auth and code refactor * chore: update new brand empty states (#7543) * [WEB-4585]chore: branding updates (#7540) * chore: updated logo, og image, and loaders * chore: updated branding colors * chore: tour modal logo * chore: updated logo spinner size * chore: updated email templates logos and colors * chore: code refactor * fix: removed conditional hook render * fix: space app loader --------- Co-authored-by: Vamsi Krishna <46787868+vamsikrishnamathala@users.noreply.github.com> Co-authored-by: vamsikrishnamathala <matalav55@gmail.com>
77 lines
2.2 KiB
TypeScript
77 lines
2.2 KiB
TypeScript
import React, { useState } from "react";
|
|
import { E_PASSWORD_STRENGTH } from "@plane/constants";
|
|
import { cn, getPasswordStrength } from "@plane/utils";
|
|
import { PasswordStrengthIndicator } from "../form-fields/password/indicator";
|
|
import { AuthInput } from "./auth-input";
|
|
|
|
export interface AuthPasswordInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "autoComplete"> {
|
|
label?: string;
|
|
error?: string;
|
|
showPasswordStrength?: boolean;
|
|
showPasswordToggle?: boolean;
|
|
containerClassName?: string;
|
|
errorClassName?: string;
|
|
autoComplete?: "on" | "off";
|
|
onPasswordChange?: (password: string) => void;
|
|
onPasswordStrengthChange?: (strength: E_PASSWORD_STRENGTH) => void;
|
|
}
|
|
|
|
export const AuthPasswordInput: React.FC<AuthPasswordInputProps> = ({
|
|
label = "Password",
|
|
error,
|
|
showPasswordStrength = true,
|
|
showPasswordToggle = true,
|
|
containerClassName = "",
|
|
errorClassName = "",
|
|
className = "",
|
|
value = "",
|
|
onChange,
|
|
onPasswordChange,
|
|
onPasswordStrengthChange,
|
|
...props
|
|
}) => {
|
|
const [isFocused, setIsFocused] = useState(false);
|
|
|
|
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
|
const newPassword = e.target.value;
|
|
onChange?.(e);
|
|
onPasswordChange?.(newPassword);
|
|
};
|
|
|
|
const handleFocus = () => {
|
|
setIsFocused(true);
|
|
};
|
|
|
|
const handleBlur = () => {
|
|
setIsFocused(false);
|
|
};
|
|
|
|
const passwordStrength = getPasswordStrength(value as string);
|
|
|
|
// Notify parent of strength change
|
|
React.useEffect(() => {
|
|
onPasswordStrengthChange?.(passwordStrength);
|
|
}, [passwordStrength, onPasswordStrengthChange]);
|
|
|
|
return (
|
|
<div className={cn("space-y-2", containerClassName)}>
|
|
<AuthInput
|
|
{...props}
|
|
type="password"
|
|
label={label}
|
|
error={error}
|
|
showPasswordToggle={showPasswordToggle}
|
|
errorClassName={errorClassName}
|
|
className={className}
|
|
value={value}
|
|
onChange={handleChange}
|
|
onFocus={handleFocus}
|
|
onBlur={handleBlur}
|
|
autoComplete="on"
|
|
/>
|
|
{showPasswordStrength && value && isFocused && (
|
|
<PasswordStrengthIndicator password={value as string} showCriteria />
|
|
)}
|
|
</div>
|
|
);
|
|
};
|