Allow GoToSocial users to post with past dates
Signed-off-by: mkljczk <git@mkljczk.pl>
This commit is contained in:
@ -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
|
||||
|
||||
@ -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": {
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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<IScheduleForm> = ({ 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<IScheduleForm> = ({ 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<IScheduleForm> = ({ 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),
|
||||
})}
|
||||
/>
|
||||
</Suspense>
|
||||
|
||||
@ -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"
|
||||
|
||||
Reference in New Issue
Block a user