@jobber/components-native 0.5.0 → 0.6.0

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 (27) hide show
  1. package/dist/src/ErrorMessageWrapper/ErrorMessageWrapper.js +41 -0
  2. package/dist/src/ErrorMessageWrapper/ErrorMessageWrapper.style.js +31 -0
  3. package/dist/src/ErrorMessageWrapper/context/ErrorMessageContext.js +11 -0
  4. package/dist/src/ErrorMessageWrapper/context/ErrorMessageProvider.js +38 -0
  5. package/dist/src/ErrorMessageWrapper/context/index.js +2 -0
  6. package/dist/src/ErrorMessageWrapper/context/types.js +1 -0
  7. package/dist/src/ErrorMessageWrapper/index.js +2 -0
  8. package/dist/src/index.js +1 -0
  9. package/dist/tsconfig.tsbuildinfo +1 -1
  10. package/dist/types/src/ErrorMessageWrapper/ErrorMessageWrapper.d.ts +21 -0
  11. package/dist/types/src/ErrorMessageWrapper/ErrorMessageWrapper.style.d.ts +29 -0
  12. package/dist/types/src/ErrorMessageWrapper/context/ErrorMessageContext.d.ts +4 -0
  13. package/dist/types/src/ErrorMessageWrapper/context/ErrorMessageProvider.d.ts +6 -0
  14. package/dist/types/src/ErrorMessageWrapper/context/index.d.ts +2 -0
  15. package/dist/types/src/ErrorMessageWrapper/context/types.d.ts +62 -0
  16. package/dist/types/src/ErrorMessageWrapper/index.d.ts +2 -0
  17. package/dist/types/src/index.d.ts +1 -0
  18. package/package.json +4 -2
  19. package/src/ErrorMessageWrapper/ErrorMessageWrapper.style.ts +32 -0
  20. package/src/ErrorMessageWrapper/ErrorMessageWrapper.test.tsx +48 -0
  21. package/src/ErrorMessageWrapper/ErrorMessageWrapper.tsx +88 -0
  22. package/src/ErrorMessageWrapper/context/ErrorMessageContext.tsx +15 -0
  23. package/src/ErrorMessageWrapper/context/ErrorMessageProvider.tsx +71 -0
  24. package/src/ErrorMessageWrapper/context/index.ts +2 -0
  25. package/src/ErrorMessageWrapper/context/types.ts +71 -0
  26. package/src/ErrorMessageWrapper/index.ts +6 -0
  27. package/src/index.ts +1 -0
