@mittwald/flow-react-components 0.2.0-alpha.564 → 0.2.0-alpha.565

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/assets/doc-properties.json +6 -6
  3. package/dist/js/@mittwald/password-tools-js.mjs +1 -1
  4. package/dist/js/components/src/components/PasswordCreationField/PasswordCreationField.mjs +0 -1
  5. package/dist/js/components/src/components/PasswordCreationField/PasswordCreationField.mjs.map +1 -1
  6. package/dist/js/components/src/components/PasswordCreationField/lib/generateValidationTranslation.mjs +0 -1
  7. package/dist/js/components/src/components/PasswordCreationField/lib/generateValidationTranslation.mjs.map +1 -1
  8. package/dist/js/components/src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.mjs +0 -1
  9. package/dist/js/components/src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.mjs.map +1 -1
  10. package/dist/js/components/src/components/PasswordCreationField/worker/generatePassword.mjs +0 -1
  11. package/dist/js/components/src/components/PasswordCreationField/worker/generatePassword.mjs.map +1 -1
  12. package/dist/js/components/src/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.mjs +38 -0
  13. package/dist/js/components/src/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.mjs.map +1 -0
  14. package/dist/js/components/src/integrations/react-hook-form/components/Form/Form.mjs +1 -3
  15. package/dist/js/components/src/integrations/react-hook-form/components/Form/Form.mjs.map +1 -1
  16. package/dist/js/components/src/integrations/react-hook-form/components/Form/lib/useRegisterActionStateContext.mjs +11 -9
  17. package/dist/js/components/src/integrations/react-hook-form/components/Form/lib/useRegisterActionStateContext.mjs.map +1 -1
  18. package/dist/js/components/src/integrations/react-hook-form/components/SubmitButton/SubmitButton.mjs +35 -29
  19. package/dist/js/components/src/integrations/react-hook-form/components/SubmitButton/SubmitButton.mjs.map +1 -1
  20. package/dist/types/components/ActionGroup/stories/Default.stories.d.ts.map +1 -1
  21. package/dist/types/integrations/@mittwald/password-tools-js/index.d.ts +1 -1
  22. package/dist/types/integrations/@mittwald/password-tools-js/index.d.ts.map +1 -1
  23. package/dist/types/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.d.ts +6 -0
  24. package/dist/types/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.d.ts.map +1 -0
  25. package/dist/types/integrations/react-hook-form/components/Form/Form.d.ts +1 -1
  26. package/dist/types/integrations/react-hook-form/components/Form/Form.d.ts.map +1 -1
  27. package/dist/types/integrations/react-hook-form/components/Form/lib/useRegisterActionStateContext.d.ts +0 -1
  28. package/dist/types/integrations/react-hook-form/components/Form/lib/useRegisterActionStateContext.d.ts.map +1 -1
  29. package/dist/types/integrations/react-hook-form/components/SubmitButton/SubmitButton.d.ts.map +1 -1
  30. package/package.json +4 -4
  31. package/dist/js/components/src/integrations/@mittwald/password-tools-js/generatePasswordCreationFieldValidation.mjs +0 -32
  32. package/dist/js/components/src/integrations/@mittwald/password-tools-js/generatePasswordCreationFieldValidation.mjs.map +0 -1
  33. package/dist/types/integrations/@mittwald/password-tools-js/generatePasswordCreationFieldValidation.d.ts +0 -3
  34. package/dist/types/integrations/@mittwald/password-tools-js/generatePasswordCreationFieldValidation.d.ts.map +0 -1
