1
0
mirror of https://github.com/XFox111/PasswordGeneratorExtension.git synced 2026-04-22 08:08:01 +03:00
Files
PasswordGeneratorExtension/entrypoints/popup/QuickOptions.tsx
T
Eugene Fox 8126886fb5 Major 5.0 (#469)
* Advanced generator, UI overhaul (#449)

* Major overhaul:
- Added advanced generator
- Removed "Insert and copy" feature
- Moved settings to extension options
- General refactoring

* Updated custom character options for default generator (#447)

* Added state save for advanced generator mode

* Fixed state save for advanced password generator

* Updated extension description

* Minor UI fixes:
- Fixed Options UI not displaying in Google Chrome
- Fixed Quick Options menus overflowing on some locales
- Fixed Advanced generator configuration UI clipping when window height is too small
- Fixed divider in Options UI taking up all available space

* Minor UI/UX changes and fixes:
- Fixed locale in Advanced generator toast notifications
- Added toast notification for copying a single password in Advanced generator
- Moved custom characters input lables to placeholders
- Fixed minor type issues
- Removed duplicate "About" text
- Fixed input fields alignment in Options
- Added "disabled" state for "Include Custom" option in Quick settings

* Bump @typescript-eslint/parser from 8.16.0 to 8.19.1 (#468)

Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 8.16.0 to 8.19.1.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.19.1/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump @eslint/js from 9.16.0 to 9.18.0 (#467)

Bumps [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) from 9.16.0 to 9.18.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/commits/v9.18.0/packages/js)

---
updated-dependencies:
- dependency-name: "@eslint/js"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump @fluentui/react-components from 9.56.3 to 9.57.0 (#466)

Bumps [@fluentui/react-components](https://github.com/microsoft/fluentui) from 9.56.3 to 9.57.0.
- [Release notes](https://github.com/microsoft/fluentui/releases)
- [Changelog](https://github.com/microsoft/fluentui/blob/master/azure-pipelines.release.yml)
- [Commits](https://github.com/microsoft/fluentui/compare/@fluentui/react-components_v9.56.3...@fluentui/react-components_v9.57.0)

---
updated-dependencies:
- dependency-name: "@fluentui/react-components"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump wxt from 0.19.17 to 0.19.24 (#465)

Bumps [wxt](https://github.com/wxt-dev/wxt) from 0.19.17 to 0.19.24.
- [Release notes](https://github.com/wxt-dev/wxt/releases)
- [Commits](https://github.com/wxt-dev/wxt/compare/wxt-v0.19.17...wxt-v0.19.24)

---
updated-dependencies:
- dependency-name: wxt
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump eslint from 9.16.0 to 9.18.0 (#464)

Bumps [eslint](https://github.com/eslint/eslint) from 9.16.0 to 9.18.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.16.0...v9.18.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump eslint-plugin-react from 7.37.2 to 7.37.4 (#463)

Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.37.2 to 7.37.4.
- [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases)
- [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.37.2...v7.37.4)

---
updated-dependencies:
- dependency-name: eslint-plugin-react
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Eugene Fox <eugene.xfox@outlook.com>

* Bump typescript from 5.7.2 to 5.7.3 (#462)

Bumps [typescript](https://github.com/microsoft/TypeScript) from 5.7.2 to 5.7.3.
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release.yml)
- [Commits](https://github.com/microsoft/TypeScript/compare/v5.7.2...v5.7.3)

---
updated-dependencies:
- dependency-name: typescript
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Eugene Fox <eugene.xfox@outlook.com>

* Bump @typescript-eslint/eslint-plugin from 8.16.0 to 8.19.1 (#461)

Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 8.16.0 to 8.19.1.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.19.1/packages/eslint-plugin)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump wdzeng/chrome-extension from 1.2.4 to 1.3.0 (#450)

* Bump wdzeng/chrome-extension from 1.2.4 to 1.3.0

Bumps [wdzeng/chrome-extension](https://github.com/wdzeng/chrome-extension) from 1.2.4 to 1.3.0.
- [Release notes](https://github.com/wdzeng/chrome-extension/releases)
- [Commits](https://github.com/wdzeng/chrome-extension/compare/v1.2.4...v1.3.0)

---
updated-dependencies:
- dependency-name: wdzeng/chrome-extension
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Optimized CD workflow

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Eugene Fox <eugene@xfox111.net>

* Bump @fluentui/react-icons from 2.0.266 to 2.0.270 (#458)

Bumps [@fluentui/react-icons](https://github.com/microsoft/fluentui-system-icons) from 2.0.266 to 2.0.270.
- [Changelog](https://github.com/microsoft/fluentui-system-icons/blob/main/fluentui-android-system-icons-release.yml)
- [Commits](https://github.com/microsoft/fluentui-system-icons/commits)

---
updated-dependencies:
- dependency-name: "@fluentui/react-icons"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump @wxt-dev/module-react from 1.1.2 to 1.1.3 (#455)

Bumps [@wxt-dev/module-react](https://github.com/wxt-dev/wxt/tree/HEAD/packages/module-react) from 1.1.2 to 1.1.3.
- [Release notes](https://github.com/wxt-dev/wxt/releases)
- [Changelog](https://github.com/wxt-dev/wxt/blob/main/packages/module-react/CHANGELOG.md)
- [Commits](https://github.com/wxt-dev/wxt/commits/module-react-v1.1.3/packages/module-react)

---
updated-dependencies:
- dependency-name: "@wxt-dev/module-react"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump globals from 15.12.0 to 15.14.0 (#452)

Bumps [globals](https://github.com/sindresorhus/globals) from 15.12.0 to 15.14.0.
- [Release notes](https://github.com/sindresorhus/globals/releases)
- [Commits](https://github.com/sindresorhus/globals/compare/v15.12.0...v15.14.0)

---
updated-dependencies:
- dependency-name: globals
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-13 14:08:31 +03:00

134 lines
5.0 KiB
TypeScript

import { GeneratorOptions, useStorage } from "@/utils/storage";
import * as fui from "@fluentui/react-components";
import * as ic from "@fluentui/react-icons";
import { ReactElement } from "react";
import { useStyles } from "./QuickOptions.styles";
export default function QuickOptions({ onChange }: QuickOptionsProps): ReactElement
{
const { extOptions, generatorOptions } = useStorage();
const [quickOpts, setOptions] = useState<GeneratorOptions>(generatorOptions);
const checkedOptions = useMemo(
() => Object.keys(quickOpts).filter(k => quickOpts[k as keyof GeneratorOptions] as boolean),
[quickOpts]
);
const onCheckedValueChange = useCallback((_: unknown, e: fui.MenuCheckedValueChangeData): void =>
{
const opts: Partial<Omit<GeneratorOptions, "Length" | "IncludeCustomSet" | "ExcludeCustomSet">> = {};
const keys = Object.keys(quickOpts)
.filter(i =>
i !== "Length" && i !== "IncludeCustomSet" && i !== "ExcludeCustomSet" &&
i.startsWith("Exclude") === (e.name === "exclude")
) as (keyof Omit<GeneratorOptions, "Length" | "IncludeCustomSet" | "ExcludeCustomSet">)[];
for (const key of keys)
opts[key] = e.checkedItems.includes(key);
setOptions({ ...generatorOptions, ...quickOpts, ...opts });
}, [quickOpts]);
useEffect(() => onChange(quickOpts), [onChange, quickOpts]);
const IncludeIcon: ic.FluentIcon = ic.bundleIcon(ic.AddCircleFilled, ic.AddCircleRegular);
const ExcludeIcon: ic.FluentIcon = ic.bundleIcon(ic.SubtractCircleFilled, ic.SubtractCircleRegular);
const cls = useStyles();
return (
<div className={ cls.options }>
<div className={ cls.lengthContainer }>
<fui.Slider
min={ extOptions.MinLength } max={ Math.max(extOptions.MaxLength, generatorOptions.Length) }
value={ quickOpts.Length } onChange={ (_, e) => setOptions({ ...quickOpts, Length: e.value }) } />
<fui.Text>{ quickOpts.Length }</fui.Text>
</div>
<div className={ cls.characterOptionsContainer }>
<fui.Menu
positioning={ { position: "after", align: "center", offset: -48 } }
checkedValues={ { include: checkedOptions } }
onCheckedValueChange={ onCheckedValueChange }>
<fui.MenuTrigger disableButtonEnhancement>
<fui.MenuButton appearance="subtle" icon={ <IncludeIcon /> }>
{ i18n.t("popup.include") }
</fui.MenuButton>
</fui.MenuTrigger>
<fui.MenuPopover>
<fui.MenuList>
<fui.MenuItemCheckbox name="include" value="Uppercase">
{ i18n.t("common.characters.uppercase") }
</fui.MenuItemCheckbox>
<fui.MenuItemCheckbox name="include" value="Lowercase">
{ i18n.t("common.characters.lowercase") }
</fui.MenuItemCheckbox>
<fui.MenuItemCheckbox name="include" value="Numeric">
{ i18n.t("common.characters.numeric") }
</fui.MenuItemCheckbox>
<fui.MenuItemCheckbox name="include" value="Special">
{ i18n.t("common.characters.special") }
</fui.MenuItemCheckbox>
<fui.MenuSplitGroup>
<fui.MenuItemCheckbox name="include" value="Custom"
disabled={ generatorOptions.IncludeCustomSet.length < 1 }>
{ i18n.t("common.characters.custom") }
</fui.MenuItemCheckbox>
<fui.MenuItem icon={ <ic.EditRegular /> }
onClick={ () => browser.runtime.openOptionsPage() } />
</fui.MenuSplitGroup>
</fui.MenuList>
</fui.MenuPopover>
</fui.Menu>
<fui.Menu
positioning={ { position: "after", align: "center", offset: -64 } }
checkedValues={ { exclude: checkedOptions } }
onCheckedValueChange={ onCheckedValueChange }>
<fui.MenuTrigger disableButtonEnhancement>
<fui.MenuButton appearance="subtle" icon={ <ExcludeIcon /> }>
{ i18n.t("popup.exclude") }
</fui.MenuButton>
</fui.MenuTrigger>
<fui.MenuPopover>
<fui.MenuList>
<fui.MenuItemCheckbox name="exclude" value="ExcludeSimilar">
{ i18n.t("common.characters.similar") }
</fui.MenuItemCheckbox>
<fui.MenuItemCheckbox name="exclude" value="ExcludeAmbiguous" disabled={ !quickOpts.Special }>
{ i18n.t("common.characters.ambiguous") }
</fui.MenuItemCheckbox>
<fui.MenuItemCheckbox name="exclude" value="ExcludeRepeating">
{ i18n.t("common.characters.repeating.label") }
</fui.MenuItemCheckbox>
<fui.MenuSplitGroup>
<fui.MenuItemCheckbox name="exclude" value="ExcludeCustom"
disabled={ generatorOptions.ExcludeCustomSet.length < 1 }>
{ i18n.t("common.characters.custom") }
</fui.MenuItemCheckbox>
<fui.MenuItem icon={ <ic.EditRegular /> }
onClick={ () => browser.runtime.openOptionsPage() } />
</fui.MenuSplitGroup>
</fui.MenuList>
</fui.MenuPopover>
</fui.Menu>
<fui.Tooltip content={ i18n.t("common.actions.reset") } relationship="label">
<fui.Button appearance="subtle" icon={ <ic.ArrowUndoRegular /> } onClick={ () => setOptions(generatorOptions) } />
</fui.Tooltip>
</div>
</div>
);
};
export type QuickOptionsProps =
{
onChange: (value: GeneratorOptions) => void;
};