diff --git a/public_html/wp-content/plugins/wc-post-types/css/editor.css b/public_html/wp-content/plugins/wc-post-types/css/editor.css
index e2b8ff78f6..f6593060e4 100644
--- a/public_html/wp-content/plugins/wc-post-types/css/editor.css
+++ b/public_html/wp-content/plugins/wc-post-types/css/editor.css
@@ -9,7 +9,6 @@
.wordcamp-panel-session-info .components-datetime__time .components-button,
.wordcamp-panel-session-info .components-datetime__time input[type="number"],
.wordcamp-panel-session-info .components-datetime__time select {
- height: 30px;
margin-bottom: 0;
margin-top: 0;
}
diff --git a/public_html/wp-content/plugins/wc-post-types/js/src/components/date-control/index.js b/public_html/wp-content/plugins/wc-post-types/js/src/components/date-control/index.js
index e7c9e8815d..4f1250e289 100644
--- a/public_html/wp-content/plugins/wc-post-types/js/src/components/date-control/index.js
+++ b/public_html/wp-content/plugins/wc-post-types/js/src/components/date-control/index.js
@@ -1,11 +1,18 @@
+/**
+ * External dependencies
+ */
+import { format } from 'date-fns';
+import { TZDate } from '@date-fns/tz';
+
/**
* WordPress dependencies
*/
-// eslint-disable-next-line @wordpress/no-unsafe-wp-apis -- Date settings OK.
-import { __experimentalGetSettings, dateI18n } from '@wordpress/date';
+import { getSettings } from '@wordpress/date';
import { BaseControl, TimePicker } from '@wordpress/components';
import { sprintf } from '@wordpress/i18n';
+const TIMEZONELESS_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";
+
/**
* Using the site settings, generate the offset in ISO 8601 format (`+00:00`).
*
@@ -25,7 +32,7 @@ function getTimezoneOffset( { offset = 0 } ) {
}
export default function( { date, label, onChange } ) {
- const settings = __experimentalGetSettings();
+ const settings = getSettings();
const is12HourTime = /a(?!\\)/i.test(
settings.formats.time
.toLowerCase() // Test only the lower case a
@@ -35,20 +42,44 @@ export default function( { date, label, onChange } ) {
.join( '' ) // Reverse the string and test for "a" not followed by a slash
);
- // Remove the timezone info from the date. `TimePicker` uses an instance of moment that does not know about
- // the site timezone, so passing it in causes an unexpected offset.
- const dateNoTZ = dateI18n( 'Y-m-d\\TH:i:s', date, 'WP' );
+ // The `TimePicker` component is timezone-agnostic, so `currentTime` should be a
+ // date-time string without a timezone (but in the server timezone for display).
+
+ // First get the server timezone from date settings. This could be a string
+ // like "America/New_York" or an offset like "-1".
+ let serverTimezone = settings.timezone.string;
+ if ( ! serverTimezone ) {
+ // If it's a offset, convert it to ISO 8601 format.
+ serverTimezone = getTimezoneOffset( settings.timezone );
+ }
+
+ // Because this date is a timestamp, it's understood to be a UTC value, and
+ // can be simply created with the correct timezone.
+ const dateServerTZ = new TZDate( date, serverTimezone );
return (
{ label }
{
- // dateValue is a tz-less string, so we need to add the site-timezone offset.
- // Otherwise, `dateI18n` tries to use the browser timezone, which might not be the same.
- const offset = getTimezoneOffset( settings.timezone );
- const value = dateI18n( 'U', dateValue + offset );
+ currentTime={ format( dateServerTZ, TIMEZONELESS_FORMAT ) }
+ onChange={ ( newDate ) => {
+ // Parse the date with the server timezone. This will be an incorrect date, because
+ // the date is first converted to the client timezone, then the server timezone data
+ // is added. For example, if the TimePicker reads 9:00 UTC-8 (server timezone), but
+ // the client timezone is UTC-5, when created, the timestamp for the date will be
+ // 9:00 UTC-5. Instead, we should create a new date with the server timezone appended,
+ // so that it will create the correct UTC timestamp.
+ // This `_date` is only used to get the timezone in the correct format.
+ const _date = new TZDate( newDate, serverTimezone );
+
+ // XXX returns the timezone (ISO-8601 w/ Z), e.g. -08:00.
+ const timezone = format( _date, 'XXX' );
+
+ // Now create a new date with the correct timezone.
+ const newDateTZ = new Date( newDate + timezone );
+
+ // Save value in seconds format for post meta.
+ const value = format( newDateTZ, 't' );
onChange( value );
} }
is12Hour={ is12HourTime }
diff --git a/public_html/wp-content/plugins/wc-post-types/package.json b/public_html/wp-content/plugins/wc-post-types/package.json
index 3afb454846..4c47e8d605 100644
--- a/public_html/wp-content/plugins/wc-post-types/package.json
+++ b/public_html/wp-content/plugins/wc-post-types/package.json
@@ -12,17 +12,19 @@
"url": "https://github.com/WordPress/wordcamp.org/issues?q=label%3A%22%5BComponent%5D+WC-Post-Types%22"
},
"devDependencies": {
+ "@date-fns/tz": "1.1.2",
"@wordpress/api-fetch": "6.2.0",
"@wordpress/components": "19.7.0",
"@wordpress/compose": "5.3.0",
"@wordpress/data": "6.5.0",
- "@wordpress/date": "4.5.0",
+ "@wordpress/date": "4.58.0",
"@wordpress/edit-post": "6.2.0",
"@wordpress/element": "4.3.0",
"@wordpress/eslint-plugin": "11.1.0",
"@wordpress/i18n": "4.5.0",
"@wordpress/plugins": "4.3.0",
- "@wordpress/scripts": "22.3.0"
+ "@wordpress/scripts": "22.3.0",
+ "date-fns": "4.1.0"
},
"eslintConfig": {
"extends": "../../../../.eslintrc.js",
diff --git a/yarn.lock b/yarn.lock
index c269dceac0..eb7974bc7a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2318,6 +2318,11 @@
resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.0.tgz"
integrity sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==
+"@date-fns/tz@1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@date-fns/tz/-/tz-1.1.2.tgz#c8036db48ae9e7165f40a951942a14070e0c6ec1"
+ integrity sha512-Xmg2cPmOPQieCLAdf62KtFPU9y7wbQDq1OAzrs/bEQFvhtCPXDiks1CHDE/sTXReRfh/MICVkw/vY6OANHUGiA==
+
"@discoveryjs/json-ext@0.5.7":
version "0.5.7"
resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70"
@@ -4844,6 +4849,16 @@
moment "^2.22.1"
moment-timezone "^0.5.31"
+"@wordpress/date@4.58.0":
+ version "4.58.0"
+ resolved "https://registry.yarnpkg.com/@wordpress/date/-/date-4.58.0.tgz#6803e0bde8e8ccb62ebf57554f9543a14cc4433c"
+ integrity sha512-yFT7DU0H9W0lsDytMaVMmjho08X1LeBMIQMppxdtKB04Ujx58hVh7gtunOsstUQ7pVg23nE2eLaVfx5JOdjzAw==
+ dependencies:
+ "@babel/runtime" "^7.16.0"
+ "@wordpress/deprecated" "^3.58.0"
+ moment "^2.29.4"
+ moment-timezone "^0.5.40"
+
"@wordpress/dependency-extraction-webpack-plugin@^3.4.1":
version "3.4.1"
resolved "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-3.4.1.tgz"
@@ -4868,6 +4883,14 @@
"@babel/runtime" "^7.16.0"
"@wordpress/hooks" "^3.5.0"
+"@wordpress/deprecated@^3.58.0":
+ version "3.58.0"
+ resolved "https://registry.yarnpkg.com/@wordpress/deprecated/-/deprecated-3.58.0.tgz#c8b9442167bc20aef4888af4a4d081b4553adb4c"
+ integrity sha512-knweE2lLEUxWRr6A48sHiO0ww5pPybGe2NVIZVq/y7EaYCMdpy6gYA0ZdVqMKZvtxKKqicJfwigcn+hinsTvUQ==
+ dependencies:
+ "@babel/runtime" "^7.16.0"
+ "@wordpress/hooks" "^3.58.0"
+
"@wordpress/dom-ready@^3.5.0":
version "3.5.0"
resolved "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-3.5.0.tgz"
@@ -5067,6 +5090,13 @@
dependencies:
"@babel/runtime" "^7.16.0"
+"@wordpress/hooks@^3.58.0":
+ version "3.58.0"
+ resolved "https://registry.yarnpkg.com/@wordpress/hooks/-/hooks-3.58.0.tgz#68094f7e7e3f8cbc3ab68a0fe9ac2a9b3cfe55d6"
+ integrity sha512-9LB0ZHnZRQlORttux9t/xbAskF+dk2ujqzPGsVzc92mSKpQP3K2a5Wy74fUnInguB1vLUNHT6nrNdkVom5qX1Q==
+ dependencies:
+ "@babel/runtime" "^7.16.0"
+
"@wordpress/html-entities@3.5.0", "@wordpress/html-entities@^3.5.0":
version "3.5.0"
resolved "https://registry.npmjs.org/@wordpress/html-entities/-/html-entities-3.5.0.tgz"
@@ -7424,6 +7454,11 @@ data-urls@^3.0.2:
whatwg-mimetype "^3.0.0"
whatwg-url "^11.0.0"
+date-fns@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-4.1.0.tgz#64b3d83fff5aa80438f5b1a633c2e83b8a1c2d14"
+ integrity sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==
+
debounce@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5"
@@ -11935,11 +11970,23 @@ moment-timezone@^0.5.31:
dependencies:
moment ">= 2.9.0"
+moment-timezone@^0.5.40:
+ version "0.5.46"
+ resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.46.tgz#a21aa6392b3c6b3ed916cd5e95858a28d893704a"
+ integrity sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==
+ dependencies:
+ moment "^2.29.4"
+
"moment@>= 2.9.0", moment@>=1.6.0, moment@^2.22.1:
version "2.29.1"
resolved "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz"
integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
+moment@^2.29.4:
+ version "2.30.1"
+ resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae"
+ integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==
+
moo@^0.5.0:
version "0.5.1"
resolved "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz"