Allow GoToSocial users to post with past dates

Signed-off-by: mkljczk <git@mkljczk.pl>
This commit is contained in:
mkljczk
2025-02-22 21:03:26 +01:00
parent 46511240f7
commit e80f49673d
6 changed files with 37 additions and 18 deletions

View File

@ -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

View File

@ -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": {

View File

@ -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",

View File

@ -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 {

View File

@ -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>

View File

@ -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"