diff --git a/packages/pl-api/lib/features.ts b/packages/pl-api/lib/features.ts index d4c98f1dc..9d40bf87f 100644 --- a/packages/pl-api/lib/features.ts +++ b/packages/pl-api/lib/features.ts @@ -491,7 +491,7 @@ const getFeatures = (instance: Instance) => { editStatuses: any([ v.software === FIREFISH, v.software === FRIENDICA && gte(v.version, '2022.12.0'), - v.software === GOTOSOCIAL && gte(v.version, '0.17.4'), + v.software === GOTOSOCIAL && gte(v.version, '0.18.0'), v.software === ICESHRIMP, v.software === ICESHRIMP_NET, v.software === MASTODON, @@ -1210,6 +1210,15 @@ const getFeatures = (instance: Instance) => { v.software === GOTOSOCIAL, ]), + /** + * Can publish statuses with a past date. This is intended for importing old statuses. + * @see POST /api/v1/statuses + * @see {@link https://docs.gotosocial.org/en/latest/api/swagger/} + */ + scheduledStatusesBackwards: any([ + v.software === GOTOSOCIAL && gte(v.version, '0.18.0'), + ]), + /** * Can create Listen activities * @see GET /api/v1/pleroma/accounts/:id/scrobbles diff --git a/packages/pl-api/package.json b/packages/pl-api/package.json index db6934af6..d43edcd43 100644 --- a/packages/pl-api/package.json +++ b/packages/pl-api/package.json @@ -1,6 +1,6 @@ { "name": "pl-api", - "version": "1.0.0-rc.24", + "version": "1.0.0-rc.25", "type": "module", "homepage": "https://github.com/mkljczk/pl-fe/tree/develop/packages/pl-api", "repository": { diff --git a/packages/pl-fe/package.json b/packages/pl-fe/package.json index 2e5ceffe4..be4a2cd24 100644 --- a/packages/pl-fe/package.json +++ b/packages/pl-fe/package.json @@ -102,7 +102,7 @@ "multiselect-react-dropdown": "^2.0.25", "mutative": "^1.1.0", "path-browserify": "^1.0.1", - "pl-api": "^1.0.0-rc.24", + "pl-api": "^1.0.0-rc.25", "postcss": "^8.4.49", "process": "^0.11.10", "punycode": "^2.1.1", diff --git a/packages/pl-fe/src/actions/compose.ts b/packages/pl-fe/src/actions/compose.ts index 022a75692..7767fa72f 100644 --- a/packages/pl-fe/src/actions/compose.ts +++ b/packages/pl-fe/src/actions/compose.ts @@ -328,7 +328,7 @@ const validateSchedule = (state: RootState, composeId: string) => { const fiveMinutesFromNow = new Date(new Date().getTime() + 300000); - return schedule.getTime() > fiveMinutesFromNow.getTime(); + return schedule.getTime() > fiveMinutesFromNow.getTime() || (state.auth.client.features.scheduledStatusesBackwards && schedule.getTime() < new Date().getTime()); }; interface SubmitComposeOpts { diff --git a/packages/pl-fe/src/features/compose/components/schedule-form.tsx b/packages/pl-fe/src/features/compose/components/schedule-form.tsx index 0009912d0..da4b3b054 100644 --- a/packages/pl-fe/src/features/compose/components/schedule-form.tsx +++ b/packages/pl-fe/src/features/compose/components/schedule-form.tsx @@ -1,5 +1,5 @@ import clsx from 'clsx'; -import React, { Suspense } from 'react'; +import React, { Suspense, useCallback } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; import { setSchedule, removeSchedule } from 'pl-fe/actions/compose'; @@ -11,13 +11,12 @@ import Text from 'pl-fe/components/ui/text'; import { DatePicker } from 'pl-fe/features/ui/util/async-components'; import { useAppDispatch } from 'pl-fe/hooks/use-app-dispatch'; import { useCompose } from 'pl-fe/hooks/use-compose'; +import { useFeatures } from 'pl-fe/hooks/use-features'; -const isCurrentOrFutureDate = (date: Date) => - date && new Date().setHours(0, 0, 0, 0) <= new Date(date).setHours(0, 0, 0, 0); +const isCurrentOrFutureDate = (date: Date) => (date && new Date().setHours(0, 0, 0, 0) <= new Date(date).setHours(0, 0, 0, 0)); -const isFiveMinutesFromNow = (time: Date) => { - const fiveMinutesFromNow = new Date(new Date().getTime() + 300000); // now, plus five minutes (Pleroma won't schedule posts ) - const selectedDate = new Date(time); +const isFiveMinutesFromNow = (selectedDate: Date) => { + const fiveMinutesFromNow = new Date(new Date().getTime() + 1000 * 60 * 5); return fiveMinutesFromNow.getTime() < selectedDate.getTime(); }; @@ -34,6 +33,7 @@ interface IScheduleForm { const ScheduleForm: React.FC = ({ composeId }) => { const dispatch = useAppDispatch(); const intl = useIntl(); + const features = useFeatures(); const scheduledAt = useCompose(composeId).schedule; const active = !!scheduledAt; @@ -48,6 +48,11 @@ const ScheduleForm: React.FC = ({ composeId }) => { e.preventDefault(); }; + const isValidTime = useCallback( + (date: Date) => isFiveMinutesFromNow(date) || features.scheduledStatusesBackwards && new Date().getTime() > date.getTime(), + [features.scheduledStatusesBackwards], + ); + if (!active) { return null; } @@ -67,10 +72,10 @@ const ScheduleForm: React.FC = ({ composeId }) => { wrapperClassName='react-datepicker-wrapper' onChange={onSchedule} placeholderText={intl.formatMessage(messages.schedule)} - filterDate={isCurrentOrFutureDate} - filterTime={isFiveMinutesFromNow} + filterDate={features.scheduledStatusesBackwards ? undefined : isCurrentOrFutureDate} + filterTime={isValidTime} className={clsx({ - 'has-error': !isFiveMinutesFromNow(scheduledAt), + 'has-error': !isValidTime(scheduledAt), })} /> diff --git a/packages/pl-fe/yarn.lock b/packages/pl-fe/yarn.lock index e443127bb..ad4878c64 100644 --- a/packages/pl-fe/yarn.lock +++ b/packages/pl-fe/yarn.lock @@ -7548,10 +7548,10 @@ pkg-dir@^4.1.0: dependencies: find-up "^4.0.0" -pl-api@^1.0.0-rc.24: - version "1.0.0-rc.24" - resolved "https://registry.yarnpkg.com/pl-api/-/pl-api-1.0.0-rc.24.tgz#7c11a5fc8af089b15721c746a60d0c7b1a14f435" - integrity sha512-4FRcRk5DEkaWoSv001UowqJ1BFPn4bY2TYZ+ic44MPMGxytt5WlXes9OwJJA68BOmVi7jl7SQfPk7joPuXXoBg== +pl-api@^1.0.0-rc.25: + version "1.0.0-rc.25" + resolved "https://registry.yarnpkg.com/pl-api/-/pl-api-1.0.0-rc.25.tgz#74e564ae7f8cbf5bf9c41746c0f9a180395389dd" + integrity sha512-DyWGDXnBaK83PrhkrHGEdO6OLdEce9J+i4AdpUDEYuY+GqpyLqoRR5if4GDxVjZsYgihd/aHvZsXKORxLte6uA== dependencies: blurhash "^2.0.5" http-link-header "^1.1.3" @@ -7560,7 +7560,7 @@ pl-api@^1.0.0-rc.24: lodash.pick "^4.4.0" object-to-formdata "^4.5.1" query-string "^9.1.1" - semver "^7.6.3" + semver "^7.7.1" valibot "^1.0.0-beta.12" possible-typed-array-names@^1.0.0: @@ -8636,6 +8636,11 @@ semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.4, semver@^7.6.0, semve resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== +semver@^7.7.1: + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + serialize-javascript@^6.0.1, serialize-javascript@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2"