Skip to content

Commit e551954

Browse files
authored
Merge pull request #52 from buildo/fixes-4
More fixes
2 parents 66e2cff + d6cdf92 commit e551954

File tree

13 files changed

+103
-21
lines changed

13 files changed

+103
-21
lines changed

Diff for: .storybook/preview.js

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
import "../src/reset.css.ts";
22
import { OverlayProvider } from "@react-aria/overlays";
3+
import { DefaultMessagesContext } from "../src/DefaultMessagesContext";
4+
import { defaultMessages } from "../stories/defaultMessages";
35

46
export const decorators = [
57
(Story) => (
6-
<OverlayProvider>
7-
<Story />
8-
</OverlayProvider>
8+
<DefaultMessagesContext.Provider value={{ defaultMessages }}>
9+
<OverlayProvider>
10+
<Story />
11+
</OverlayProvider>
12+
</DefaultMessagesContext.Provider>
913
),
1014
];
1115

Diff for: src/Banner/createBanner.tsx

+5-2
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@ import { Columns, Column, Box, Stack, BentoSprinkles } from "../internal";
1515
import { bannerRecipe } from "./Banner.css";
1616
import { ComponentProps, FunctionComponent } from "react";
1717
import { IconProps } from "../Icons/IconProps";
18+
import { useDefaultMessages } from "../util/useDefaultMessages";
1819