package/CHANGELOG.md CHANGED
@@ -3,6 +3,13 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [0.2.0-alpha.565](https://github.com/mittwald/flow/compare/0.2.0-alpha.564...0.2.0-alpha.565) (2025-11-25)
7
+
8
+ ### Bug Fixes
9
+
10
+ * **PasswordCreationField:** cache password validation result ([#2137](https://github.com/mittwald/flow/issues/2137)) ([cfedea2](https://github.com/mittwald/flow/commit/cfedea283727386c35ce200a9130d4d22b7dfd95))
11
+ * **ReactHookForm:** call result callback after action state update ([#2152](https://github.com/mittwald/flow/issues/2152)) ([95e3a1d](https://github.com/mittwald/flow/commit/95e3a1dd3492942cf9b5d727b90a5b3038fb2498))
12
+
6
13
  # [0.2.0-alpha.564](https://github.com/mittwald/flow/compare/0.2.0-alpha.563...0.2.0-alpha.564) (2025-11-25)
7
14
 
8
15
  **Note:** Version bump only for package @mittwald/flow-react-components
@@ -256823,10 +256823,10 @@
256823
256823
  "name": "() => ArrayIterator<any>"
256824
256824
  }
256825
256825
  },
256826
- "__@unscopables@3175": {
256826
+ "__@unscopables@3177": {
256827
256827
  "defaultValue": null,
256828
256828
  "description": "Is an object whose properties have the value 'true'\nwhen they will be absent when used in a 'with' statement.",
256829
- "name": "__@unscopables@3175",
256829
+ "name": "__@unscopables@3177",
256830
256830
  "parent": {
256831
256831
  "fileName": "flow/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts",
256832
256832
  "name": "Array"
@@ -257659,10 +257659,10 @@
257659
257659
  "name": "() => ArrayIterator<any>"
257660
257660
  }
257661
257661
  },
257662
- "__@unscopables@3175": {
257662
+ "__@unscopables@3177": {
257663
257663
  "defaultValue": null,
257664
257664
  "description": "Is an object whose properties have the value 'true'\nwhen they will be absent when used in a 'with' statement.",
257665
- "name": "__@unscopables@3175",
257665
+ "name": "__@unscopables@3177",
257666
257666
  "parent": {
257667
257667
  "fileName": "flow/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts",
257668
257668
  "name": "Array"
@@ -258495,10 +258495,10 @@
258495
258495
  "name": "() => ArrayIterator<any>"
258496
258496
  }
258497
258497
  },
258498
- "__@unscopables@3175": {
258498
+ "__@unscopables@3177": {
258499
258499
  "defaultValue": null,
258500
258500
  "description": "Is an object whose properties have the value 'true'\nwhen they will be absent when used in a 'with' statement.",
258501
- "name": "__@unscopables@3175",
258501
+ "name": "__@unscopables@3177",
258502
258502
  "parent": {
258503
258503
  "fileName": "flow/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts",
258504
258504
  "name": "Array"
@@ -1,7 +1,7 @@
1
1
  "use client"
2
2
  /* */
3
3
  export { defaultPasswordCreationPolicy } from '../components/src/integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
4
- export { generatePasswordCreationFieldValidation } from '../components/src/integrations/@mittwald/password-tools-js/generatePasswordCreationFieldValidation.mjs';
4
+ export { generatePasswordCreationFieldValidation, usePasswordCreationFieldValidation } from '../components/src/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.mjs';
5
5
  export { Policy } from '@mittwald/password-tools-js/policy';
6
6
  export { AsyncRule, RegexFlags, RuleType, SequenceType, SyncRule } from '@mittwald/password-tools-js/rules';
7
7
  export { Generator } from '@mittwald/password-tools-js/generator';
@@ -26,7 +26,6 @@ import { PasswordGenerateButton } from './components/PasswordGenerateButton/Pass
26
26
  import { useLocalizedContextStringFormatter } from '../TranslationProvider/useLocalizedContextStringFormatter.mjs';
27
27
  import { defaultPasswordCreationPolicy } from '../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
28
28
  import { Policy } from '@mittwald/password-tools-js/policy';
29
- import 'remeda';
30
29
  import '@mittwald/password-tools-js/rules';
31
30
  import '@mittwald/password-tools-js/generator';
32
31
  import { usePolicyValidationResult } from './lib/usePolicyValidationResult.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordCreationField.mjs","sources":["../../../../../../src/components/PasswordCreationField/PasswordCreationField.tsx"],"sourcesContent":["import {\n type PropsWithChildren,\n useState,\n type ClipboardEvent,\n useDeferredValue,\n useMemo,\n} from \"react\";\nimport {\n dynamic,\n type PropsContext,\n PropsContextProvider,\n} from \"@/lib/propsContext\";\nimport {\n flowComponent,\n type FlowComponentProps,\n} from \"@/lib/componentFactory/flowComponent\";\nimport styles from \"./PasswordCreationField.module.scss\";\nimport * as Aria from \"react-aria-components\";\nimport clsx from \"clsx\";\nimport { TunnelExit, TunnelProvider } from \"@mittwald/react-tunnel\";\nimport { type ActionFn } from \"@/components/Action\";\nimport getStateFromLatestPolicyValidationResult from \"@/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult\";\nimport locales from \"./locales/*.locale.json\";\nimport generateValidationTranslation from \"@/components/PasswordCreationField/lib/generateValidationTranslation\";\nimport FieldDescription from \"@/components/FieldDescription\";\nimport ComplexityIndicator from \"@/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator\";\nimport { generatePassword } from \"@/components/PasswordCreationField/worker/generatePassword\";\nimport TogglePasswordVisibilityButton from \"@/components/PasswordCreationField/components/TogglePasswordVisibilityButton/TogglePasswordVisibilityButton\";\nimport { ReactAriaControlledValueFix } from \"@/lib/react/ReactAriaControlledValueFix\";\nimport { ValidationResultButton } from \"@/components/PasswordCreationField/components/ValidationResultButton/ValidationResultButton\";\nimport { PasswordGenerateButton } from \"@/components/PasswordCreationField/components/PasswordGenerateButton/PasswordGenerateButton\";\nimport { useLocalizedContextStringFormatter } from \"@/components/TranslationProvider/useLocalizedContextStringFormatter\";\nimport type {\n PolicyValidationResult,\n PolicyGenericDeclaration,\n RuleValidationResult,\n} from \"@/integrations/@mittwald/password-tools-js\";\nimport {\n defaultPasswordCreationPolicy,\n Policy,\n} from \"@/integrations/@mittwald/password-tools-js\";\nimport { usePolicyValidationResult } from \"@/components/PasswordCreationField/lib/usePolicyValidationResult\";\nimport { useManagedValue } from \"@/lib/hooks/useManagedValue\";\nimport { useFieldComponent } from \"@/lib/hooks/useFieldComponent\";\nimport { FieldError } from \"@/components/FieldError\";\n\nexport interface PasswordCreationFieldProps\n extends PropsWithChildren<\n Omit<Aria.TextFieldProps, \"children\" | \"value\" | \"defaultValue\"> &\n Partial<Pick<Aria.FieldErrorRenderProps, \"validationErrors\">>\n >,\n FlowComponentProps<HTMLInputElement> {\n value?: string;\n onValidationResult?: (result: { password: string; isValid: boolean }) => void;\n defaultValue?: string;\n placeholder?: string;\n validationPolicy?: PolicyGenericDeclaration;\n}\n\nexport interface ResolvedPolicyValidationResult\n extends Omit<PolicyValidationResult, \"isValid\"> {\n isValid: boolean | \"indeterminate\";\n ruleResults: RuleValidationResult[];\n}\n\n/** @flr-generate all */\nexport const PasswordCreationField = flowComponent(\n \"PasswordCreationField\",\n (props) => {\n const {\n children,\n className,\n ref,\n isDisabled,\n onValidationResult,\n isInvalid: invalidFromProps,\n validationPolicy:\n validationPolicyFromProps = defaultPasswordCreationPolicy,\n isRequired,\n ...rest\n } = props;\n\n const {\n FieldErrorView,\n FieldErrorCaptureContext,\n fieldProps,\n fieldPropsContext,\n } = useFieldComponent(props);\n\n const [isLoading, setIsLoading] = useState(false);\n const translate = useLocalizedContextStringFormatter(locales);\n\n const validationPolicy = useMemo(\n () => Policy.fromDeclaration(validationPolicyFromProps),\n [validationPolicyFromProps],\n );\n\n const { value, handleOnChange } = useManagedValue(props);\n const deferredValue = useDeferredValue(value);\n\n const [isPasswordRevealed, setIsPasswordRevealed] = useState(false);\n const initialPolicyValidationState: ResolvedPolicyValidationResult = {\n isValid: true,\n complexity: {\n min: validationPolicy.minComplexity,\n actual: 4,\n warning: null,\n },\n ruleResults: [],\n };\n\n const [policyValidationResult, setPolicyValidationResult] = useState(\n initialPolicyValidationState,\n );\n usePolicyValidationResult(\n validationPolicy,\n deferredValue,\n () => {\n if (isEmptyValue) {\n return;\n }\n\n setIsLoading(() => true);\n },\n ({ password, isValid, results }) => {\n if (isEmptyValue) {\n setPolicyValidationResult(() => ({\n ...results,\n isValid: true,\n }));\n return;\n }\n\n setIsLoading(() => false);\n setPolicyValidationResult(() => results);\n onValidationResult?.({ password, isValid });\n },\n );\n\n const isEmptyValue = !value;\n const stateFromValidationResult = getStateFromLatestPolicyValidationResult(\n isEmptyValue,\n policyValidationResult,\n );\n let latestValidationErrorText = undefined;\n if (stateFromValidationResult) {\n const [translationKey, translationValues] = generateValidationTranslation(\n stateFromValidationResult,\n );\n latestValidationErrorText = translate.format(\n translationKey,\n translationValues,\n );\n }\n\n const isValidFromValidationResult =\n !isEmptyValue && stateFromValidationResult?.isValid;\n const isInvalidFromValidationResult =\n !isEmptyValue && !stateFromValidationResult?.isValid;\n const isInvalid = invalidFromProps || isInvalidFromValidationResult;\n\n const setOptimisticPolicyValidationResult = (\n state: Partial<ResolvedPolicyValidationResult> = {},\n ) => {\n setIsLoading(() => false);\n setPolicyValidationResult(() => ({\n ...initialPolicyValidationState,\n ...state,\n isValid: true,\n }));\n };\n\n const onPasswordGenerateHandler: ActionFn = async () => {\n const generatedPassword = await generatePassword(validationPolicy);\n setOptimisticPolicyValidationResult();\n setIsPasswordRevealed(true);\n handleOnChange(generatedPassword);\n };\n\n const onPasswordPasteHandler = (event: ClipboardEvent) => {\n const pastedValue = event.clipboardData.getData(\"text\");\n if (pastedValue !== value) {\n setOptimisticPolicyValidationResult({\n isValid: \"indeterminate\",\n });\n }\n };\n\n const togglePasswordVisibilityHandler = () => {\n setIsPasswordRevealed((old) => !old);\n };\n\n const propsContext: PropsContext = {\n ...fieldPropsContext,\n Button: {\n tunnelId: \"button\",\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n },\n CopyButton: {\n tunnelId: \"button\",\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n text: value,\n },\n Label: {\n ...fieldPropsContext.Label,\n tunnelId: \"label\",\n children: dynamic((localProps) => {\n return (\n <>\n {localProps.children}\n <PasswordGenerateButton\n isDisabled={isDisabled}\n onGeneratePasswordAction={onPasswordGenerateHandler}\n />\n <ValidationResultButton\n isEmptyValue={isEmptyValue}\n isDisabled={isDisabled}\n policyValidationResult={policyValidationResult}\n />\n </>\n );\n }),\n },\n };\n\n return (\n <Aria.TextField\n {...rest}\n value={value}\n type={isPasswordRevealed ? \"text\" : \"password\"}\n onChange={handleOnChange}\n onPaste={onPasswordPasteHandler}\n className={clsx(className, fieldProps.className)}\n isDisabled={isDisabled}\n isInvalid={isInvalid}\n isRequired={isRequired}\n >\n <TunnelProvider>\n <FieldErrorCaptureContext>\n <FieldError>{latestValidationErrorText}</FieldError>\n <PropsContextProvider\n props={propsContext}\n dependencies={[\n isDisabled,\n isRequired,\n value,\n policyValidationResult,\n ]}\n >\n <TunnelExit id=\"label\" />\n <Aria.Group\n isDisabled={isDisabled}\n className={clsx(styles.inputGroup)}\n >\n <ReactAriaControlledValueFix\n inputContext={Aria.InputContext}\n props={{ ...props, value }}\n >\n <Aria.Input ref={ref} className={styles.input} />\n </ReactAriaControlledValueFix>\n <Aria.Group className={styles.buttonContainer}>\n <TogglePasswordVisibilityButton\n className={styles.button}\n isVisible={isPasswordRevealed}\n isDisabled={isDisabled}\n onPress={togglePasswordVisibilityHandler}\n />\n <TunnelExit id=\"button\" />\n </Aria.Group>\n <ComplexityIndicator\n isEmptyValue={isEmptyValue}\n isLoading={isLoading}\n policyValidationResult={policyValidationResult}\n validationResultState={stateFromValidationResult}\n />\n </Aria.Group>\n {children}\n {isValidFromValidationResult && (\n <FieldDescription>{latestValidationErrorText}</FieldDescription>\n )}\n </PropsContextProvider>\n </FieldErrorCaptureContext>\n <FieldErrorView />\n </TunnelProvider>\n </Aria.TextField>\n );\n },\n);\n\nexport default PasswordCreationField;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PasswordCreationField.mjs","sources":["../../../../../../src/components/PasswordCreationField/PasswordCreationField.tsx"],"sourcesContent":["import {\n type PropsWithChildren,\n useState,\n type ClipboardEvent,\n useDeferredValue,\n useMemo,\n} from \"react\";\nimport {\n dynamic,\n type PropsContext,\n PropsContextProvider,\n} from \"@/lib/propsContext\";\nimport {\n flowComponent,\n type FlowComponentProps,\n} from \"@/lib/componentFactory/flowComponent\";\nimport styles from \"./PasswordCreationField.module.scss\";\nimport * as Aria from \"react-aria-components\";\nimport clsx from \"clsx\";\nimport { TunnelExit, TunnelProvider } from \"@mittwald/react-tunnel\";\nimport { type ActionFn } from \"@/components/Action\";\nimport getStateFromLatestPolicyValidationResult from \"@/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult\";\nimport locales from \"./locales/*.locale.json\";\nimport generateValidationTranslation from \"@/components/PasswordCreationField/lib/generateValidationTranslation\";\nimport FieldDescription from \"@/components/FieldDescription\";\nimport ComplexityIndicator from \"@/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator\";\nimport { generatePassword } from \"@/components/PasswordCreationField/worker/generatePassword\";\nimport TogglePasswordVisibilityButton from \"@/components/PasswordCreationField/components/TogglePasswordVisibilityButton/TogglePasswordVisibilityButton\";\nimport { ReactAriaControlledValueFix } from \"@/lib/react/ReactAriaControlledValueFix\";\nimport { ValidationResultButton } from \"@/components/PasswordCreationField/components/ValidationResultButton/ValidationResultButton\";\nimport { PasswordGenerateButton } from \"@/components/PasswordCreationField/components/PasswordGenerateButton/PasswordGenerateButton\";\nimport { useLocalizedContextStringFormatter } from \"@/components/TranslationProvider/useLocalizedContextStringFormatter\";\nimport type {\n PolicyValidationResult,\n PolicyGenericDeclaration,\n RuleValidationResult,\n} from \"@/integrations/@mittwald/password-tools-js\";\nimport {\n defaultPasswordCreationPolicy,\n Policy,\n} from \"@/integrations/@mittwald/password-tools-js\";\nimport { usePolicyValidationResult } from \"@/components/PasswordCreationField/lib/usePolicyValidationResult\";\nimport { useManagedValue } from \"@/lib/hooks/useManagedValue\";\nimport { useFieldComponent } from \"@/lib/hooks/useFieldComponent\";\nimport { FieldError } from \"@/components/FieldError\";\n\nexport interface PasswordCreationFieldProps\n extends PropsWithChildren<\n Omit<Aria.TextFieldProps, \"children\" | \"value\" | \"defaultValue\"> &\n Partial<Pick<Aria.FieldErrorRenderProps, \"validationErrors\">>\n >,\n FlowComponentProps<HTMLInputElement> {\n value?: string;\n onValidationResult?: (result: { password: string; isValid: boolean }) => void;\n defaultValue?: string;\n placeholder?: string;\n validationPolicy?: PolicyGenericDeclaration;\n}\n\nexport interface ResolvedPolicyValidationResult\n extends Omit<PolicyValidationResult, \"isValid\"> {\n isValid: boolean | \"indeterminate\";\n ruleResults: RuleValidationResult[];\n}\n\n/** @flr-generate all */\nexport const PasswordCreationField = flowComponent(\n \"PasswordCreationField\",\n (props) => {\n const {\n children,\n className,\n ref,\n isDisabled,\n onValidationResult,\n isInvalid: invalidFromProps,\n validationPolicy:\n validationPolicyFromProps = defaultPasswordCreationPolicy,\n isRequired,\n ...rest\n } = props;\n\n const {\n FieldErrorView,\n FieldErrorCaptureContext,\n fieldProps,\n fieldPropsContext,\n } = useFieldComponent(props);\n\n const [isLoading, setIsLoading] = useState(false);\n const translate = useLocalizedContextStringFormatter(locales);\n\n const validationPolicy = useMemo(\n () => Policy.fromDeclaration(validationPolicyFromProps),\n [validationPolicyFromProps],\n );\n\n const { value, handleOnChange } = useManagedValue(props);\n const deferredValue = useDeferredValue(value);\n\n const [isPasswordRevealed, setIsPasswordRevealed] = useState(false);\n const initialPolicyValidationState: ResolvedPolicyValidationResult = {\n isValid: true,\n complexity: {\n min: validationPolicy.minComplexity,\n actual: 4,\n warning: null,\n },\n ruleResults: [],\n };\n\n const [policyValidationResult, setPolicyValidationResult] = useState(\n initialPolicyValidationState,\n );\n usePolicyValidationResult(\n validationPolicy,\n deferredValue,\n () => {\n if (isEmptyValue) {\n return;\n }\n\n setIsLoading(() => true);\n },\n ({ password, isValid, results }) => {\n if (isEmptyValue) {\n setPolicyValidationResult(() => ({\n ...results,\n isValid: true,\n }));\n return;\n }\n\n setIsLoading(() => false);\n setPolicyValidationResult(() => results);\n onValidationResult?.({ password, isValid });\n },\n );\n\n const isEmptyValue = !value;\n const stateFromValidationResult = getStateFromLatestPolicyValidationResult(\n isEmptyValue,\n policyValidationResult,\n );\n let latestValidationErrorText = undefined;\n if (stateFromValidationResult) {\n const [translationKey, translationValues] = generateValidationTranslation(\n stateFromValidationResult,\n );\n latestValidationErrorText = translate.format(\n translationKey,\n translationValues,\n );\n }\n\n const isValidFromValidationResult =\n !isEmptyValue && stateFromValidationResult?.isValid;\n const isInvalidFromValidationResult =\n !isEmptyValue && !stateFromValidationResult?.isValid;\n const isInvalid = invalidFromProps || isInvalidFromValidationResult;\n\n const setOptimisticPolicyValidationResult = (\n state: Partial<ResolvedPolicyValidationResult> = {},\n ) => {\n setIsLoading(() => false);\n setPolicyValidationResult(() => ({\n ...initialPolicyValidationState,\n ...state,\n isValid: true,\n }));\n };\n\n const onPasswordGenerateHandler: ActionFn = async () => {\n const generatedPassword = await generatePassword(validationPolicy);\n setOptimisticPolicyValidationResult();\n setIsPasswordRevealed(true);\n handleOnChange(generatedPassword);\n };\n\n const onPasswordPasteHandler = (event: ClipboardEvent) => {\n const pastedValue = event.clipboardData.getData(\"text\");\n if (pastedValue !== value) {\n setOptimisticPolicyValidationResult({\n isValid: \"indeterminate\",\n });\n }\n };\n\n const togglePasswordVisibilityHandler = () => {\n setIsPasswordRevealed((old) => !old);\n };\n\n const propsContext: PropsContext = {\n ...fieldPropsContext,\n Button: {\n tunnelId: \"button\",\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n },\n CopyButton: {\n tunnelId: \"button\",\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n text: value,\n },\n Label: {\n ...fieldPropsContext.Label,\n tunnelId: \"label\",\n children: dynamic((localProps) => {\n return (\n <>\n {localProps.children}\n <PasswordGenerateButton\n isDisabled={isDisabled}\n onGeneratePasswordAction={onPasswordGenerateHandler}\n />\n <ValidationResultButton\n isEmptyValue={isEmptyValue}\n isDisabled={isDisabled}\n policyValidationResult={policyValidationResult}\n />\n </>\n );\n }),\n },\n };\n\n return (\n <Aria.TextField\n {...rest}\n value={value}\n type={isPasswordRevealed ? \"text\" : \"password\"}\n onChange={handleOnChange}\n onPaste={onPasswordPasteHandler}\n className={clsx(className, fieldProps.className)}\n isDisabled={isDisabled}\n isInvalid={isInvalid}\n isRequired={isRequired}\n >\n <TunnelProvider>\n <FieldErrorCaptureContext>\n <FieldError>{latestValidationErrorText}</FieldError>\n <PropsContextProvider\n props={propsContext}\n dependencies={[\n isDisabled,\n isRequired,\n value,\n policyValidationResult,\n ]}\n >\n <TunnelExit id=\"label\" />\n <Aria.Group\n isDisabled={isDisabled}\n className={clsx(styles.inputGroup)}\n >\n <ReactAriaControlledValueFix\n inputContext={Aria.InputContext}\n props={{ ...props, value }}\n >\n <Aria.Input ref={ref} className={styles.input} />\n </ReactAriaControlledValueFix>\n <Aria.Group className={styles.buttonContainer}>\n <TogglePasswordVisibilityButton\n className={styles.button}\n isVisible={isPasswordRevealed}\n isDisabled={isDisabled}\n onPress={togglePasswordVisibilityHandler}\n />\n <TunnelExit id=\"button\" />\n </Aria.Group>\n <ComplexityIndicator\n isEmptyValue={isEmptyValue}\n isLoading={isLoading}\n policyValidationResult={policyValidationResult}\n validationResultState={stateFromValidationResult}\n />\n </Aria.Group>\n {children}\n {isValidFromValidationResult && (\n <FieldDescription>{latestValidationErrorText}</FieldDescription>\n )}\n </PropsContextProvider>\n </FieldErrorCaptureContext>\n <FieldErrorView />\n </TunnelProvider>\n </Aria.TextField>\n );\n },\n);\n\nexport default PasswordCreationField;\n"],"names":[],"mappings":"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"}
@@ -2,7 +2,6 @@
2
2
  /* */
3
3
  import '../../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
4
4
  import '@mittwald/password-tools-js/policy';
5
- import 'remeda';
6
5
  import 'react';
7
6
  import { RuleType } from '@mittwald/password-tools-js/rules';
8
7
  import '@mittwald/password-tools-js/generator';
@@ -1 +1 @@
1
- {"version":3,"file":"generateValidationTranslation.mjs","sources":["../../../../../../../src/components/PasswordCreationField/lib/generateValidationTranslation.ts"],"sourcesContent":["import {\n RuleType,\n type RuleValidationResult,\n} from \"@/integrations/@mittwald/password-tools-js\";\n\nconst generateTranslationString = (\n rule: Partial<RuleValidationResult> & { translationKey?: string },\n shortVersion = false,\n): string => {\n if (rule.translationKey) {\n return `validation.${rule.translationKey}`;\n }\n const translateString = `validation.${rule.ruleType ?? \"general\"}`;\n let finalTranslationString = \"\";\n\n if (\n (\"min\" in rule && rule.min !== undefined) ||\n (\"max\" in rule && rule.max !== undefined)\n ) {\n const breakingBoundaryProperty = rule.failingBoundary\n ? rule.failingBoundary\n : rule.min\n ? \"min\"\n : \"max\";\n\n if (rule.identifier) {\n finalTranslationString = `${translateString}.${rule.identifier}.${breakingBoundaryProperty}`;\n } else {\n finalTranslationString = `${translateString}.${breakingBoundaryProperty}`;\n }\n } else if (rule.identifier) {\n finalTranslationString = `${translateString}.${rule.identifier}`;\n } else {\n finalTranslationString = translateString;\n }\n\n return shortVersion\n ? `${finalTranslationString}.short`\n : finalTranslationString;\n};\n\nexport const generateValidationTranslation = (\n r: Partial<RuleValidationResult>,\n shotVersion = false,\n): [string, Record<string, string | number | boolean> | undefined] => {\n const translationKey = generateTranslationString(r, shotVersion);\n\n if (r.ruleType === RuleType.char && r.chars) {\n return [\n translationKey,\n { ...r, chars: r.chars.map((c) => c.char).join(\"\") },\n ];\n }\n\n return [\n translationKey,\n r as unknown as Record<string, string | number | boolean> | undefined,\n ];\n};\n\nexport default generateValidationTranslation;\n"],"names":[],"mappings":";;;;;;;AAKA,MAAM,yBAAA,GAA4B,CAChC,IAAA,EACA,YAAA,GAAe,KAAA,KACJ;AACX,EAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,IAAA,OAAO,CAAA,WAAA,EAAc,KAAK,cAAc,CAAA,CAAA;AAAA,EAC1C;AACA,EAAA,MAAM,eAAA,GAAkB,CAAA,WAAA,EAAc,IAAA,CAAK,QAAA,IAAY,SAAS,CAAA,CAAA;AAChE,EAAA,IAAI,sBAAA,GAAyB,EAAA;AAE7B,EAAA,IACG,KAAA,IAAS,QAAQ,IAAA,CAAK,GAAA,KAAQ,UAC9B,KAAA,IAAS,IAAA,IAAQ,IAAA,CAAK,GAAA,KAAQ,MAAA,EAC/B;AACA,IAAA,MAAM,2BAA2B,IAAA,CAAK,eAAA,GAClC,KAAK,eAAA,GACL,IAAA,CAAK,MACH,KAAA,GACA,KAAA;AAEN,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,sBAAA,GAAyB,GAAG,eAAe,CAAA,CAAA,EAAI,IAAA,CAAK,UAAU,IAAI,wBAAwB,CAAA,CAAA;AAAA,IAC5F,CAAA,MAAO;AACL,MAAA,sBAAA,GAAyB,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,wBAAwB,CAAA,CAAA;AAAA,IACzE;AAAA,EACF,CAAA,MAAA,IAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,sBAAA,GAAyB,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,IAAA,CAAK,UAAU,CAAA,CAAA;AAAA,EAChE,CAAA,MAAO;AACL,IAAA,sBAAA,GAAyB,eAAA;AAAA,EAC3B;AAEA,EAAA,OAAO,YAAA,GACH,CAAA,EAAG,sBAAsB,CAAA,MAAA,CAAA,GACzB,sBAAA;AACN,CAAA;AAEO,MAAM,6BAAA,GAAgC,CAC3C,CAAA,EACA,WAAA,GAAc,KAAA,KACsD;AACpE,EAAA,MAAM,cAAA,GAAiB,yBAAA,CAA0B,CAAA,EAAG,WAAW,CAAA;AAE/D,EAAA,IAAI,CAAA,CAAE,QAAA,KAAa,QAAA,CAAS,IAAA,IAAQ,EAAE,KAAA,EAAO;AAC3C,IAAA,OAAO;AAAA,MACL,cAAA;AAAA,MACA,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,EAAE,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAAE,KACrD;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"generateValidationTranslation.mjs","sources":["../../../../../../../src/components/PasswordCreationField/lib/generateValidationTranslation.ts"],"sourcesContent":["import {\n RuleType,\n type RuleValidationResult,\n} from \"@/integrations/@mittwald/password-tools-js\";\n\nconst generateTranslationString = (\n rule: Partial<RuleValidationResult> & { translationKey?: string },\n shortVersion = false,\n): string => {\n if (rule.translationKey) {\n return `validation.${rule.translationKey}`;\n }\n const translateString = `validation.${rule.ruleType ?? \"general\"}`;\n let finalTranslationString = \"\";\n\n if (\n (\"min\" in rule && rule.min !== undefined) ||\n (\"max\" in rule && rule.max !== undefined)\n ) {\n const breakingBoundaryProperty = rule.failingBoundary\n ? rule.failingBoundary\n : rule.min\n ? \"min\"\n : \"max\";\n\n if (rule.identifier) {\n finalTranslationString = `${translateString}.${rule.identifier}.${breakingBoundaryProperty}`;\n } else {\n finalTranslationString = `${translateString}.${breakingBoundaryProperty}`;\n }\n } else if (rule.identifier) {\n finalTranslationString = `${translateString}.${rule.identifier}`;\n } else {\n finalTranslationString = translateString;\n }\n\n return shortVersion\n ? `${finalTranslationString}.short`\n : finalTranslationString;\n};\n\nexport const generateValidationTranslation = (\n r: Partial<RuleValidationResult>,\n shotVersion = false,\n): [string, Record<string, string | number | boolean> | undefined] => {\n const translationKey = generateTranslationString(r, shotVersion);\n\n if (r.ruleType === RuleType.char && r.chars) {\n return [\n translationKey,\n { ...r, chars: r.chars.map((c) => c.char).join(\"\") },\n ];\n }\n\n return [\n translationKey,\n r as unknown as Record<string, string | number | boolean> | undefined,\n ];\n};\n\nexport default generateValidationTranslation;\n"],"names":[],"mappings":";;;;;;AAKA,MAAM,yBAAA,GAA4B,CAChC,IAAA,EACA,YAAA,GAAe,KAAA,KACJ;AACX,EAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,IAAA,OAAO,CAAA,WAAA,EAAc,KAAK,cAAc,CAAA,CAAA;AAAA,EAC1C;AACA,EAAA,MAAM,eAAA,GAAkB,CAAA,WAAA,EAAc,IAAA,CAAK,QAAA,IAAY,SAAS,CAAA,CAAA;AAChE,EAAA,IAAI,sBAAA,GAAyB,EAAA;AAE7B,EAAA,IACG,KAAA,IAAS,QAAQ,IAAA,CAAK,GAAA,KAAQ,UAC9B,KAAA,IAAS,IAAA,IAAQ,IAAA,CAAK,GAAA,KAAQ,MAAA,EAC/B;AACA,IAAA,MAAM,2BAA2B,IAAA,CAAK,eAAA,GAClC,KAAK,eAAA,GACL,IAAA,CAAK,MACH,KAAA,GACA,KAAA;AAEN,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,sBAAA,GAAyB,GAAG,eAAe,CAAA,CAAA,EAAI,IAAA,CAAK,UAAU,IAAI,wBAAwB,CAAA,CAAA;AAAA,IAC5F,CAAA,MAAO;AACL,MAAA,sBAAA,GAAyB,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,wBAAwB,CAAA,CAAA;AAAA,IACzE;AAAA,EACF,CAAA,MAAA,IAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,sBAAA,GAAyB,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,IAAA,CAAK,UAAU,CAAA,CAAA;AAAA,EAChE,CAAA,MAAO;AACL,IAAA,sBAAA,GAAyB,eAAA;AAAA,EAC3B;AAEA,EAAA,OAAO,YAAA,GACH,CAAA,EAAG,sBAAsB,CAAA,MAAA,CAAA,GACzB,sBAAA;AACN,CAAA;AAEO,MAAM,6BAAA,GAAgC,CAC3C,CAAA,EACA,WAAA,GAAc,KAAA,KACsD;AACpE,EAAA,MAAM,cAAA,GAAiB,yBAAA,CAA0B,CAAA,EAAG,WAAW,CAAA;AAE/D,EAAA,IAAI,CAAA,CAAE,QAAA,KAAa,QAAA,CAAS,IAAA,IAAQ,EAAE,KAAA,EAAO;AAC3C,IAAA,OAAO;AAAA,MACL,cAAA;AAAA,MACA,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,EAAE,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAAE,KACrD;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -2,7 +2,6 @@
2
2
  /* */
3
3
  import '../../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
4
4
  import '@mittwald/password-tools-js/policy';
5
- import 'remeda';
6
5
  import 'react';
7
6
  import '@mittwald/password-tools-js/rules';
8
7
  import '@mittwald/password-tools-js/generator';
@@ -1 +1 @@
1
- {"version":3,"file":"getStateFromLatestPolicyValidationResult.mjs","sources":["../../../../../../../src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.ts"],"sourcesContent":["import { type RuleValidationResult } from \"@/integrations/@mittwald/password-tools-js\";\nimport type { ResolvedPolicyValidationResult } from \"@/components/PasswordCreationField/PasswordCreationField\";\n\nexport type StateFromLatestPolicyValidationResult =\n | undefined\n | Partial<RuleValidationResult>;\n\n/** @internal */\nexport const getStateFromLatestPolicyValidationResult = (\n isEmptyValue: boolean,\n result: ResolvedPolicyValidationResult,\n): StateFromLatestPolicyValidationResult => {\n if (result.ruleResults.length >= 1) {\n const failingRule = result.ruleResults.find((r) => !r.isValid);\n if (failingRule) {\n return failingRule;\n }\n }\n\n if (result.isValid === \"indeterminate\") {\n return undefined;\n }\n\n if (!isEmptyValue) {\n if (result.complexity.actual < result.complexity.min) {\n return {\n isValid: false,\n identifier: \"failingComplexity\",\n };\n }\n\n if (result.complexity.actual === result.complexity.min) {\n return {\n isValid: result.isValid,\n identifier: \"optimizeComplexity\",\n };\n }\n }\n\n return {\n isValid: true,\n identifier: \"securePassword\",\n };\n};\n\nexport default getStateFromLatestPolicyValidationResult;\n"],"names":[],"mappings":";;;;;;;AAQO,MAAM,wCAAA,GAA2C,CACtD,YAAA,EACA,MAAA,KAC0C;AAC1C,EAAA,IAAI,MAAA,CAAO,WAAA,CAAY,MAAA,IAAU,CAAA,EAAG;AAClC,IAAA,MAAM,WAAA,GAAc,OAAO,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAC,EAAE,OAAO,CAAA;AAC7D,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAO,WAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,YAAY,eAAA,EAAiB;AACtC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,IAAI,MAAA,CAAO,UAAA,CAAW,MAAA,GAAS,MAAA,CAAO,WAAW,GAAA,EAAK;AACpD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,UAAA,CAAW,MAAA,KAAW,MAAA,CAAO,WAAW,GAAA,EAAK;AACtD,MAAA,OAAO;AAAA,QACL,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY;AAAA,GACd;AACF;;;;"}
1
+ {"version":3,"file":"getStateFromLatestPolicyValidationResult.mjs","sources":["../../../../../../../src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.ts"],"sourcesContent":["import { type RuleValidationResult } from \"@/integrations/@mittwald/password-tools-js\";\nimport type { ResolvedPolicyValidationResult } from \"@/components/PasswordCreationField/PasswordCreationField\";\n\nexport type StateFromLatestPolicyValidationResult =\n | undefined\n | Partial<RuleValidationResult>;\n\n/** @internal */\nexport const getStateFromLatestPolicyValidationResult = (\n isEmptyValue: boolean,\n result: ResolvedPolicyValidationResult,\n): StateFromLatestPolicyValidationResult => {\n if (result.ruleResults.length >= 1) {\n const failingRule = result.ruleResults.find((r) => !r.isValid);\n if (failingRule) {\n return failingRule;\n }\n }\n\n if (result.isValid === \"indeterminate\") {\n return undefined;\n }\n\n if (!isEmptyValue) {\n if (result.complexity.actual < result.complexity.min) {\n return {\n isValid: false,\n identifier: \"failingComplexity\",\n };\n }\n\n if (result.complexity.actual === result.complexity.min) {\n return {\n isValid: result.isValid,\n identifier: \"optimizeComplexity\",\n };\n }\n }\n\n return {\n isValid: true,\n identifier: \"securePassword\",\n };\n};\n\nexport default getStateFromLatestPolicyValidationResult;\n"],"names":[],"mappings":";;;;;;AAQO,MAAM,wCAAA,GAA2C,CACtD,YAAA,EACA,MAAA,KAC0C;AAC1C,EAAA,IAAI,MAAA,CAAO,WAAA,CAAY,MAAA,IAAU,CAAA,EAAG;AAClC,IAAA,MAAM,WAAA,GAAc,OAAO,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAC,EAAE,OAAO,CAAA;AAC7D,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAO,WAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,YAAY,eAAA,EAAiB;AACtC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,IAAI,MAAA,CAAO,UAAA,CAAW,MAAA,GAAS,MAAA,CAAO,WAAW,GAAA,EAAK;AACpD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,UAAA,CAAW,MAAA,KAAW,MAAA,CAAO,WAAW,GAAA,EAAK;AACtD,MAAA,OAAO;AAAA,QACL,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY;AAAA,GACd;AACF;;;;"}
@@ -2,7 +2,6 @@
2
2
  /* */
3
3
  import '../../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
4
4
  import '@mittwald/password-tools-js/policy';
5
- import 'remeda';
6
5
  import 'react';
7
6
  import '@mittwald/password-tools-js/rules';
8
7
  import { Generator } from '@mittwald/password-tools-js/generator';
@@ -1 +1 @@
1
- {"version":3,"file":"generatePassword.mjs","sources":["../../../../../../../src/components/PasswordCreationField/worker/generatePassword.ts"],"sourcesContent":["import {\n Generator,\n type Policy,\n} from \"@/integrations/@mittwald/password-tools-js\";\n\nexport const generatePassword = async (\n validationPolicy: Policy,\n): Promise<string> => {\n return new Generator(validationPolicy).generatePassword();\n};\n"],"names":[],"mappings":";;;;;;;AAKO,MAAM,gBAAA,GAAmB,OAC9B,gBAAA,KACoB;AACpB,EAAA,OAAO,IAAI,SAAA,CAAU,gBAAgB,CAAA,CAAE,gBAAA,EAAiB;AAC1D;;;;"}
1
+ {"version":3,"file":"generatePassword.mjs","sources":["../../../../../../../src/components/PasswordCreationField/worker/generatePassword.ts"],"sourcesContent":["import {\n Generator,\n type Policy,\n} from \"@/integrations/@mittwald/password-tools-js\";\n\nexport const generatePassword = async (\n validationPolicy: Policy,\n): Promise<string> => {\n return new Generator(validationPolicy).generatePassword();\n};\n"],"names":[],"mappings":";;;;;;AAKO,MAAM,gBAAA,GAAmB,OAC9B,gBAAA,KACoB;AACpB,EAAA,OAAO,IAAI,SAAA,CAAU,gBAAgB,CAAA,CAAE,gBAAA,EAAiB;AAC1D;;;;"}
@@ -0,0 +1,38 @@
1
+ "use client"
2
+ /* */
3
+ import { Policy } from '@mittwald/password-tools-js/policy';
4
+ import { defaultPasswordCreationPolicy } from './defaultPasswordCreationPolicy.mjs';
5
+ import { useMemo, useRef } from 'react';
6
+ import '@mittwald/password-tools-js/rules';
7
+ import '@mittwald/password-tools-js/generator';
8
+
9
+ const usePasswordCreationFieldValidation = (genericValidationPolicy = defaultPasswordCreationPolicy) => {
10
+ const validationPolicy = useMemo(
11
+ () => Policy.fromDeclaration(genericValidationPolicy),
12
+ [genericValidationPolicy]
13
+ );
14
+ const cache = useRef(null);
15
+ return async (value) => {
16
+ if (value === "") {
17
+ return;
18
+ }
19
+ if (cache.current?.password === value) {
20
+ return cache.current.isValid;
21
+ }
22
+ try {
23
+ const validationResult = await validationPolicy.validate(value);
24
+ const isValid = await validationResult.isValid;
25
+ cache.current = {
26
+ password: value,
27
+ isValid
28
+ };
29
+ return isValid;
30
+ } catch (ignoredError) {
31
+ return false;
32
+ }
33
+ };
34
+ };
35
+ const generatePasswordCreationFieldValidation = usePasswordCreationFieldValidation;
36
+
37
+ export { generatePasswordCreationFieldValidation, usePasswordCreationFieldValidation };
38
+ //# sourceMappingURL=usePasswordCreationFieldValidation.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePasswordCreationFieldValidation.mjs","sources":["../../../../../../../src/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.ts"],"sourcesContent":["import type { PolicyGenericDeclaration } from \"@mittwald/password-tools-js/policy\";\nimport { Policy } from \"@mittwald/password-tools-js/policy\";\nimport { defaultPasswordCreationPolicy } from \".\";\nimport { useMemo, useRef } from \"react\";\nimport type { Validate } from \"react-hook-form\";\n\nexport const usePasswordCreationFieldValidation = (\n genericValidationPolicy: PolicyGenericDeclaration = defaultPasswordCreationPolicy,\n): Validate<string, unknown> => {\n const validationPolicy = useMemo(\n () => Policy.fromDeclaration(genericValidationPolicy),\n [genericValidationPolicy],\n );\n\n const cache = useRef<{\n password: string;\n isValid: boolean;\n } | null>(null);\n\n return async (value) => {\n if (value === \"\") {\n return;\n }\n\n if (cache.current?.password === value) {\n return cache.current.isValid;\n }\n\n try {\n const validationResult = await validationPolicy.validate(value);\n const isValid = await validationResult.isValid;\n\n cache.current = {\n password: value,\n isValid,\n };\n return isValid;\n } catch (ignoredError) {\n return false;\n }\n };\n};\n\n/** @deprecated Use `usePasswordCreationFieldValidation` instead. */\nexport const generatePasswordCreationFieldValidation =\n usePasswordCreationFieldValidation;\n"],"names":[],"mappings":";;;;;;AAMO,MAAM,kCAAA,GAAqC,CAChD,uBAAA,GAAoD,6BAAA,KACtB;AAC9B,EAAA,MAAM,gBAAA,GAAmB,OAAA;AAAA,IACvB,MAAM,MAAA,CAAO,eAAA,CAAgB,uBAAuB,CAAA;AAAA,IACpD,CAAC,uBAAuB;AAAA,GAC1B;AAEA,EAAA,MAAM,KAAA,GAAQ,OAGJ,IAAI,CAAA;AAEd,EAAA,OAAO,OAAO,KAAA,KAAU;AACtB,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,EAAS,QAAA,KAAa,KAAA,EAAO;AACrC,MAAA,OAAO,MAAM,OAAA,CAAQ,OAAA;AAAA,IACvB;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,gBAAA,GAAmB,MAAM,gBAAA,CAAiB,QAAA,CAAS,KAAK,CAAA;AAC9D,MAAA,MAAM,OAAA,GAAU,MAAM,gBAAA,CAAiB,OAAA;AAEvC,MAAA,KAAA,CAAM,OAAA,GAAU;AAAA,QACd,QAAA,EAAU,KAAA;AAAA,QACV;AAAA,OACF;AACA,MAAA,OAAO,OAAA;AAAA,IACT,SAAS,YAAA,EAAc;AACrB,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA;AACF;AAGO,MAAM,uCAAA,GACX;;;;"}
@@ -23,9 +23,8 @@ function Form(props) {
23
23
  const FormViewComponent = useMemo(() => FormView, [formId]);
24
24
  const formRef = useObjectRef(ref);
25
25
  const submitButtonRef = useRef(null);
26
- const submitHandlerResultRef = useRef(null);
27
26
  const isReadOnly = isReadOnlyFromProps || readonlyContextState;
28
- const { action, registerSubmitResult, callAfterSubmitFunction } = useRegisterActionStateContext(form);
27
+ const { action, registerSubmitResult } = useRegisterActionStateContext(form);
29
28
  const handleOnSubmit = (e) => {
30
29
  const { isSubmitting, isValidating } = form.control._formState;
31
30
  const formEvent = e && "nativeEvent" in e ? e : void 0;
@@ -41,7 +40,6 @@ function Form(props) {
41
40
  return result;
42
41
  });
43
42
  return submit(formEvent).finally(() => {
44
- callAfterSubmitFunction(submitHandlerResultRef.current);
45
43
  setReadOnlyContextState(false);
46
44
  });
47
45
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Form.mjs","sources":["../../../../../../../../src/integrations/react-hook-form/components/Form/Form.tsx"],"sourcesContent":["import { FormContextProvider } from \"@/integrations/react-hook-form/components/context/formContext\";\nimport {\n type ComponentProps,\n type FormEvent,\n type FormEventHandler,\n type PropsWithChildren,\n type RefObject,\n useId,\n useMemo,\n useState,\n useRef,\n type FC,\n} from \"react\";\nimport type {\n FieldValues,\n SubmitHandler,\n UseFormReturn,\n} from \"react-hook-form\";\nimport { FormProvider as RhfFormContextProvider } from \"react-hook-form\";\nimport { useObjectRef } from \"@react-aria/utils\";\nimport { useRegisterActionStateContext } from \"@/integrations/react-hook-form/components/Form/lib/useRegisterActionStateContext\";\n\nexport type FormOnSubmitHandler<F extends FieldValues> = SubmitHandler<F>;\n\ntype FormComponentType = FC<\n PropsWithChildren<{\n id: string;\n onSubmit?: FormEventHandler | FormOnSubmitHandler<never>;\n ref?: RefObject<HTMLFormElement | null>;\n }>\n>;\n\nexport interface FormProps<F extends FieldValues>\n extends Omit<ComponentProps<\"form\">, \"onSubmit\">,\n PropsWithChildren {\n form: UseFormReturn<F>;\n onSubmit: FormOnSubmitHandler<F>;\n formComponent?: FC<Omit<FormComponentType, \"ref\">>;\n isReadOnly?: boolean;\n}\n\nconst DefaultFormComponent: FormComponentType = (p) => <form {...p} />;\n\nexport function Form<F extends FieldValues>(props: FormProps<F>) {\n const {\n form,\n children,\n onSubmit,\n formComponent: FormView = DefaultFormComponent,\n isReadOnly: isReadOnlyFromProps,\n ref,\n ...formProps\n } = props;\n\n const [readonlyContextState, setReadOnlyContextState] =\n useState(!!isReadOnlyFromProps);\n\n const formId = useId();\n const FormViewComponent = useMemo(() => FormView, [formId]);\n\n const formRef = useObjectRef(ref);\n const submitButtonRef = useRef<HTMLButtonElement>(null);\n const submitHandlerResultRef = useRef<unknown>(null);\n\n const isReadOnly = isReadOnlyFromProps || readonlyContextState;\n\n const { action, registerSubmitResult, callAfterSubmitFunction } =\n useRegisterActionStateContext(form);\n\n const handleOnSubmit = (e?: FormEvent<HTMLFormElement> | F) => {\n const { isSubmitting, isValidating } = form.control._formState;\n const formEvent =\n e && \"nativeEvent\" in e ? (e as FormEvent<HTMLFormElement>) : undefined;\n\n formEvent?.stopPropagation();\n\n if (isSubmitting || isValidating) {\n formEvent?.preventDefault();\n return;\n }\n\n const submit = form.handleSubmit((values) => {\n setReadOnlyContextState(true);\n const result = onSubmit(values, formEvent);\n registerSubmitResult(result);\n return result;\n });\n\n return submit(formEvent).finally(() => {\n callAfterSubmitFunction(submitHandlerResultRef.current);\n setReadOnlyContextState(false);\n });\n };\n\n return (\n <RhfFormContextProvider {...form}>\n <FormContextProvider\n value={{\n form,\n id: formId,\n isReadOnly,\n setReadOnly: setReadOnlyContextState,\n submit: handleOnSubmit,\n submitButtonRef: submitButtonRef,\n formActionModel: action,\n }}\n >\n <FormViewComponent\n {...formProps}\n ref={formRef}\n id={formId}\n onSubmit={handleOnSubmit}\n >\n {children}\n </FormViewComponent>\n </FormContextProvider>\n </RhfFormContextProvider>\n );\n}\n\nexport default Form;\n"],"names":["RhfFormContextProvider"],"mappings":";;;;;;;AAyCA,MAAM,uBAA0C,CAAC,CAAA,qBAAM,GAAA,CAAC,MAAA,EAAA,EAAM,GAAG,CAAA,EAAG,CAAA;AAE7D,SAAS,KAA4B,KAAA,EAAqB;AAC/D,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,eAAe,QAAA,GAAW,oBAAA;AAAA,IAC1B,UAAA,EAAY,mBAAA;AAAA,IACZ,GAAA;AAAA,IACA,GAAG;AAAA,GACL,GAAI,KAAA;AAEJ,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,IAClD,QAAA,CAAS,CAAC,CAAC,mBAAmB,CAAA;AAEhC,EAAA,MAAM,SAAS,KAAA,EAAM;AACrB,EAAA,MAAM,oBAAoB,OAAA,CAAQ,MAAM,QAAA,EAAU,CAAC,MAAM,CAAC,CAAA;AAE1D,EAAA,MAAM,OAAA,GAAU,aAAa,GAAG,CAAA;AAChC,EAAA,MAAM,eAAA,GAAkB,OAA0B,IAAI,CAAA;AACtD,EAAA,MAAM,sBAAA,GAAyB,OAAgB,IAAI,CAAA;AAEnD,EAAA,MAAM,aAAa,mBAAA,IAAuB,oBAAA;AAE1C,EAAA,MAAM,EAAE,MAAA,EAAQ,oBAAA,EAAsB,uBAAA,EAAwB,GAC5D,8BAA8B,IAAI,CAAA;AAEpC,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAuC;AAC7D,IAAA,MAAM,EAAE,YAAA,EAAc,YAAA,EAAa,GAAI,KAAK,OAAA,CAAQ,UAAA;AACpD,IAAA,MAAM,SAAA,GACJ,CAAA,IAAK,aAAA,IAAiB,CAAA,GAAK,CAAA,GAAmC,MAAA;AAEhE,IAAA,SAAA,EAAW,eAAA,EAAgB;AAE3B,IAAA,IAAI,gBAAgB,YAAA,EAAc;AAChC,MAAA,SAAA,EAAW,cAAA,EAAe;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,CAAC,MAAA,KAAW;AAC3C,MAAA,uBAAA,CAAwB,IAAI,CAAA;AAC5B,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,EAAQ,SAAS,CAAA;AACzC,MAAA,oBAAA,CAAqB,MAAM,CAAA;AAC3B,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,OAAO,MAAA,CAAO,SAAS,CAAA,CAAE,OAAA,CAAQ,MAAM;AACrC,MAAA,uBAAA,CAAwB,uBAAuB,OAAO,CAAA;AACtD,MAAA,uBAAA,CAAwB,KAAK,CAAA;AAAA,IAC/B,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACE,GAAA,CAACA,YAAA,EAAA,EAAwB,GAAG,IAAA,EAC1B,QAAA,kBAAA,GAAA;AAAA,IAAC,mBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,IAAA;AAAA,QACA,EAAA,EAAI,MAAA;AAAA,QACJ,UAAA;AAAA,QACA,WAAA,EAAa,uBAAA;AAAA,QACb,MAAA,EAAQ,cAAA;AAAA,QACR,eAAA;AAAA,QACA,eAAA,EAAiB;AAAA,OACnB;AAAA,MAEA,QAAA,kBAAA,GAAA;AAAA,QAAC,iBAAA;AAAA,QAAA;AAAA,UACE,GAAG,SAAA;AAAA,UACJ,GAAA,EAAK,OAAA;AAAA,UACL,EAAA,EAAI,MAAA;AAAA,UACJ,QAAA,EAAU,cAAA;AAAA,UAET;AAAA;AAAA;AACH;AAAA,GACF,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"Form.mjs","sources":["../../../../../../../../src/integrations/react-hook-form/components/Form/Form.tsx"],"sourcesContent":["import { FormContextProvider } from \"@/integrations/react-hook-form/components/context/formContext\";\nimport {\n type ComponentProps,\n type FC,\n type FormEvent,\n type FormEventHandler,\n type PropsWithChildren,\n type RefObject,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n FieldValues,\n SubmitHandler,\n UseFormReturn,\n} from \"react-hook-form\";\nimport { FormProvider as RhfFormContextProvider } from \"react-hook-form\";\nimport { useObjectRef } from \"@react-aria/utils\";\nimport { useRegisterActionStateContext } from \"@/integrations/react-hook-form/components/Form/lib/useRegisterActionStateContext\";\n\nexport type FormOnSubmitHandler<F extends FieldValues> = SubmitHandler<F>;\n\ntype FormComponentType = FC<\n PropsWithChildren<{\n id: string;\n onSubmit?: FormEventHandler | FormOnSubmitHandler<never>;\n ref?: RefObject<HTMLFormElement | null>;\n }>\n>;\n\nexport interface FormProps<F extends FieldValues>\n extends Omit<ComponentProps<\"form\">, \"onSubmit\">,\n PropsWithChildren {\n form: UseFormReturn<F>;\n onSubmit: FormOnSubmitHandler<F>;\n formComponent?: FC<Omit<FormComponentType, \"ref\">>;\n isReadOnly?: boolean;\n}\n\nconst DefaultFormComponent: FormComponentType = (p) => <form {...p} />;\n\nexport function Form<F extends FieldValues>(props: FormProps<F>) {\n const {\n form,\n children,\n onSubmit,\n formComponent: FormView = DefaultFormComponent,\n isReadOnly: isReadOnlyFromProps,\n ref,\n ...formProps\n } = props;\n\n const [readonlyContextState, setReadOnlyContextState] =\n useState(!!isReadOnlyFromProps);\n\n const formId = useId();\n const FormViewComponent = useMemo(() => FormView, [formId]);\n\n const formRef = useObjectRef(ref);\n const submitButtonRef = useRef<HTMLButtonElement>(null);\n\n const isReadOnly = isReadOnlyFromProps || readonlyContextState;\n const { action, registerSubmitResult } = useRegisterActionStateContext(form);\n\n const handleOnSubmit = (e?: FormEvent<HTMLFormElement> | F) => {\n const { isSubmitting, isValidating } = form.control._formState;\n const formEvent =\n e && \"nativeEvent\" in e ? (e as FormEvent<HTMLFormElement>) : undefined;\n\n formEvent?.stopPropagation();\n\n if (isSubmitting || isValidating) {\n formEvent?.preventDefault();\n return;\n }\n\n const submit = form.handleSubmit((values) => {\n setReadOnlyContextState(true);\n const result = onSubmit(values, formEvent);\n registerSubmitResult(result);\n return result;\n });\n\n return submit(formEvent).finally(() => {\n setReadOnlyContextState(false);\n });\n };\n\n return (\n <RhfFormContextProvider {...form}>\n <FormContextProvider\n value={{\n form,\n id: formId,\n isReadOnly,\n setReadOnly: setReadOnlyContextState,\n submit: handleOnSubmit,\n submitButtonRef: submitButtonRef,\n formActionModel: action,\n }}\n >\n <FormViewComponent\n {...formProps}\n ref={formRef}\n id={formId}\n onSubmit={handleOnSubmit}\n >\n {children}\n </FormViewComponent>\n </FormContextProvider>\n </RhfFormContextProvider>\n );\n}\n\nexport default Form;\n"],"names":["RhfFormContextProvider"],"mappings":";;;;;;;AAyCA,MAAM,uBAA0C,CAAC,CAAA,qBAAM,GAAA,CAAC,MAAA,EAAA,EAAM,GAAG,CAAA,EAAG,CAAA;AAE7D,SAAS,KAA4B,KAAA,EAAqB;AAC/D,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,eAAe,QAAA,GAAW,oBAAA;AAAA,IAC1B,UAAA,EAAY,mBAAA;AAAA,IACZ,GAAA;AAAA,IACA,GAAG;AAAA,GACL,GAAI,KAAA;AAEJ,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,IAClD,QAAA,CAAS,CAAC,CAAC,mBAAmB,CAAA;AAEhC,EAAA,MAAM,SAAS,KAAA,EAAM;AACrB,EAAA,MAAM,oBAAoB,OAAA,CAAQ,MAAM,QAAA,EAAU,CAAC,MAAM,CAAC,CAAA;AAE1D,EAAA,MAAM,OAAA,GAAU,aAAa,GAAG,CAAA;AAChC,EAAA,MAAM,eAAA,GAAkB,OAA0B,IAAI,CAAA;AAEtD,EAAA,MAAM,aAAa,mBAAA,IAAuB,oBAAA;AAC1C,EAAA,MAAM,EAAE,MAAA,EAAQ,oBAAA,EAAqB,GAAI,8BAA8B,IAAI,CAAA;AAE3E,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAuC;AAC7D,IAAA,MAAM,EAAE,YAAA,EAAc,YAAA,EAAa,GAAI,KAAK,OAAA,CAAQ,UAAA;AACpD,IAAA,MAAM,SAAA,GACJ,CAAA,IAAK,aAAA,IAAiB,CAAA,GAAK,CAAA,GAAmC,MAAA;AAEhE,IAAA,SAAA,EAAW,eAAA,EAAgB;AAE3B,IAAA,IAAI,gBAAgB,YAAA,EAAc;AAChC,MAAA,SAAA,EAAW,cAAA,EAAe;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,CAAC,MAAA,KAAW;AAC3C,MAAA,uBAAA,CAAwB,IAAI,CAAA;AAC5B,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,EAAQ,SAAS,CAAA;AACzC,MAAA,oBAAA,CAAqB,MAAM,CAAA;AAC3B,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,OAAO,MAAA,CAAO,SAAS,CAAA,CAAE,OAAA,CAAQ,MAAM;AACrC,MAAA,uBAAA,CAAwB,KAAK,CAAA;AAAA,IAC/B,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACE,GAAA,CAACA,YAAA,EAAA,EAAwB,GAAG,IAAA,EAC1B,QAAA,kBAAA,GAAA;AAAA,IAAC,mBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,IAAA;AAAA,QACA,EAAA,EAAI,MAAA;AAAA,QACJ,UAAA;AAAA,QACA,WAAA,EAAa,uBAAA;AAAA,QACb,MAAA,EAAQ,cAAA;AAAA,QACR,eAAA;AAAA,QACA,eAAA,EAAiB;AAAA,OACnB;AAAA,MAEA,QAAA,kBAAA,GAAA;AAAA,QAAC,iBAAA;AAAA,QAAA;AAAA,UACE,GAAG,SAAA;AAAA,UACJ,GAAA,EAAK,OAAA;AAAA,UACL,EAAA,EAAI,MAAA;AAAA,UACJ,QAAA,EAAU,cAAA;AAAA,UAET;AAAA;AAAA;AACH;AAAA,GACF,EACF,CAAA;AAEJ;;;;"}
@@ -20,14 +20,20 @@ const useRegisterActionStateContext = (form) => {
20
20
  const action = ActionModel.useNew({});
21
21
  const trackedSubmitCount = useRef(0);
22
22
  const submitHandlerResultRef = useRef(null);
23
+ const currentActionState = action.state.useValue();
24
+ const lastActionState = useRef(currentActionState);
25
+ useEffect(() => {
26
+ if (currentActionState === "isIdle" && lastActionState.current === "isSucceeded") {
27
+ callAfterSubmitFunction(submitHandlerResultRef.current);
28
+ }
29
+ lastActionState.current = currentActionState;
30
+ }, [currentActionState]);
23
31
  useEffect(() => {
24
32
  return form.subscribe({
25
33
  formState: {
26
- errors: true,
27
- isValid: true
34
+ errors: true
28
35
  },
29
36
  callback: ({
30
- isValid,
31
37
  isSubmitted = false,
32
38
  isSubmitSuccessful = false,
33
39
  submitCount = 0,
@@ -43,9 +49,6 @@ const useRegisterActionStateContext = (form) => {
43
49
  if (isSubmitted) {
44
50
  if (isSubmitSuccessful) {
45
51
  void action.state.onSucceeded();
46
- if (isValid) {
47
- callAfterSubmitFunction(submitHandlerResultRef.current);
48
- }
49
52
  } else {
50
53
  const hasFailedWithError = isSubmitted && errors && Object.entries(errors).length > 0 ? errors : void 0;
51
54
  void action.state.onFailed(hasFailedWithError);
@@ -53,7 +56,7 @@ const useRegisterActionStateContext = (form) => {
53
56
  }
54
57
  }
55
58
  });
56
- }, [form.subscribe, action.state]);
59
+ }, [form.subscribe]);
57
60
  const registerSubmitResult = (result) => {
58
61
  if (isPromise(result)) {
59
62
  void action.state.onAsyncStart();
@@ -66,8 +69,7 @@ const useRegisterActionStateContext = (form) => {
66
69
  };
67
70
  return {
68
71
  action,
69
- registerSubmitResult,
70
- callAfterSubmitFunction
72
+ registerSubmitResult
71
73
  };
72
74
  };
73
75
 
@@ -1 +1 @@
1
- {"version":3,"file":"useRegisterActionStateContext.mjs","sources":["../../../../../../../../../src/integrations/react-hook-form/components/Form/lib/useRegisterActionStateContext.ts"],"sourcesContent":["import { ActionModel } from \"@/components/Action/models/ActionModel\";\nimport { useEffect, useRef } from \"react\";\nimport { isPromise } from \"remeda\";\nimport type { FieldValues, UseFormReturn } from \"react-hook-form\";\n\nconst callAfterSubmitFunction = (result: unknown) => {\n const callFn = (something: unknown) => {\n if (typeof something === \"function\") {\n something();\n }\n };\n\n if (result instanceof Promise) {\n result.then(callFn);\n } else {\n callFn(result);\n }\n};\n\nexport const useRegisterActionStateContext = <T extends FieldValues>(\n form: UseFormReturn<T>,\n) => {\n const action = ActionModel.useNew({});\n const trackedSubmitCount = useRef(0);\n const submitHandlerResultRef = useRef<unknown>(null);\n\n useEffect(() => {\n return form.subscribe({\n formState: {\n errors: true,\n isValid: true,\n },\n callback: ({\n isValid,\n isSubmitted = false,\n isSubmitSuccessful = false,\n submitCount = 0,\n errors,\n }) => {\n if (submitCount === 0 && trackedSubmitCount.current > 0) {\n trackedSubmitCount.current = 0;\n }\n\n if (trackedSubmitCount.current === submitCount) {\n return;\n }\n trackedSubmitCount.current = submitCount;\n\n if (isSubmitted) {\n if (isSubmitSuccessful) {\n void action.state.onSucceeded();\n\n if (isValid) {\n callAfterSubmitFunction(submitHandlerResultRef.current);\n }\n } else {\n const hasFailedWithError =\n isSubmitted && errors && Object.entries(errors).length > 0\n ? errors\n : undefined;\n\n void action.state.onFailed(hasFailedWithError);\n }\n }\n },\n });\n }, [form.subscribe, action.state]);\n\n const registerSubmitResult = (result: unknown) => {\n if (isPromise(result)) {\n void action.state.onAsyncStart();\n result.then((submitResult) => {\n submitHandlerResultRef.current = submitResult;\n });\n } else {\n submitHandlerResultRef.current = result;\n }\n };\n\n return {\n action,\n registerSubmitResult,\n callAfterSubmitFunction,\n } as const;\n};\n"],"names":[],"mappings":";;;;AAKA,MAAM,uBAAA,GAA0B,CAAC,MAAA,KAAoB;AACnD,EAAA,MAAM,MAAA,GAAS,CAAC,SAAA,KAAuB;AACrC,IAAA,IAAI,OAAO,cAAc,UAAA,EAAY;AACnC,MAAA,SAAA,EAAU;AAAA,IACZ;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,IAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,EACpB,CAAA,MAAO;AACL,IAAA,MAAA,CAAO,MAAM,CAAA;AAAA,EACf;AACF,CAAA;AAEO,MAAM,6BAAA,GAAgC,CAC3C,IAAA,KACG;AACH,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,MAAA,CAAO,EAAE,CAAA;AACpC,EAAA,MAAM,kBAAA,GAAqB,OAAO,CAAC,CAAA;AACnC,EAAA,MAAM,sBAAA,GAAyB,OAAgB,IAAI,CAAA;AAEnD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAO,KAAK,SAAA,CAAU;AAAA,MACpB,SAAA,EAAW;AAAA,QACT,MAAA,EAAQ,IAAA;AAAA,QACR,OAAA,EAAS;AAAA,OACX;AAAA,MACA,UAAU,CAAC;AAAA,QACT,OAAA;AAAA,QACA,WAAA,GAAc,KAAA;AAAA,QACd,kBAAA,GAAqB,KAAA;AAAA,QACrB,WAAA,GAAc,CAAA;AAAA,QACd;AAAA,OACF,KAAM;AACJ,QAAA,IAAI,WAAA,KAAgB,CAAA,IAAK,kBAAA,CAAmB,OAAA,GAAU,CAAA,EAAG;AACvD,UAAA,kBAAA,CAAmB,OAAA,GAAU,CAAA;AAAA,QAC/B;AAEA,QAAA,IAAI,kBAAA,CAAmB,YAAY,WAAA,EAAa;AAC9C,UAAA;AAAA,QACF;AACA,QAAA,kBAAA,CAAmB,OAAA,GAAU,WAAA;AAE7B,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,IAAI,kBAAA,EAAoB;AACtB,YAAA,KAAK,MAAA,CAAO,MAAM,WAAA,EAAY;AAE9B,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,uBAAA,CAAwB,uBAAuB,OAAO,CAAA;AAAA,YACxD;AAAA,UACF,CAAA,MAAO;AACL,YAAA,MAAM,kBAAA,GACJ,eAAe,MAAA,IAAU,MAAA,CAAO,QAAQ,MAAM,CAAA,CAAE,MAAA,GAAS,CAAA,GACrD,MAAA,GACA,MAAA;AAEN,YAAA,KAAK,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,kBAAkB,CAAA;AAAA,UAC/C;AAAA,QACF;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH,GAAG,CAAC,IAAA,CAAK,SAAA,EAAW,MAAA,CAAO,KAAK,CAAC,CAAA;AAEjC,EAAA,MAAM,oBAAA,GAAuB,CAAC,MAAA,KAAoB;AAChD,IAAA,IAAI,SAAA,CAAU,MAAM,CAAA,EAAG;AACrB,MAAA,KAAK,MAAA,CAAO,MAAM,YAAA,EAAa;AAC/B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAC,YAAA,KAAiB;AAC5B,QAAA,sBAAA,CAAuB,OAAA,GAAU,YAAA;AAAA,MACnC,CAAC,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,sBAAA,CAAuB,OAAA,GAAU,MAAA;AAAA,IACnC;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"useRegisterActionStateContext.mjs","sources":["../../../../../../../../../src/integrations/react-hook-form/components/Form/lib/useRegisterActionStateContext.ts"],"sourcesContent":["import { ActionModel } from \"@/components/Action/models/ActionModel\";\nimport { useEffect, useRef } from \"react\";\nimport { isPromise } from \"remeda\";\nimport type { FieldValues, UseFormReturn } from \"react-hook-form\";\n\nconst callAfterSubmitFunction = (result: unknown) => {\n const callFn = (something: unknown) => {\n if (typeof something === \"function\") {\n something();\n }\n };\n\n if (result instanceof Promise) {\n result.then(callFn);\n } else {\n callFn(result);\n }\n};\n\nexport const useRegisterActionStateContext = <T extends FieldValues>(\n form: UseFormReturn<T>,\n) => {\n const action = ActionModel.useNew({});\n const trackedSubmitCount = useRef(0);\n const submitHandlerResultRef = useRef<unknown>(null);\n\n const currentActionState = action.state.useValue();\n const lastActionState = useRef<string>(currentActionState);\n\n useEffect(() => {\n if (\n currentActionState === \"isIdle\" &&\n lastActionState.current === \"isSucceeded\"\n ) {\n callAfterSubmitFunction(submitHandlerResultRef.current);\n }\n lastActionState.current = currentActionState;\n }, [currentActionState]);\n\n useEffect(() => {\n return form.subscribe({\n formState: {\n errors: true,\n },\n callback: ({\n isSubmitted = false,\n isSubmitSuccessful = false,\n submitCount = 0,\n errors,\n }) => {\n if (submitCount === 0 && trackedSubmitCount.current > 0) {\n trackedSubmitCount.current = 0;\n }\n\n if (trackedSubmitCount.current === submitCount) {\n return;\n }\n trackedSubmitCount.current = submitCount;\n\n if (isSubmitted) {\n if (isSubmitSuccessful) {\n void action.state.onSucceeded();\n } else {\n const hasFailedWithError =\n isSubmitted && errors && Object.entries(errors).length > 0\n ? errors\n : undefined;\n\n void action.state.onFailed(hasFailedWithError);\n }\n }\n },\n });\n }, [form.subscribe]);\n\n const registerSubmitResult = (result: unknown) => {\n if (isPromise(result)) {\n void action.state.onAsyncStart();\n result.then((submitResult) => {\n submitHandlerResultRef.current = submitResult;\n });\n } else {\n submitHandlerResultRef.current = result;\n }\n };\n\n return {\n action,\n registerSubmitResult,\n } as const;\n};\n"],"names":[],"mappings":"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"}
@@ -23,35 +23,41 @@ import '../ResetButton/ResetButton.mjs';
23
23
  import { Action } from '../../../../components/Action/Action.mjs';
24
24
  import '@react-aria/live-announcer';
25
25
 
26
- const SubmitButton = flowComponent("SubmitButton", (props) => {
27
- const {
28
- children,
29
- ref,
30
- buttonComponent: ButtonComponent = Button,
31
- ...rest
32
- } = props;
33
- const {
34
- id: formId = props.form,
35
- formActionModel,
36
- submitButtonRef: submitButtonRefFromFormContext
37
- } = useFormContext();
38
- const ButtonViewComponent = useMemo(() => ButtonComponent, [formId]);
39
- const submitButtonRefFromProps = useObjectRef(ref);
40
- const submitButtonRef = useMergeRefs([
41
- submitButtonRefFromProps,
42
- submitButtonRefFromFormContext
43
- ]);
44
- return /* @__PURE__ */ jsx(Action, { actionModel: formActionModel, children: /* @__PURE__ */ jsx(
45
- ButtonViewComponent,
46
- {
47
- ...rest,
48
- ref: submitButtonRef,
49
- type: "submit",
50
- form: formId,
51
- children
52
- }
53
- ) });
54
- });
26
+ const SubmitButton = flowComponent(
27
+ "SubmitButton",
28
+ (props) => {
29
+ const {
30
+ children,
31
+ ref,
32
+ buttonComponent: ButtonComponent = Button,
33
+ ...rest
34
+ } = props;
35
+ const {
36
+ id: formId = props.form,
37
+ formActionModel,
38
+ submitButtonRef: submitButtonRefFromFormContext
39
+ } = useFormContext();
40
+ const ButtonViewComponent = useMemo(() => ButtonComponent, [formId]);
41
+ const submitButtonRefFromProps = useObjectRef(ref);
42
+ const submitButtonRef = useMergeRefs([
43
+ submitButtonRefFromProps,
44
+ submitButtonRefFromFormContext
45
+ ]);
46
+ return /* @__PURE__ */ jsx(Action, { actionModel: formActionModel, children: /* @__PURE__ */ jsx(
47
+ ButtonViewComponent,
48
+ {
49
+ ...rest,
50
+ ref: submitButtonRef,
51
+ type: "submit",
52
+ form: formId,
53
+ children
54
+ }
55
+ ) });
56
+ },
57
+ {
58
+ type: "provider"
59
+ }
60
+ );
55
61
 
56
62
  export { SubmitButton, SubmitButton as default };
57
63
  //# sourceMappingURL=SubmitButton.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"SubmitButton.mjs","sources":["../../../../../../../../src/integrations/react-hook-form/components/SubmitButton/SubmitButton.tsx"],"sourcesContent":["import { Button, type ButtonProps } from \"@/components/Button\";\nimport { flowComponent } from \"@/lib/componentFactory/flowComponent\";\nimport { useFormContext } from \"@/integrations/react-hook-form\";\nimport { Action } from \"@/components/Action\";\nimport { useObjectRef } from \"@react-aria/utils\";\nimport { useMergeRefs } from \"use-callback-ref\";\nimport { type FC, useMemo } from \"react\";\n\nexport type SubmitButtonProps = Omit<\n ButtonProps,\n \"isFailed\" | \"isSucceeded\" | \"isPending\" | \"isReadOnly\" | \"type\"\n> & {\n buttonComponent?: FC<Omit<ButtonProps, \"ref\">>;\n};\n\nexport const SubmitButton = flowComponent(\"SubmitButton\", (props) => {\n const {\n children,\n ref,\n buttonComponent: ButtonComponent = Button,\n ...rest\n } = props;\n\n const {\n id: formId = props.form,\n formActionModel,\n submitButtonRef: submitButtonRefFromFormContext,\n } = useFormContext();\n const ButtonViewComponent = useMemo(() => ButtonComponent, [formId]);\n\n const submitButtonRefFromProps = useObjectRef(ref);\n const submitButtonRef = useMergeRefs([\n submitButtonRefFromProps,\n submitButtonRefFromFormContext,\n ]);\n\n return (\n <Action actionModel={formActionModel}>\n <ButtonViewComponent\n {...rest}\n ref={submitButtonRef}\n type=\"submit\"\n form={formId}\n >\n {children}\n </ButtonViewComponent>\n </Action>\n );\n});\n\nexport default SubmitButton;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAeO,MAAM,YAAA,GAAe,aAAA,CAAc,cAAA,EAAgB,CAAC,KAAA,KAAU;AACnE,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,GAAA;AAAA,IACA,iBAAiB,eAAA,GAAkB,MAAA;AAAA,IACnC,GAAG;AAAA,GACL,GAAI,KAAA;AAEJ,EAAA,MAAM;AAAA,IACJ,EAAA,EAAI,SAAS,KAAA,CAAM,IAAA;AAAA,IACnB,eAAA;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,cAAA,EAAe;AACnB,EAAA,MAAM,sBAAsB,OAAA,CAAQ,MAAM,eAAA,EAAiB,CAAC,MAAM,CAAC,CAAA;AAEnE,EAAA,MAAM,wBAAA,GAA2B,aAAa,GAAG,CAAA;AACjD,EAAA,MAAM,kBAAkB,YAAA,CAAa;AAAA,IACnC,wBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAO,WAAA,EAAa,eAAA,EACnB,QAAA,kBAAA,GAAA;AAAA,IAAC,mBAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,GAAA,EAAK,eAAA;AAAA,MACL,IAAA,EAAK,QAAA;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MAEL;AAAA;AAAA,GACH,EACF,CAAA;AAEJ,CAAC;;;;"}
1
+ {"version":3,"file":"SubmitButton.mjs","sources":["../../../../../../../../src/integrations/react-hook-form/components/SubmitButton/SubmitButton.tsx"],"sourcesContent":["import { Button, type ButtonProps } from \"@/components/Button\";\nimport { flowComponent } from \"@/lib/componentFactory/flowComponent\";\nimport { useFormContext } from \"@/integrations/react-hook-form\";\nimport { Action } from \"@/components/Action\";\nimport { useObjectRef } from \"@react-aria/utils\";\nimport { useMergeRefs } from \"use-callback-ref\";\nimport { type FC, useMemo } from \"react\";\n\nexport type SubmitButtonProps = Omit<\n ButtonProps,\n \"isFailed\" | \"isSucceeded\" | \"isPending\" | \"isReadOnly\" | \"type\"\n> & {\n buttonComponent?: FC<Omit<ButtonProps, \"ref\">>;\n};\n\nexport const SubmitButton = flowComponent(\n \"SubmitButton\",\n (props) => {\n const {\n children,\n ref,\n buttonComponent: ButtonComponent = Button,\n ...rest\n } = props;\n\n const {\n id: formId = props.form,\n formActionModel,\n submitButtonRef: submitButtonRefFromFormContext,\n } = useFormContext();\n const ButtonViewComponent = useMemo(() => ButtonComponent, [formId]);\n\n const submitButtonRefFromProps = useObjectRef(ref);\n const submitButtonRef = useMergeRefs([\n submitButtonRefFromProps,\n submitButtonRefFromFormContext,\n ]);\n\n return (\n <Action actionModel={formActionModel}>\n <ButtonViewComponent\n {...rest}\n ref={submitButtonRef}\n type=\"submit\"\n form={formId}\n >\n {children}\n </ButtonViewComponent>\n </Action>\n );\n },\n {\n type: \"provider\",\n },\n);\n\nexport default SubmitButton;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAeO,MAAM,YAAA,GAAe,aAAA;AAAA,EAC1B,cAAA;AAAA,EACA,CAAC,KAAA,KAAU;AACT,IAAA,MAAM;AAAA,MACJ,QAAA;AAAA,MACA,GAAA;AAAA,MACA,iBAAiB,eAAA,GAAkB,MAAA;AAAA,MACnC,GAAG;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,MAAM;AAAA,MACJ,EAAA,EAAI,SAAS,KAAA,CAAM,IAAA;AAAA,MACnB,eAAA;AAAA,MACA,eAAA,EAAiB;AAAA,QACf,cAAA,EAAe;AACnB,IAAA,MAAM,sBAAsB,OAAA,CAAQ,MAAM,eAAA,EAAiB,CAAC,MAAM,CAAC,CAAA;AAEnE,IAAA,MAAM,wBAAA,GAA2B,aAAa,GAAG,CAAA;AACjD,IAAA,MAAM,kBAAkB,YAAA,CAAa;AAAA,MACnC,wBAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAO,WAAA,EAAa,eAAA,EACnB,QAAA,kBAAA,GAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACE,GAAG,IAAA;AAAA,QACJ,GAAA,EAAK,eAAA;AAAA,QACL,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAM,MAAA;AAAA,QAEL;AAAA;AAAA,KACH,EACF,CAAA;AAAA,EAEJ,CAAA;AAAA,EACA;AAAA,IACE,IAAA,EAAM;AAAA;AAEV;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Default.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/ActionGroup/stories/Default.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,WAAW,MAAM,gBAAgB,CAAC;AAUzC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAelC,CAAC;AAEF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AAE1C,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC;AAEjC,eAAO,MAAM,MAAM,EAAE,KASpB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,KAMlB,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,KAcjC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,KAiBtC,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAEpB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAOtB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAa/B,CAAC"}
1
+ {"version":3,"file":"Default.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/ActionGroup/stories/Default.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,WAAW,MAAM,gBAAgB,CAAC;AAUzC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAelC,CAAC;AAEF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AAE1C,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC;AAEjC,eAAO,MAAM,MAAM,EAAE,KASpB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,KAMlB,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,KAcjC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,KAiBtC,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAEpB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAOtB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAc/B,CAAC"}
@@ -1,5 +1,5 @@
1
1
  export * from './defaultPasswordCreationPolicy';
2
- export * from './generatePasswordCreationFieldValidation';
2
+ export * from './usePasswordCreationFieldValidation';
3
3
  export type * from '@mittwald/password-tools-js/policy';
4
4
  export { Policy } from '@mittwald/password-tools-js/policy';
5
5
  export type * from '@mittwald/password-tools-js/rules';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/integrations/@mittwald/password-tools-js/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC;AAChD,cAAc,2CAA2C,CAAC;AAE1D,mBAAmB,oCAAoC,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAE5D,mBAAmB,mCAAmC,CAAC;AACvD,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,UAAU,EACV,QAAQ,GACT,MAAM,mCAAmC,CAAC;AAE3C,mBAAmB,uCAAuC,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/integrations/@mittwald/password-tools-js/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AAErD,mBAAmB,oCAAoC,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAE5D,mBAAmB,mCAAmC,CAAC;AACvD,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,UAAU,EACV,QAAQ,GACT,MAAM,mCAAmC,CAAC;AAE3C,mBAAmB,uCAAuC,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { PolicyGenericDeclaration } from '@mittwald/password-tools-js/policy';
2
+ import { Validate } from 'react-hook-form';
3
+ export declare const usePasswordCreationFieldValidation: (genericValidationPolicy?: PolicyGenericDeclaration) => Validate<string, unknown>;
4
+ /** @deprecated Use `usePasswordCreationFieldValidation` instead. */
5
+ export declare const generatePasswordCreationFieldValidation: (genericValidationPolicy?: PolicyGenericDeclaration) => Validate<string, unknown>;
6
+ //# sourceMappingURL=usePasswordCreationFieldValidation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePasswordCreationFieldValidation.d.ts","sourceRoot":"","sources":["../../../../../src/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAInF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,eAAO,MAAM,kCAAkC,GAC7C,0BAAyB,wBAAwD,KAChF,QAAQ,CAAC,MAAM,EAAE,OAAO,CAiC1B,CAAC;AAEF,oEAAoE;AACpE,eAAO,MAAM,uCAAuC,6BArCzB,wBAAwB,KAChD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAqCS,CAAC"}
@@ -1,4 +1,4 @@
1
- import { ComponentProps, FormEventHandler, PropsWithChildren, RefObject, FC } from 'react';
1
+ import { ComponentProps, FC, FormEventHandler, PropsWithChildren, RefObject } from 'react';
2
2
  import { FieldValues, SubmitHandler, UseFormReturn } from 'react-hook-form';
3
3
  export type FormOnSubmitHandler<F extends FieldValues> = SubmitHandler<F>;
4
4
  type FormComponentType = FC<PropsWithChildren<{
@@ -1 +1 @@
1
- {"version":3,"file":"Form.d.ts","sourceRoot":"","sources":["../../../../../../src/integrations/react-hook-form/components/Form/Form.tsx"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,SAAS,EAKd,KAAK,EAAE,EACR,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,aAAa,EACd,MAAM,iBAAiB,CAAC;AAKzB,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,WAAW,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;AAE1E,KAAK,iBAAiB,GAAG,EAAE,CACzB,iBAAiB,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,gBAAgB,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACzD,GAAG,CAAC,EAAE,SAAS,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;CACzC,CAAC,CACH,CAAC;AAEF,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,WAAW,CAC9C,SAAQ,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,EAC9C,iBAAiB;IACnB,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IACvB,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;IACjC,aAAa,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC;IACnD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAID,wBAAgB,IAAI,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,2CA2E9D;AAED,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"Form.d.ts","sourceRoot":"","sources":["../../../../../../src/integrations/react-hook-form/components/Form/Form.tsx"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,EAAE,EAEP,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,SAAS,EAKf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,aAAa,EACd,MAAM,iBAAiB,CAAC;AAKzB,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,WAAW,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;AAE1E,KAAK,iBAAiB,GAAG,EAAE,CACzB,iBAAiB,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,gBAAgB,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACzD,GAAG,CAAC,EAAE,SAAS,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;CACzC,CAAC,CACH,CAAC;AAEF,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,WAAW,CAC9C,SAAQ,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,EAC9C,iBAAiB;IACnB,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IACvB,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;IACjC,aAAa,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC;IACnD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAID,wBAAgB,IAAI,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,2CAuE9D;AAED,eAAe,IAAI,CAAC"}
@@ -3,6 +3,5 @@ import { FieldValues, UseFormReturn } from 'react-hook-form';
3
3
  export declare const useRegisterActionStateContext: <T extends FieldValues>(form: UseFormReturn<T>) => {
4
4
  readonly action: ActionModel;
5
5
  readonly registerSubmitResult: (result: unknown) => void;
6
- readonly callAfterSubmitFunction: (result: unknown) => void;
7
6
  };
8
7
  //# sourceMappingURL=useRegisterActionStateContext.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useRegisterActionStateContext.d.ts","sourceRoot":"","sources":["../../../../../../../src/integrations/react-hook-form/components/Form/lib/useRegisterActionStateContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAGrE,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAgBlE,eAAO,MAAM,6BAA6B,GAAI,CAAC,SAAS,WAAW,EACjE,MAAM,aAAa,CAAC,CAAC,CAAC;;4CAgDgB,OAAO;+CA/DN,OAAO;CA+E/C,CAAC"}
1
+ {"version":3,"file":"useRegisterActionStateContext.d.ts","sourceRoot":"","sources":["../../../../../../../src/integrations/react-hook-form/components/Form/lib/useRegisterActionStateContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAGrE,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAgBlE,eAAO,MAAM,6BAA6B,GAAI,CAAC,SAAS,WAAW,EACjE,MAAM,aAAa,CAAC,CAAC,CAAC;;4CAuDgB,OAAO;CAe9C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"SubmitButton.d.ts","sourceRoot":"","sources":["../../../../../../src/integrations/react-hook-form/components/SubmitButton/SubmitButton.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAM/D,OAAO,EAAE,KAAK,EAAE,EAAW,MAAM,OAAO,CAAC;AAEzC,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAClC,WAAW,EACX,UAAU,GAAG,aAAa,GAAG,WAAW,GAAG,YAAY,GAAG,MAAM,CACjE,GAAG;IACF,eAAe,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;CAChD,CAAC;AAEF,eAAO,MAAM,YAAY;sBAHL,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;qDAoC9C,CAAC;AAEH,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"SubmitButton.d.ts","sourceRoot":"","sources":["../../../../../../src/integrations/react-hook-form/components/SubmitButton/SubmitButton.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAM/D,OAAO,EAAE,KAAK,EAAE,EAAW,MAAM,OAAO,CAAC;AAEzC,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAClC,WAAW,EACX,UAAU,GAAG,aAAa,GAAG,WAAW,GAAG,YAAY,GAAG,MAAM,CACjE,GAAG;IACF,eAAe,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;CAChD,CAAC;AAEF,eAAO,MAAM,YAAY;sBAHL,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;qDA0C/C,CAAC;AAEF,eAAe,YAAY,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mittwald/flow-react-components",
3
- "version": "0.2.0-alpha.564",
3
+ "version": "0.2.0-alpha.565",
4
4
  "type": "module",
5
5
  "description": "A React implementation of Flow, mittwald’s design system",
6
6
  "homepage": "https://mittwald.github.io/flow",
@@ -58,7 +58,7 @@
58
58
  "dependencies": {
59
59
  "@internationalized/string-compiler": "^3.2.6",
60
60
  "@mittwald/password-tools-js": "3.0.0-alpha.18",
61
- "@mittwald/react-tunnel": "0.2.0-alpha.564",
61
+ "@mittwald/react-tunnel": "0.2.0-alpha.565",
62
62
  "@mittwald/react-use-promise": "^4.2.2",
63
63
  "@react-aria/form": "^3.1.2",
64
64
  "@react-aria/live-announcer": "^3.4.4",
@@ -102,7 +102,7 @@
102
102
  "@faker-js/faker": "^10.1.0",
103
103
  "@internationalized/date": "^3.10.0",
104
104
  "@mittwald/flow-core": "",
105
- "@mittwald/flow-design-tokens": "0.2.0-alpha.564",
105
+ "@mittwald/flow-design-tokens": "0.2.0-alpha.565",
106
106
  "@mittwald/react-use-promise": "^4.2.2",
107
107
  "@mittwald/remote-dom-react": "1.2.2-mittwald.10",
108
108
  "@mittwald/typescript-config": "",
@@ -175,5 +175,5 @@
175
175
  "optional": true
176
176
  }
177
177
  },
178
- "gitHead": "1e0f5a717caad12c1fe129ce3da59eb1638294d0"
178
+ "gitHead": "62c124282d69a0605982827341c9a1749edd96f1"
179
179
  }
@@ -1,32 +0,0 @@
1
- "use client"
2
- /* */
3
- import { Policy } from '@mittwald/password-tools-js/policy';
4
- import { defaultPasswordCreationPolicy } from './defaultPasswordCreationPolicy.mjs';
5
- import { isPromise } from 'remeda';
6
- import { useMemo } from 'react';
7
- import '@mittwald/password-tools-js/rules';
8
- import '@mittwald/password-tools-js/generator';
9
-
10
- const generatePasswordCreationFieldValidation = (genericValidationPolicy = defaultPasswordCreationPolicy) => {
11
- const validationPolicy = useMemo(
12
- () => Policy.fromDeclaration(genericValidationPolicy),
13
- [genericValidationPolicy]
14
- );
15
- return async (value) => {
16
- if (!value) {
17
- return true;
18
- }
19
- try {
20
- const validationResult = await validationPolicy.validate(value);
21
- if (isPromise(validationResult.isValid)) {
22
- return await validationResult.isValid;
23
- }
24
- return validationResult.isValid;
25
- } catch (ignoredError) {
26
- return false;
27
- }
28
- };
29
- };
30
-
31
- export { generatePasswordCreationFieldValidation };
32
- //# sourceMappingURL=generatePasswordCreationFieldValidation.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generatePasswordCreationFieldValidation.mjs","sources":["../../../../../../../src/integrations/@mittwald/password-tools-js/generatePasswordCreationFieldValidation.ts"],"sourcesContent":["import type { PolicyGenericDeclaration } from \"@mittwald/password-tools-js/policy\";\nimport { Policy } from \"@mittwald/password-tools-js/policy\";\nimport { defaultPasswordCreationPolicy } from \"./\";\nimport { isPromise } from \"remeda\";\nimport { useMemo } from \"react\";\n\nexport const generatePasswordCreationFieldValidation = (\n genericValidationPolicy: PolicyGenericDeclaration = defaultPasswordCreationPolicy,\n) => {\n const validationPolicy = useMemo(\n () => Policy.fromDeclaration(genericValidationPolicy),\n [genericValidationPolicy],\n );\n\n return async (value: string) => {\n if (!value) {\n return true;\n }\n\n try {\n const validationResult = await validationPolicy.validate(value);\n\n if (isPromise(validationResult.isValid)) {\n return await validationResult.isValid;\n }\n\n return validationResult.isValid;\n } catch (ignoredError) {\n return false;\n }\n };\n};\n"],"names":[],"mappings":";;;;;;;AAMO,MAAM,uCAAA,GAA0C,CACrD,uBAAA,GAAoD,6BAAA,KACjD;AACH,EAAA,MAAM,gBAAA,GAAmB,OAAA;AAAA,IACvB,MAAM,MAAA,CAAO,eAAA,CAAgB,uBAAuB,CAAA;AAAA,IACpD,CAAC,uBAAuB;AAAA,GAC1B;AAEA,EAAA,OAAO,OAAO,KAAA,KAAkB;AAC9B,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,gBAAA,GAAmB,MAAM,gBAAA,CAAiB,QAAA,CAAS,KAAK,CAAA;AAE9D,MAAA,IAAI,SAAA,CAAU,gBAAA,CAAiB,OAAO,CAAA,EAAG;AACvC,QAAA,OAAO,MAAM,gBAAA,CAAiB,OAAA;AAAA,MAChC;AAEA,MAAA,OAAO,gBAAA,CAAiB,OAAA;AAAA,IAC1B,SAAS,YAAA,EAAc;AACrB,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA;AACF;;;;"}
@@ -1,3 +0,0 @@
1
- import { PolicyGenericDeclaration } from '@mittwald/password-tools-js/policy';
2
- export declare const generatePasswordCreationFieldValidation: (genericValidationPolicy?: PolicyGenericDeclaration) => (value: string) => Promise<boolean>;
3
- //# sourceMappingURL=generatePasswordCreationFieldValidation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generatePasswordCreationFieldValidation.d.ts","sourceRoot":"","sources":["../../../../../src/integrations/@mittwald/password-tools-js/generatePasswordCreationFieldValidation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAMnF,eAAO,MAAM,uCAAuC,GAClD,0BAAyB,wBAAwD,MAOnE,OAAO,MAAM,qBAiB5B,CAAC"}