@@ -0,0 +1,41 @@
1
+ import React, { useEffect, useRef } from "react";
2
+ import { View } from "react-native";
3
+ import { v4 } from "react-native-uuid";
4
+ import { useErrorMessageContext } from "./context";
5
+ import { styles } from "./ErrorMessageWrapper.style";
6
+ import { Icon } from "../Icon";
7
+ import { Text } from "../Text";
8
+ const wrapForStyle = {
9
+ card: styles.wrapForCard,
10
+ default: undefined,
11
+ };
12
+ /**
13
+ * Adds an error message below the children but ensure the message gets read
14
+ * out first.
15
+ *
16
+ * This component is internal to Atlantis and shouldn't be used outside of it.
17
+ */
18
+ export function ErrorMessageWrapper({ message, wrapFor = "default", children, }) {
19
+ const errorMessageContext = useErrorMessageContext();
20
+ const register = errorMessageContext === null || errorMessageContext === void 0 ? void 0 : errorMessageContext.register;
21
+ const unregister = errorMessageContext === null || errorMessageContext === void 0 ? void 0 : errorMessageContext.unregister;
22
+ const a11yMessageRef = useRef(null);
23
+ const { current: uuid } = useRef(v4());
24
+ const hasErrorMessage = Boolean(message);
25
+ useEffect(() => {
26
+ if (register) {
27
+ register({ id: uuid, ref: a11yMessageRef, hasErrorMessage });
28
+ }
29
+ if (unregister) {
30
+ return () => unregister(uuid);
31
+ }
32
+ }, [uuid, hasErrorMessage, register, unregister]);
33
+ return (React.createElement(View, { style: [styles.wrapper] },
34
+ hasErrorMessage && (React.createElement(View, { ref: a11yMessageRef, accessible: true, accessibilityRole: "text", accessibilityLabel: message, pointerEvents: "none", style: styles.screenReaderMessage })),
35
+ children,
36
+ hasErrorMessage && (React.createElement(View, { style: [styles.messageWrapper, wrapForStyle[wrapFor]] },
37
+ React.createElement(View, { style: styles.messageWrapperIcon },
38
+ React.createElement(Icon, { name: "alert", size: "small", color: "critical" })),
39
+ React.createElement(View, { style: styles.messageWrapperContent },
40
+ React.createElement(Text, { variation: "error", level: "textSupporting", hideFromScreenReader: true }, message))))));
41
+ }
@@ -0,0 +1,31 @@
1
+ import { StyleSheet } from "react-native";
2
+ import { tokens } from "../utils/design";
3
+ export const styles = StyleSheet.create({
4
+ wrapper: {
5
+ position: "relative",
6
+ width: "100%",
7
+ },
8
+ wrapForCard: {
9
+ paddingHorizontal: tokens["space-base"],
10
+ paddingVertical: tokens["space-small"],
11
+ },
12
+ messageWrapper: {
13
+ flexDirection: "row",
14
+ },
15
+ messageWrapperIcon: {
16
+ flex: 0,
17
+ flexBasis: "auto",
18
+ paddingTop: tokens["space-minuscule"],
19
+ paddingRight: tokens["space-smaller"],
20
+ },
21
+ messageWrapperContent: {
22
+ flex: 1,
23
+ },
24
+ screenReaderMessage: {
25
+ position: "absolute",
26
+ top: 0,
27
+ left: 0,
28
+ width: "100%",
29
+ height: "100%",
30
+ },
31
+ });
@@ -0,0 +1,11 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ import { createContext, useContext } from "react";
3
+ const defaultValues = {
4
+ elements: {},
5
+ register: _ => undefined,
6
+ unregister: _ => undefined,
7
+ };
8
+ export const ErrorMessageContext = createContext(defaultValues);
9
+ export function useErrorMessageContext() {
10
+ return useContext(ErrorMessageContext);
11
+ }
@@ -0,0 +1,38 @@
1
+ import React, { useState } from "react";
2
+ import { AccessibilityInfo, findNodeHandle, } from "react-native";
3
+ import { ErrorMessageContext } from "./ErrorMessageContext";
4
+ export function ErrorMessageProvider({ children, }) {
5
+ const [elements, setElements] = useState({});
6
+ return (React.createElement(ErrorMessageContext.Provider, { value: {
7
+ elements,
8
+ register: handleRegister,
9
+ unregister: handleUnregister,
10
+ } }, children));
11
+ function handleRegister({ id, ref, hasErrorMessage, }) {
12
+ elements[id] = {
13
+ measure: getMeasure(ref),
14
+ accessibilityFocus: getAccessibilityFocus(ref),
15
+ hasErrorMessage,
16
+ };
17
+ setElements(elements);
18
+ }
19
+ function handleUnregister(id) {
20
+ delete elements[id];
21
+ setElements(elements);
22
+ }
23
+ }
24
+ function getMeasure(ref) {
25
+ return function measure(...args) {
26
+ var _a;
27
+ (_a = ref.current) === null || _a === void 0 ? void 0 : _a.measureLayout(...args);
28
+ };
29
+ }
30
+ function getAccessibilityFocus(ref) {
31
+ return function accessibilityFocus() {
32
+ const reactTag = findNodeHandle(ref.current);
33
+ reactTag &&
34
+ setTimeout(() => {
35
+ AccessibilityInfo.setAccessibilityFocus(reactTag);
36
+ }, 0);
37
+ };
38
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./ErrorMessageContext";
2
+ export * from "./ErrorMessageProvider";
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export { ErrorMessageWrapper } from "./ErrorMessageWrapper";
2
+ export { useErrorMessageContext, ErrorMessageContext, ErrorMessageProvider, } from "./context";
package/dist/src/index.js CHANGED
@@ -2,6 +2,7 @@ export * from "./Icon";
2
2
  export * from "./Divider";
3
3
  export * from "./Typography";
4
4
  export * from "./Text";
5
+ export * from "./ErrorMessageWrapper";
5
6
  export * from "./ActionLabel";
6
7
  export * from "./Content";
7
8
  export * from "./ActivityIndicator";