1920
type DismissProps =
2021
| {
21-
dismissButtonLabel: LocalizedString;
22+
dismissButtonLabel?: LocalizedString;
2223
onDismiss: () => void;
2324
}
2425
| {
@@ -74,6 +75,8 @@ export function createBanner({
7475
const iconProps = { size: iconSize, color: kind === "tip" ? "secondary" : kind } as const;
7576
const Icon = kindIcons[kind];
7677

78+
const { defaultMessages } = useDefaultMessages();
79+
7780
return (
7881
<Box padding={padding} borderRadius={radius} className={bannerRecipe({ kind })}>
7982
<Columns space={16} align="left" alignY={title && description ? "top" : "center"}>
@@ -93,7 +96,7 @@ export function createBanner({
9396
{dismissProps.onDismiss && (
9497
<Column width="content">
9598
<IconButton
96-
label={dismissProps.dismissButtonLabel}
99+
label={dismissProps.dismissButtonLabel ?? defaultMessages.Banner.dismissButtonLabel}
97100
onPress={dismissProps.onDismiss}
98101
size={12}
99102
icon={closeIcon}

Diff for: src/Chip/createChip.tsx

+5-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ import { IconProps } from "../Icons/IconProps";
33
import { Label, LocalizedString, IconButton, IconClose } from "..";
44
import { Box, Columns, Column, BentoSprinkles } from "../internal";
55
import { chipRecipe } from "./Chip.css";
6+
import { useDefaultMessages } from "../util/useDefaultMessages";
67

78
type DismissProps =
89
| {
9-
dismissButtonLabel: LocalizedString;
10+
dismissButtonLabel?: LocalizedString;
1011
onDismiss: () => void;
1112
}
1213
| {
@@ -49,6 +50,8 @@ export function createChip(
4950
}
5051
) {
5152
return function Chip({ color, label, ...dismissProps }: ChipProps) {
53+
const { defaultMessages } = useDefaultMessages();
54+
5255
return (
5356
<Box display="flex">
5457
<Box
@@ -64,7 +67,7 @@ export function createChip(
6467
<Column width="content">
6568
<IconButton
6669
icon={config.closeIcon}
67-
label={dismissProps.dismissButtonLabel}
70+
label={dismissProps.dismissButtonLabel ?? defaultMessages.Chip.dismissButtonLabel}
6871
onPress={dismissProps.onDismiss}
6972
size={config.closeIconSize}
7073
/>

Diff for: src/DefaultMessagesContext.tsx

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { createContext } from "react";
2+
import { LocalizedString } from ".";
3+
4+
export type DefaultMessages = {
5+
defaultMessages: {
6+
Chip: {
7+
dismissButtonLabel: LocalizedString;
8+
};
9+
Banner: {
10+
dismissButtonLabel: LocalizedString;
11+
};
12+
Modal: {
13+
closeButtonLabel: LocalizedString;
14+
};
15+
SelectField: {
16+
noOptionsMessage: LocalizedString;
17+
multiOptionsSelected: (count: number) => LocalizedString;
18+
};
19+
SearchBar: {
20+
clearButtonLabel: LocalizedString;
21+
};
22+
};
23+
};
24+
25+
export const DefaultMessagesContext = createContext<DefaultMessages | null>(null);

Diff for: src/List/createListItem.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export type Props = Kind &
4545
LeftItem &
4646
RightItem & {
4747
disabled?: boolean;
48-
size: ListSize;
48+
size?: ListSize;
4949
isFocused?: boolean;
5050
ignoreTabIndex?: boolean;
5151
} & (
@@ -115,7 +115,7 @@ export function createListItem(config: ListItemConfig) {
115115
display="block"
116116
tabIndex={interactive && !props.ignoreTabIndex ? linkProps.tabIndex : undefined}
117117
>
118-
<Inset spaceX={config.paddingX} spaceY={config.paddingY[props.size]}>
118+
<Inset spaceX={config.paddingX} spaceY={config.paddingY[props.size ?? "medium"]}>
119119
<Columns space={config.internalSpacing} alignY="center">
120120
{renderLeft(props)}
121121
{renderContent(props)}

Diff for: src/Modal/createModal.tsx

+5-2
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,15 @@ import { modal, underlay } from "./Modal.css";
1616
import useKeyPressEvent from "react-use/lib/useKeyPressEvent";
1717
import { ModalContext } from "./ModalContext";
1818
import { IconProps } from "../Icons/IconProps";
19+
import { useDefaultMessages } from "../util/useDefaultMessages";
1920

2021
export type ModalProps = {
2122
title: LocalizedString;
2223
children: Children;
2324
primaryAction?: Omit<ButtonProps, "kind" | "hierarchy" | "size">;
2425
secondaryAction?: Omit<ButtonProps, "kind" | "hierarchy" | "size">;
2526
onClose: () => void;
26-
closeButtonLabel: LocalizedString;
27+
closeButtonLabel?: LocalizedString;
2728
isDestructive?: boolean;
2829
};
2930

@@ -67,6 +68,8 @@ export function createModal(
6768
() => props.primaryAction?.onPress()
6869
);
6970

71+
const { defaultMessages } = useDefaultMessages();
72+
7073
return (
7174
<Box className={underlay} {...underlayProps} color={undefined}>
7275
<ModalContext.Provider value={true}>
@@ -85,7 +88,7 @@ export function createModal(
8588
<Column width="content">
8689
<IconButton
8790
icon={config.closeIcon}
88-
label={props.closeButtonLabel}
91+
label={props.closeButtonLabel ?? defaultMessages.Modal.closeButtonLabel}
8992
onPress={props.onClose}
9093
size={config.closeIconSize}
9194
tabIndex={-1}

Diff for: src/SearchBar/createSearchBar.tsx

+5-2
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,15 @@ import { input } from "./SearchBar.css";
99
import { FieldType } from "../Field/createField";
1010
import { defaultInputConfig, InputConfig } from "../Field/InputConfig";
1111
import { IconProps } from "../Icons/IconProps";
12+
import { useDefaultMessages } from "../util/useDefaultMessages";
1213

1314
type Props = {
1415
value: string;
1516
onChange: (value: string) => unknown;
1617
onBlur?: () => unknown;
1718
placeholder: LocalizedString;
1819
disabled?: boolean;
19-
clearButtonLabel: LocalizedString;
20+
clearButtonLabel?: LocalizedString;
2021
};
2122

2223
export type SearchBarConfig = {
@@ -53,10 +54,12 @@ export function createSearchBar(
5354
inputRef
5455
);
5556

57+
const { defaultMessages } = useDefaultMessages();
58+
5659
const rightAccessoryContent =
5760
props.value.length > 0 ? (
5861
<IconButton
59-
label={props.clearButtonLabel}
62+
label={props.clearButtonLabel ?? defaultMessages.SearchBar.clearButtonLabel}
6063
onPress={() => props.onChange("")}
6164
size={16}
6265
icon={config.clearIcon}

Diff for: src/SelectField/createSelectField.tsx

+12-6
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { InputConfig } from "../Field/InputConfig";
1414
import { BentoSprinkles } from "../internal";
1515
import { ListItemProps } from "../List/createListItem";
1616
import { Omit } from "../util/Omit";
17+
import { useDefaultMessages } from "../util/useDefaultMessages";
1718

1819
export type SelectOption<A> = Omit<
1920
ListItemProps,
@@ -25,14 +26,14 @@ export type SelectOption<A> = Omit<
2526
type Props<A, IsMulti extends boolean> = (IsMulti extends false
2627
? FieldProps<A | undefined>
2728
: FieldProps<A[]>) & {
28-
size: ListSize;
29+
menuSize?: ListSize;
2930
placeholder: LocalizedString;
3031
options: Array<SelectOption<A>>;
3132
isMulti?: IsMulti;
3233
noOptionsMessage?: LocalizedString;
3334
autoFocus?: boolean;
3435
} & (IsMulti extends true
35-
? { multiValueMessage: (numberOfSelectedOptions: number) => LocalizedString }
36+
? { multiValueMessage?: (numberOfSelectedOptions: number) => LocalizedString }
3637
: {});
3738

3839
export type { Props as SelectFieldProps };
@@ -73,7 +74,7 @@ export function createSelectField(
7374
isMulti,
7475
noOptionsMessage,
7576
autoFocus,
76-
size,
77+
menuSize = "medium",
7778
} = props;
7879

7980
const validationState = issues ? "invalid" : "valid";
@@ -95,6 +96,8 @@ export function createSelectField(
9596
};
9697
}, [menuPortalTarget]);
9798

99+
const { defaultMessages } = useDefaultMessages();
100+
98101
return (
99102
<Field
100103
label={label}
@@ -156,13 +159,16 @@ export function createSelectField(
156159
validationState={validationState}
157160
isMulti={isMulti}
158161
isClearable={false}
159-
noOptionsMessage={() => noOptionsMessage}
162+
noOptionsMessage={() => noOptionsMessage ?? defaultMessages.SelectField.noOptionsMessage}
160163
multiValueMessage={
161-
isMulti ? (props as unknown as Props<A, true>).multiValueMessage : undefined
164+
isMulti
165+
? (props as unknown as Props<A, true>).multiValueMessage ??
166+
defaultMessages.SelectField.multiOptionsSelected
167+
: undefined
162168
}
163169
closeMenuOnSelect={!isMulti}
164170
hideSelectedOptions={false}
165-
menuSize={size}
171+
menuSize={menuSize}
166172
/>
167173
</Field>
168174
);

Diff for: src/Typography/Body/Body.css.ts

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export const bodyRecipe = strictRecipe({
2222
warning: bentoSprinkles({ color: "textWarning" }),
2323
informative: bentoSprinkles({ color: "textInformative" }),
2424
link: bentoSprinkles({ color: "textLink" }),
25+
primaryInverse: bentoSprinkles({ color: "textPrimaryInverse" }),
2526
},
2627
},
2728
});

Diff for: src/Typography/Body/Body.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ type Color =
1313
| "positive"
1414
| "informative"
1515
| "warning"
16-
| "link";
16+
| "link"
17+
| "primaryInverse";
1718

1819
type Props = {
1920
id?: string;

Diff for: src/util/useDefaultMessages.ts

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { useContext } from "react";
2+
import { DefaultMessagesContext } from "../DefaultMessagesContext";
3+
4+
export function useDefaultMessages() {
5+
const context = useContext(DefaultMessagesContext);
6+
if (!context) {
7+
throw new Error("useDefaultMessages must be used within a DefaultMessagesProvider");
8+
}
9+
return context;
10+
}

Diff for: stories/Components/Form.stories.tsx

-1
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,6 @@ export const multipleSections = createStory({
142142
</FormRow>
143143
<FormRow>
144144
<ExampleSelectField
145-
size="medium"
146145
label={formatMessage("Select your gender")}
147146
options={[
148147
{ label: formatMessage("Male"), value: "M", kind: "single-line" },

Diff for: stories/defaultMessages.ts

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { DefaultMessages } from "../src/DefaultMessagesContext";
2+
import { formatMessage } from "./util";
3+
4+
export const defaultMessages: DefaultMessages["defaultMessages"] = {
5+
Chip: {
6+
dismissButtonLabel: formatMessage("Remove"),
7+
},
8+
Banner: {
9+
dismissButtonLabel: formatMessage("Close"),
10+
},
11+
Modal: {
12+
closeButtonLabel: formatMessage("Close"),
13+
},
14+
SelectField: {
15+
noOptionsMessage: formatMessage("No options"),
16+
multiOptionsSelected: (n) => {
17+
const options = n > 1 ? "options" : "option";
18+
return formatMessage(`${n} ${options} selected`);
19+
},
20+
},
21+
SearchBar: {
22+
clearButtonLabel: formatMessage("Clear"),
23+
},
24+
};

0 commit comments

Comments
 (0)