@khanacademy/wonder-blocks-birthday-picker 4.1.73 → 4.2.1
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.
- package/CHANGELOG.md +19 -0
- package/dist/components/birthday-picker.d.ts +3 -1
- package/dist/es/index.js +2 -1
- package/dist/index.js +2 -1
- package/package.json +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @khanacademy/wonder-blocks-birthday-picker
|
|
2
2
|
|
|
3
|
+
## 4.2.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- @khanacademy/wonder-blocks-dropdown@10.13.6
|
|
8
|
+
|
|
9
|
+
## 4.2.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- 6bd5d0c: The default month, day and year placeholders and the error message in BirthdayPicker now read translated strings from `WonderBlocksConfigProvider`. The `labels` prop overrides the built-in translations.
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- Updated dependencies [6bd5d0c]
|
|
18
|
+
- Updated dependencies [8e11e83]
|
|
19
|
+
- @khanacademy/wonder-blocks-config@0.5.0
|
|
20
|
+
- @khanacademy/wonder-blocks-dropdown@10.13.5
|
|
21
|
+
|
|
3
22
|
## 4.1.73
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
|
@@ -34,6 +34,9 @@ type Props = {
|
|
|
34
34
|
disabled?: boolean;
|
|
35
35
|
/**
|
|
36
36
|
* The object containing the custom labels used inside this component.
|
|
37
|
+
*
|
|
38
|
+
* Each label overrides the translated string from
|
|
39
|
+
* `WonderBlocksConfigProvider`.
|
|
37
40
|
*/
|
|
38
41
|
labels?: Labels;
|
|
39
42
|
/**
|
|
@@ -64,6 +67,5 @@ type Props = {
|
|
|
64
67
|
*/
|
|
65
68
|
locale?: string;
|
|
66
69
|
};
|
|
67
|
-
export declare const defaultLabels: Labels;
|
|
68
70
|
declare const BirthdayPicker: (props: Props) => React.JSX.Element;
|
|
69
71
|
export default BirthdayPicker;
|
package/dist/es/index.js
CHANGED
|
@@ -2,6 +2,7 @@ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
|
2
2
|
import { Temporal } from 'temporal-polyfill';
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import { StyleSheet } from 'aphrodite';
|
|
5
|
+
import { useWonderBlocksI18n } from '@khanacademy/wonder-blocks-config';
|
|
5
6
|
import { View } from '@khanacademy/wonder-blocks-core';
|
|
6
7
|
import { sizing, semanticColor } from '@khanacademy/wonder-blocks-tokens';
|
|
7
8
|
import { BodyText } from '@khanacademy/wonder-blocks-typography';
|
|
@@ -9,6 +10,6 @@ import { PhosphorIcon } from '@khanacademy/wonder-blocks-icon';
|
|
|
9
10
|
import { SingleSelect, OptionItem } from '@khanacademy/wonder-blocks-dropdown';
|
|
10
11
|
import infoIcon from '@phosphor-icons/core/bold/info-bold.svg';
|
|
11
12
|
|
|
12
|
-
const CUR_YEAR=new Date().getYear()+1900;const
|
|
13
|
+
const CUR_YEAR=new Date().getYear()+1900;const FIELD_MIN_WIDTH_FULL=110;const FIELD_MIN_WIDTH_MONTH_YEAR=167;const FIELD_MIN_WIDTH_DAY=100;const xsMin="520px";const screenSizes={small:`@media (max-width: ${xsMin})`};const defaultStyles=StyleSheet.create({wrapper:{flexDirection:"row",gap:sizing.size_080,[screenSizes.small]:{flexDirection:"column"}},input:{[screenSizes.small]:{minInlineSize:"100%"}},errorRow:{flexDirection:"row",placeItems:"center",gap:sizing.size_040,marginBlockStart:sizing.size_040},errorText:{color:semanticColor.core.foreground.critical.default}});const isFutureDate=date=>{return Temporal.PlainDate.compare(date,Temporal.Now.plainDateISO())===1};const getStateFromDefault=(defaultValue,monthYearOnly,labels)=>{const initialState={month:null,day:monthYearOnly?"1":null,year:null,error:null};if(defaultValue){let date=null;try{date=Temporal.PlainDate.from(defaultValue);}catch(err){initialState.error=labels.errorMessage;return initialState}if(monthYearOnly){date=date.with({day:date.daysInMonth});}initialState.month=String(date.month);initialState.day=String(date.day);initialState.year=String(date.year);if(isFutureDate(date)){initialState.error=labels.errorMessage;}}return initialState};const getMonthYearWidth=monthYearOnly=>{return monthYearOnly?FIELD_MIN_WIDTH_MONTH_YEAR:FIELD_MIN_WIDTH_FULL};const BirthdayPicker=props=>{const{defaultValue,disabled,dropdownStyle,locale,monthYearOnly,onChange,style}=props;const{strings}=useWonderBlocksI18n();const labelsRef=React.useRef({errorMessage:props.labels?.errorMessage||strings.birthdateErrorMessage,month:props.labels?.month||strings.fieldLabelMonth,year:props.labels?.year||strings.fieldLabelYear,day:props.labels?.day||strings.fieldLabelDay});const labels=labelsRef.current;const[initialState]=React.useState(()=>getStateFromDefault(defaultValue,monthYearOnly,labels));const[month,setMonth]=React.useState(initialState.month);const[day,setDay]=React.useState(initialState.day);const[year,setYear]=React.useState(initialState.year);const[error,setError]=React.useState(initialState.error);const valuesRef=React.useRef({month:initialState.month,day:initialState.day,year:initialState.year});const lastChangeValueRef=React.useRef(defaultValue||null);const reportChange=React.useCallback(value=>{if(value!==lastChangeValueRef.current){lastChangeValueRef.current=value;onChange(value);}},[onChange]);const handleChange=React.useCallback(()=>{const{month,day,year}=valuesRef.current;const dateFields=[year,month];if(!monthYearOnly){dateFields.push(day);}if(dateFields.some(field=>field===null)){reportChange(null);return}let date;try{if(monthYearOnly){date=Temporal.PlainDate.from({year:Number(year),month:Number(month),day:31});}else {date=Temporal.PlainDate.from({year:Number(year),month:Number(month),day:Number(day)},{overflow:"reject"});}}catch(err){setError(labels.errorMessage);reportChange(null);return}if(isFutureDate(date)){setError(labels.errorMessage);reportChange(null);}else {setError(null);reportChange(date.toString());}},[labels,monthYearOnly,reportChange]);const handleMonthChange=React.useCallback(month=>{valuesRef.current={...valuesRef.current,month};setMonth(month);handleChange();},[handleChange]);const handleDayChange=React.useCallback(day=>{valuesRef.current={...valuesRef.current,day};setDay(day);handleChange();},[handleChange]);const handleYearChange=React.useCallback(year=>{valuesRef.current={...valuesRef.current,year};setYear(year);handleChange();},[handleChange]);const maybeRenderError=()=>{if(!error){return null}return jsxs(View,{style:defaultStyles.errorRow,role:"alert",children:[jsx(PhosphorIcon,{size:"small",icon:infoIcon,color:semanticColor.core.foreground.critical.default,"aria-hidden":"true"}),jsx(BodyText,{tag:"span",style:defaultStyles.errorText,children:error})]})};const monthsShort=React.useMemo(()=>{const format=new Intl.DateTimeFormat(locale??navigator.language,{month:"short"}).format;return [...Array(12).keys()].map(m=>format(new Date(2021,m,15)))},[locale]);const renderMonth=()=>{const minWidth=getMonthYearWidth(monthYearOnly);return jsx(SingleSelect,{"aria-label":labels.month,"aria-invalid":!!error,error:!!error,disabled:disabled,placeholder:labels.month,onChange:handleMonthChange,selectedValue:month,style:[{minWidth},defaultStyles.input,dropdownStyle],testId:"birthday-picker-month",children:monthsShort.map((monthShort,i)=>jsx(OptionItem,{label:monthShort,value:String(i+1)},monthShort))})};const maybeRenderDay=()=>{if(monthYearOnly){return null}return jsx(SingleSelect,{"aria-label":labels.day,"aria-invalid":!!error,error:!!error,disabled:disabled,placeholder:labels.day,onChange:handleDayChange,selectedValue:day,style:[{minInlineSize:FIELD_MIN_WIDTH_DAY},defaultStyles.input,dropdownStyle],testId:"birthday-picker-day",children:Array.from(Array(31)).map((_,day)=>jsx(OptionItem,{label:String(day+1),value:String(day+1)},String(day+1)))})};const renderYear=()=>{const minWidth=getMonthYearWidth(monthYearOnly);return jsx(SingleSelect,{"aria-label":labels.year,"aria-invalid":!!error,error:!!error,disabled:disabled,placeholder:labels.year,onChange:handleYearChange,selectedValue:year,style:[{minWidth},defaultStyles.input,dropdownStyle],dropdownStyle:{minWidth:150},testId:"birthday-picker-year",children:Array.from(Array(120)).map((_,yearOffset)=>jsx(OptionItem,{label:String(CUR_YEAR-yearOffset),value:String(CUR_YEAR-yearOffset)},String(CUR_YEAR-yearOffset)))})};return jsxs(Fragment,{children:[jsxs(View,{testId:"birthday-picker",style:[defaultStyles.wrapper,style],children:[renderMonth(),maybeRenderDay(),renderYear()]}),maybeRenderError()]})};
|
|
13
14
|
|
|
14
15
|
export { BirthdayPicker as default };
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,7 @@ var jsxRuntime = require('react/jsx-runtime');
|
|
|
4
4
|
var temporalPolyfill = require('temporal-polyfill');
|
|
5
5
|
var React = require('react');
|
|
6
6
|
var aphrodite = require('aphrodite');
|
|
7
|
+
var wonderBlocksConfig = require('@khanacademy/wonder-blocks-config');
|
|
7
8
|
var wonderBlocksCore = require('@khanacademy/wonder-blocks-core');
|
|
8
9
|
var wonderBlocksTokens = require('@khanacademy/wonder-blocks-tokens');
|
|
9
10
|
var wonderBlocksTypography = require('@khanacademy/wonder-blocks-typography');
|
|
@@ -34,6 +35,6 @@ function _interopNamespace(e) {
|
|
|
34
35
|
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
35
36
|
var infoIcon__default = /*#__PURE__*/_interopDefaultLegacy(infoIcon);
|
|
36
37
|
|
|
37
|
-
const CUR_YEAR=new Date().getYear()+1900;const
|
|
38
|
+
const CUR_YEAR=new Date().getYear()+1900;const FIELD_MIN_WIDTH_FULL=110;const FIELD_MIN_WIDTH_MONTH_YEAR=167;const FIELD_MIN_WIDTH_DAY=100;const xsMin="520px";const screenSizes={small:`@media (max-width: ${xsMin})`};const defaultStyles=aphrodite.StyleSheet.create({wrapper:{flexDirection:"row",gap:wonderBlocksTokens.sizing.size_080,[screenSizes.small]:{flexDirection:"column"}},input:{[screenSizes.small]:{minInlineSize:"100%"}},errorRow:{flexDirection:"row",placeItems:"center",gap:wonderBlocksTokens.sizing.size_040,marginBlockStart:wonderBlocksTokens.sizing.size_040},errorText:{color:wonderBlocksTokens.semanticColor.core.foreground.critical.default}});const isFutureDate=date=>{return temporalPolyfill.Temporal.PlainDate.compare(date,temporalPolyfill.Temporal.Now.plainDateISO())===1};const getStateFromDefault=(defaultValue,monthYearOnly,labels)=>{const initialState={month:null,day:monthYearOnly?"1":null,year:null,error:null};if(defaultValue){let date=null;try{date=temporalPolyfill.Temporal.PlainDate.from(defaultValue);}catch(err){initialState.error=labels.errorMessage;return initialState}if(monthYearOnly){date=date.with({day:date.daysInMonth});}initialState.month=String(date.month);initialState.day=String(date.day);initialState.year=String(date.year);if(isFutureDate(date)){initialState.error=labels.errorMessage;}}return initialState};const getMonthYearWidth=monthYearOnly=>{return monthYearOnly?FIELD_MIN_WIDTH_MONTH_YEAR:FIELD_MIN_WIDTH_FULL};const BirthdayPicker=props=>{const{defaultValue,disabled,dropdownStyle,locale,monthYearOnly,onChange,style}=props;const{strings}=wonderBlocksConfig.useWonderBlocksI18n();const labelsRef=React__namespace.useRef({errorMessage:props.labels?.errorMessage||strings.birthdateErrorMessage,month:props.labels?.month||strings.fieldLabelMonth,year:props.labels?.year||strings.fieldLabelYear,day:props.labels?.day||strings.fieldLabelDay});const labels=labelsRef.current;const[initialState]=React__namespace.useState(()=>getStateFromDefault(defaultValue,monthYearOnly,labels));const[month,setMonth]=React__namespace.useState(initialState.month);const[day,setDay]=React__namespace.useState(initialState.day);const[year,setYear]=React__namespace.useState(initialState.year);const[error,setError]=React__namespace.useState(initialState.error);const valuesRef=React__namespace.useRef({month:initialState.month,day:initialState.day,year:initialState.year});const lastChangeValueRef=React__namespace.useRef(defaultValue||null);const reportChange=React__namespace.useCallback(value=>{if(value!==lastChangeValueRef.current){lastChangeValueRef.current=value;onChange(value);}},[onChange]);const handleChange=React__namespace.useCallback(()=>{const{month,day,year}=valuesRef.current;const dateFields=[year,month];if(!monthYearOnly){dateFields.push(day);}if(dateFields.some(field=>field===null)){reportChange(null);return}let date;try{if(monthYearOnly){date=temporalPolyfill.Temporal.PlainDate.from({year:Number(year),month:Number(month),day:31});}else {date=temporalPolyfill.Temporal.PlainDate.from({year:Number(year),month:Number(month),day:Number(day)},{overflow:"reject"});}}catch(err){setError(labels.errorMessage);reportChange(null);return}if(isFutureDate(date)){setError(labels.errorMessage);reportChange(null);}else {setError(null);reportChange(date.toString());}},[labels,monthYearOnly,reportChange]);const handleMonthChange=React__namespace.useCallback(month=>{valuesRef.current={...valuesRef.current,month};setMonth(month);handleChange();},[handleChange]);const handleDayChange=React__namespace.useCallback(day=>{valuesRef.current={...valuesRef.current,day};setDay(day);handleChange();},[handleChange]);const handleYearChange=React__namespace.useCallback(year=>{valuesRef.current={...valuesRef.current,year};setYear(year);handleChange();},[handleChange]);const maybeRenderError=()=>{if(!error){return null}return jsxRuntime.jsxs(wonderBlocksCore.View,{style:defaultStyles.errorRow,role:"alert",children:[jsxRuntime.jsx(wonderBlocksIcon.PhosphorIcon,{size:"small",icon:infoIcon__default["default"],color:wonderBlocksTokens.semanticColor.core.foreground.critical.default,"aria-hidden":"true"}),jsxRuntime.jsx(wonderBlocksTypography.BodyText,{tag:"span",style:defaultStyles.errorText,children:error})]})};const monthsShort=React__namespace.useMemo(()=>{const format=new Intl.DateTimeFormat(locale??navigator.language,{month:"short"}).format;return [...Array(12).keys()].map(m=>format(new Date(2021,m,15)))},[locale]);const renderMonth=()=>{const minWidth=getMonthYearWidth(monthYearOnly);return jsxRuntime.jsx(wonderBlocksDropdown.SingleSelect,{"aria-label":labels.month,"aria-invalid":!!error,error:!!error,disabled:disabled,placeholder:labels.month,onChange:handleMonthChange,selectedValue:month,style:[{minWidth},defaultStyles.input,dropdownStyle],testId:"birthday-picker-month",children:monthsShort.map((monthShort,i)=>jsxRuntime.jsx(wonderBlocksDropdown.OptionItem,{label:monthShort,value:String(i+1)},monthShort))})};const maybeRenderDay=()=>{if(monthYearOnly){return null}return jsxRuntime.jsx(wonderBlocksDropdown.SingleSelect,{"aria-label":labels.day,"aria-invalid":!!error,error:!!error,disabled:disabled,placeholder:labels.day,onChange:handleDayChange,selectedValue:day,style:[{minInlineSize:FIELD_MIN_WIDTH_DAY},defaultStyles.input,dropdownStyle],testId:"birthday-picker-day",children:Array.from(Array(31)).map((_,day)=>jsxRuntime.jsx(wonderBlocksDropdown.OptionItem,{label:String(day+1),value:String(day+1)},String(day+1)))})};const renderYear=()=>{const minWidth=getMonthYearWidth(monthYearOnly);return jsxRuntime.jsx(wonderBlocksDropdown.SingleSelect,{"aria-label":labels.year,"aria-invalid":!!error,error:!!error,disabled:disabled,placeholder:labels.year,onChange:handleYearChange,selectedValue:year,style:[{minWidth},defaultStyles.input,dropdownStyle],dropdownStyle:{minWidth:150},testId:"birthday-picker-year",children:Array.from(Array(120)).map((_,yearOffset)=>jsxRuntime.jsx(wonderBlocksDropdown.OptionItem,{label:String(CUR_YEAR-yearOffset),value:String(CUR_YEAR-yearOffset)},String(CUR_YEAR-yearOffset)))})};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs(wonderBlocksCore.View,{testId:"birthday-picker",style:[defaultStyles.wrapper,style],children:[renderMonth(),maybeRenderDay(),renderYear()]}),maybeRenderError()]})};
|
|
38
39
|
|
|
39
40
|
module.exports = BirthdayPicker;
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"description": "",
|
|
4
4
|
"author": "Khan Academy",
|
|
5
5
|
"license": "MIT",
|
|
6
|
-
"version": "4.1
|
|
6
|
+
"version": "4.2.1",
|
|
7
7
|
"publishConfig": {
|
|
8
8
|
"access": "public"
|
|
9
9
|
},
|
|
@@ -20,8 +20,9 @@
|
|
|
20
20
|
"module": "dist/es/index.js",
|
|
21
21
|
"types": "dist/index.d.ts",
|
|
22
22
|
"dependencies": {
|
|
23
|
+
"@khanacademy/wonder-blocks-config": "0.5.0",
|
|
23
24
|
"@khanacademy/wonder-blocks-core": "12.5.0",
|
|
24
|
-
"@khanacademy/wonder-blocks-dropdown": "10.13.
|
|
25
|
+
"@khanacademy/wonder-blocks-dropdown": "10.13.6",
|
|
25
26
|
"@khanacademy/wonder-blocks-icon": "6.0.3",
|
|
26
27
|
"@khanacademy/wonder-blocks-layout": "3.2.1",
|
|
27
28
|
"@khanacademy/wonder-blocks-tokens": "18.1.0",
|