diff --git a/package.json b/package.json
index b25a2e60f..d6e8a4a18 100644
--- a/package.json
+++ b/package.json
@@ -53,6 +53,7 @@
"electron-updater": "^4.2.4",
"express": "^4.17.1",
"if-env": "^1.0.4",
+ "react-date-picker": "^8.0.7",
"remove-markdown": "^0.3.0",
"tempy": "^0.6.0",
"videojs-logo": "^2.1.4"
diff --git a/ui/component/publishForm/view.jsx b/ui/component/publishForm/view.jsx
index 8e49e3d01..0e16bea8c 100644
--- a/ui/component/publishForm/view.jsx
+++ b/ui/component/publishForm/view.jsx
@@ -19,6 +19,8 @@ import PublishDescription from 'component/publishDescription';
import PublishPrice from 'component/publishPrice';
import PublishFile from 'component/publishFile';
import PublishBid from 'component/publishBid';
+import PublishReleaseDate from 'component/publishReleaseDate';
+import PublishName from 'component/publishName';
import PublishAdditionalOptions from 'component/publishAdditionalOptions';
import PublishFormErrors from 'component/publishFormErrors';
import SelectThumbnail from 'component/selectThumbnail';
@@ -413,6 +415,11 @@ function PublishForm(props: Props) {
}
/>
+ {!publishing && (
+
+ )}
{!publishing && (
{mode === PUBLISH_MODES.FILE &&
}
diff --git a/ui/component/publishReleaseDate/index.js b/ui/component/publishReleaseDate/index.js
new file mode 100644
index 000000000..b51dd4e7c
--- /dev/null
+++ b/ui/component/publishReleaseDate/index.js
@@ -0,0 +1,13 @@
+import { connect } from 'react-redux';
+import { doUpdatePublishForm, makeSelectPublishFormValue } from 'lbry-redux';
+import PublishReleaseDate from './view';
+
+const select = (state) => ({
+ releaseTime: makeSelectPublishFormValue('release_time')(state),
+});
+
+const perform = (dispatch) => ({
+ updatePublishForm: (value) => dispatch(doUpdatePublishForm(value)),
+});
+
+export default connect(select, perform)(PublishReleaseDate);
diff --git a/ui/component/publishReleaseDate/view.jsx b/ui/component/publishReleaseDate/view.jsx
new file mode 100644
index 000000000..0d3631d72
--- /dev/null
+++ b/ui/component/publishReleaseDate/view.jsx
@@ -0,0 +1,43 @@
+// @flow
+import React, { useCallback } from 'react';
+import DatePicker from 'react-date-picker';
+import Card from 'component/common/card';
+
+type Props = {
+ releaseTime: ?number,
+ updatePublishForm: ({}) => void,
+};
+
+const PublishReleaseDate = (props: Props) => {
+ const { releaseTime, updatePublishForm } = props;
+ const maxDate = new Date();
+
+ const dateOrToday = useCallback((value) => {
+ return value ? new Date(value) : new Date();
+ }, []);
+
+ const onChange = useCallback((value) => {
+ updatePublishForm({ release_time: dateOrToday(value) });
+ }, []);
+
+ return (
+
+
+
+
+ }
+ />
+ );
+};
+
+export default PublishReleaseDate;
diff --git a/ui/modal/modalPublishPreview/view.jsx b/ui/modal/modalPublishPreview/view.jsx
index 8cad668ac..65284f405 100644
--- a/ui/modal/modalPublishPreview/view.jsx
+++ b/ui/modal/modalPublishPreview/view.jsx
@@ -1,5 +1,6 @@
// @flow
import React from 'react';
+import moment from 'moment';
import Button from 'component/button';
import { Form, FormField } from 'component/common/form';
import { Modal } from 'modal/modal';
@@ -27,6 +28,7 @@ type Props = {
currency: string,
},
language: string,
+ release_time: ?string,
licenseType: string,
otherLicenseDescription: ?string,
licenseUrl: ?string,
@@ -89,6 +91,7 @@ class ModalPublishPreview extends React.PureComponent {
contentIsFree,
fee,
language,
+ release_time,
licenseType,
otherLicenseDescription,
licenseUrl,
@@ -176,6 +179,7 @@ class ModalPublishPreview extends React.PureComponent {
{this.createRow(__('Deposit'), depositValue)}
{this.createRow(__('Price'), priceValue)}
{this.createRow(__('Language'), language)}
+ {this.createRow(__('Release Date'), moment(release_time).format('MMMM Do, YYYY'))}
{this.createRow(__('License'), licenseValue)}
{this.createRow(__('Tags'), tagsValue)}
diff --git a/ui/scss/component/_card.scss b/ui/scss/component/_card.scss
index 55b8027f4..ae4e97ce5 100644
--- a/ui/scss/component/_card.scss
+++ b/ui/scss/component/_card.scss
@@ -10,6 +10,11 @@
}
}
+.card--enable-overflow {
+ overflow: visible;
+ margin-bottom: var(--spacing-m);
+}
+
.card--disabled {
opacity: 0.3;
pointer-events: none;
diff --git a/ui/scss/component/_form-field.scss b/ui/scss/component/_form-field.scss
index ffbe29d27..2a928e858 100644
--- a/ui/scss/component/_form-field.scss
+++ b/ui/scss/component/_form-field.scss
@@ -2,7 +2,8 @@
input,
textarea,
-select {
+select,
+.date-picker-input {
height: var(--height-input);
border-radius: var(--border-radius);
border: 1px solid;
@@ -459,3 +460,34 @@ fieldset-section {
}
}
}
+
+.date-picker-input {
+ .react-date-picker__wrapper {
+ border: 0;
+ }
+}
+
+.form-field-date-picker-label {
+ display: block;
+}
+
+.form-field-date-picker {
+ border-radius: var(--card-radius);
+ border: 1px solid var(--color-border);
+}
+
+.react-date-picker__calendar {
+ z-index: 1000;
+}
+
+.react-calendar__tile--now,
+.react-calendar__tile--now:enabled:hover,
+.react-calendar__tile--now:enabled:focus {
+ background: var(--color-primary-alt);
+}
+
+.react-calendar__tile--active,
+.react-calendar__tile--active:enabled:hover,
+.react-calendar__tile--active:enabled:focus {
+ background: var(--color-primary);
+}
diff --git a/yarn.lock b/yarn.lock
index 6343512f5..b369c6b07 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1708,6 +1708,11 @@
version "1.5.2"
resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8"
+"@types/react-calendar@^3.0.0":
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/@types/react-calendar/-/react-calendar-3.1.3.tgz#bd0947c28738f6419649be22d80624b05fde2fb9"
+ integrity sha512-4kvDfKta9bNnuRieuGYPxdDlh3UqRUKE8+fMbmZGk0Z/MdUGHupxXwPCWLbVH7FZU48o4bhT+XX8rfZrexdnAw==
+
"@types/semver@^7.1.0":
version "7.1.0"
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.1.0.tgz#c8c630d4c18cd326beff77404887596f96408408"
@@ -1951,6 +1956,11 @@
"@webassemblyjs/wast-parser" "1.8.5"
"@xtuc/long" "4.2.2"
+"@wojtekmaj/date-utils@^1.0.2", "@wojtekmaj/date-utils@^1.0.3":
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/@wojtekmaj/date-utils/-/date-utils-1.0.3.tgz#2dcfd92881425c5923e429c2aec86fb3609032a1"
+ integrity sha512-1VPkkTBk07gMR1fjpBtse4G+oJqpmE+0gUFB0dg3VIL7qJmUVaBoD/vlzMm/jNeOPfvlmerl1lpnsZyBUFIRuw==
+
"@xtuc/ieee754@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
@@ -3972,6 +3982,11 @@ destroy@~1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+detect-element-overflow@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/detect-element-overflow/-/detect-element-overflow-1.2.0.tgz#86e504292ffedc3aef813395fbdf0261aaf6afa9"
+ integrity sha512-Jtr9ivYPhpd9OJux+hjL0QjUKiS1Ghgy8tvIufUjFslQgIWvgGr4mn57H190APbKkiOmXnmtMI6ytaKzMusecg==
+
detect-file@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
@@ -5478,6 +5493,13 @@ get-stream@^5.1.0:
dependencies:
pump "^3.0.0"
+get-user-locale@^1.2.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/get-user-locale/-/get-user-locale-1.4.0.tgz#a2c4b5da46feec9f03c9b07d197b1620490a5370"
+ integrity sha512-gQo03lP1OArHLKlnoglqrGGl7b04u2EP9Xutmp72cMdtrrSD7ZgIsCsUKZynYWLDkVJW33Cj3pliP7uP0UonHQ==
+ dependencies:
+ lodash.once "^4.1.1"
+
get-value@^2.0.3, get-value@^2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
@@ -7178,6 +7200,11 @@ lodash.memoize@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+lodash.once@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
+ integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=
+
lodash.pickby@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff"
@@ -7342,6 +7369,11 @@ make-dir@^3.0.2:
dependencies:
semver "^6.0.0"
+make-event-props@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/make-event-props/-/make-event-props-1.2.0.tgz#96b87d88919533b8f8934b58b4c3d5679459a0cf"
+ integrity sha512-BmWFkm/jZzVH9A0tEBdkjAARUz/eha+5IRyfOndeSMKRadkgR5DawoBHoRwLxkYmjJOI5bHkXKpaZocxj+dKgg==
+
mamacro@^0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4"
@@ -7498,6 +7530,11 @@ memory-fs@^0.5.0:
errno "^0.1.3"
readable-stream "^2.0.1"
+merge-class-names@^1.1.1:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/merge-class-names/-/merge-class-names-1.4.0.tgz#02edcdd5ff677fbb03b47ecd4586df89d697b81b"
+ integrity sha512-xNdBM7s+6uD+vNZJEymqrFbMBCDGzoA8clZTcj2F1XIy1QQKF+wjFVv7iDZFfdCBnViTdt54A4Ye2lmBsXrBjQ==
+
merge-descriptors@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
@@ -9208,6 +9245,16 @@ react-awesome-lightbox@^1.7.3:
resolved "https://registry.yarnpkg.com/react-awesome-lightbox/-/react-awesome-lightbox-1.7.3.tgz#ee1c00fd4197e0e65bf996aa219eac4d8b6db5a0"
integrity sha512-mSxdL3KGzuh2eR8I00nv9njiolmMoXITuCvfd71DBXK13JW3e+Z/sCMENS9+dngBJU8/m7dR1Ix0W6afS5cFsA==
+react-calendar@^3.3.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/react-calendar/-/react-calendar-3.3.1.tgz#da691a5d59c88f178695fd8b33909a71d698021f"
+ integrity sha512-iDIrhE0ABz3mChAIvA+5d2UtQGEb5oaUpLiEbrRdWHBYb45MhsbO59pG9HIy2uTdHkBF/nvzRV2JBmMfdg/0Qg==
+ dependencies:
+ "@wojtekmaj/date-utils" "^1.0.2"
+ get-user-locale "^1.2.0"
+ merge-class-names "^1.1.1"
+ prop-types "^15.6.0"
+
react-compound-slider@^2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/react-compound-slider/-/react-compound-slider-2.5.0.tgz#99771a3397f4ab00aa2a37f8410da87e6ca2449b"
@@ -9224,6 +9271,21 @@ react-confetti@^4.0.1:
dependencies:
tween-functions "^1.2.0"
+react-date-picker@^8.0.7:
+ version "8.0.7"
+ resolved "https://registry.yarnpkg.com/react-date-picker/-/react-date-picker-8.0.7.tgz#43585751feeaf2b790eea8c343c3fcb35ad95ede"
+ integrity sha512-ZuS9NPHUUz0zeeXlYOfq58cteHLRC94NO76ti28aN/Ybi9nugG2SfR46i/5xTL5094rRPiXJveGA1P1cJqQMsg==
+ dependencies:
+ "@types/react-calendar" "^3.0.0"
+ "@wojtekmaj/date-utils" "^1.0.3"
+ get-user-locale "^1.2.0"
+ make-event-props "^1.1.0"
+ merge-class-names "^1.1.1"
+ prop-types "^15.6.0"
+ react-calendar "^3.3.1"
+ react-fit "^1.0.3"
+ update-input-width "^1.1.1"
+
react-dom@^16.8.2:
version "16.13.0"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.0.tgz#cdde54b48eb9e8a0ca1b3dc9943d9bb409b81866"
@@ -9240,6 +9302,14 @@ react-draggable@^3.3.0:
classnames "^2.2.5"
prop-types "^15.6.0"
+react-fit@^1.0.3:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/react-fit/-/react-fit-1.3.1.tgz#850cb5d554fdfa4b27891f62a9d290d3e7eda57b"
+ integrity sha512-MmVk/SXyVbxiz9peAeD7fWxFdGLoy/sCxte01M3w74regPIVkLqc2yT0wUAGRd1MNP1fQ40MqYKNBLpbK/aI1w==
+ dependencies:
+ detect-element-overflow "^1.2.0"
+ prop-types "^15.6.0"
+
react-google-recaptcha@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/react-google-recaptcha/-/react-google-recaptcha-2.0.1.tgz#3276b29659493f7ca2a5b7739f6c239293cdf1d8"
@@ -11329,6 +11399,11 @@ upath@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
+update-input-width@^1.1.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/update-input-width/-/update-input-width-1.2.1.tgz#769d6182413590c3b50b52ffa9c65d79e2c17f95"
+ integrity sha512-zygDshqDb2C2/kgfoD423n5htv/3OBF7aTaz2u2zZy998EJki8njOHOeZjKEd8XSYeDziIX1JXfMsKaIRJeJ/Q==
+
update-notifier@^2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6"