pl-fe: Move compose event form to a separate page

Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
This commit is contained in:
marcin mikołajczak 2024-11-04 20:05:25 +01:00
parent 071c46e09a
commit f7414a2470
81 changed files with 410 additions and 408 deletions

View file

@ -1,7 +1,6 @@
import { defineMessages } from 'react-intl';
import { getClient } from 'pl-fe/api';
import { useModalsStore } from 'pl-fe/stores/modals';
import toast from 'pl-fe/toast';
import { importEntities } from './importer';
@ -131,7 +130,6 @@ const submitEvent = ({
? getClient(state).events.createEvent(params)
: getClient(state).events.editEvent(statusId, params)
).then((data) => {
useModalsStore.getState().closeModal('COMPOSE_EVENT');
dispatch(importEntities({ statuses: [data] }));
dispatch(submitEventSuccess(data));
toast.success(
@ -141,6 +139,8 @@ const submitEvent = ({
actionLink: `/@${data.account.acct}/events/${data.id}`,
},
);
return data;
}).catch((error) => {
dispatch(submitEventFail(error));
});
@ -446,9 +446,7 @@ interface EventFormSetAction {
text: string;
}
const editEvent = (statusId: string) => (dispatch: AppDispatch, getState: () => RootState) => {
const status = getState().statuses.get(statusId)!;
const initEventEdit = (statusId: string) => (dispatch: AppDispatch, getState: () => RootState) => {
dispatch({ type: STATUS_FETCH_SOURCE_REQUEST, statusId });
return getClient(getState()).statuses.getStatusSource(statusId).then(response => {
@ -458,11 +456,7 @@ const editEvent = (statusId: string) => (dispatch: AppDispatch, getState: () =>
composeId: `compose-event-modal-${statusId}`,
text: response.text,
});
useModalsStore.getState().openModal('COMPOSE_EVENT', {
status,
statusText: response.text,
location: response.location || undefined,
});
return response;
}).catch(error => {
dispatch({ type: STATUS_FETCH_SOURCE_FAIL, statusId, error });
});
@ -592,7 +586,7 @@ export {
rejectEventParticipationRequestFail,
fetchEventIcs,
cancelEventCompose,
editEvent,
initEventEdit,
fetchRecentEvents,
fetchJoinedEvents,
type EventsAction,

View file

@ -42,7 +42,7 @@ const EventPreview: React.FC<IEventPreview> = ({ status, className, hideAction,
<Button
size='sm'
theme={floatingAction ? 'secondary' : 'primary'}
to={`/@${account.acct}/events/${status.id}`}
to={`/@${account.acct}/events/${status.id}/edit`}
>
<FormattedMessage id='event.manage' defaultMessage='Manage' />
</Button>

View file

@ -26,14 +26,6 @@ const checkComposeContent = (compose?: ReturnType<typeof ReducerCompose>) =>
compose.poll !== null,
].some(check => check === true);
// const checkEventComposeContent = (compose?: ReturnType<typeof ReducerComposeEvent>) =>
// !!compose && [
// compose.name.length > 0,
// compose.status.length > 0,
// compose.location !== null,
// compose.banner !== null,
// ].some(check => check === true);
interface IModalRoot {
onCancel?: () => void;
onClose: (type?: ModalType) => void;
@ -69,7 +61,6 @@ const ModalRoot: React.FC<IModalRoot> = ({ children, onCancel, onClose, type })
dispatch((_, getState) => {
const compose = getState().compose.get('compose-modal');
const hasComposeContent = checkComposeContent(compose);
// const hasEventComposeContent = checkEventComposeContent(getState().compose_event);
if (hasComposeContent && type === 'COMPOSE') {
const isEditing = compose!.id !== null;
@ -95,26 +86,7 @@ const ModalRoot: React.FC<IModalRoot> = ({ children, onCancel, onClose, type })
dispatch(cancelReplyCompose());
},
});
// TODO: restore this functionality
// } else if (hasEventComposeContent && type === 'COMPOSE_EVENT') {
// const isEditing = getState().compose_event.id !== null;
// openModal('CONFIRM', {
// heading: isEditing
// ? <FormattedMessage id='confirmations.cancel_event_editing.heading' defaultMessage='Cancel event editing' />
// : <FormattedMessage id='confirmations.delete_event.heading' defaultMessage='Delete event' />,
// message: isEditing
// ? <FormattedMessage id='confirmations.cancel_event_editing.message' defaultMessage='Are you sure you want to cancel editing this event? All changes will be lost.' />
// : <FormattedMessage id='confirmations.delete_event.message' defaultMessage='Are you sure you want to delete this event?' />,
// confirm: intl.formatMessage(isEditing ? messages.cancelEditing : messages.confirm),
// onConfirm: () => {
// onClose('COMPOSE_EVENT');
// dispatch(cancelEventCompose());
// },
// onCancel: () => {
// onClose('CONFIRM');
// },
// });
} else if ((hasComposeContent/* || hasEventComposeContent */) && type === 'CONFIRM') {
} else if (hasComposeContent && type === 'CONFIRM') {
onClose('CONFIRM');
} else {
onClose();

View file

@ -7,7 +7,6 @@ import { createSelector } from 'reselect';
import { blockAccount } from 'pl-fe/actions/accounts';
import { directCompose, mentionCompose, quoteCompose, replyCompose } from 'pl-fe/actions/compose';
import { emojiReact, unEmojiReact } from 'pl-fe/actions/emoji-reacts';
import { editEvent } from 'pl-fe/actions/events';
import { toggleBookmark, toggleDislike, toggleFavourite, togglePin, toggleReblog } from 'pl-fe/actions/interactions';
import { deleteStatusModal, toggleStatusSensitivityModal } from 'pl-fe/actions/moderation';
import { initMuteModal } from 'pl-fe/actions/mutes';
@ -648,7 +647,7 @@ const MenuButton: React.FC<IMenuButton> = ({
};
const handleEditClick: React.EventHandler<React.MouseEvent> = () => {
if (status.event) dispatch(editEvent(status.id));
if (status.event) history.push(`/@${status.account.acct}/events/${status.id}/edit`);
else dispatch(editStatus(status.id));
};

View file

@ -0,0 +1,67 @@
import React, { useEffect, useState } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { cancelEventCompose } from 'pl-fe/actions/events';
import Column from 'pl-fe/components/ui/column';
import Stack from 'pl-fe/components/ui/stack';
import Tabs from 'pl-fe/components/ui/tabs';
import { useAppDispatch } from 'pl-fe/hooks/use-app-dispatch';
import { EditEvent } from './tabs/edit-event';
import { ManagePendingParticipants } from './tabs/manage-pending-participants';
const messages = defineMessages({
manageEvent: { id: 'navigation_bar.manage_event', defaultMessage: 'Manage event' },
createEvent: { id: 'navigation_bar.create_event', defaultMessage: 'Create new event' },
edit: { id: 'compose_event.tabs.edit', defaultMessage: 'Edit details' },
pending: { id: 'compose_event.tabs.pending', defaultMessage: 'Manage requests' },
});
type RouteParams = {
statusId?: string;
};
interface IComposeEvent {
params: RouteParams;
}
const ComposeEvent: React.FC<IComposeEvent> = ({ params }) => {
const intl = useIntl();
const dispatch = useAppDispatch();
const statusId = params.statusId || null;
const [tab, setTab] = useState<'edit' | 'pending'>('edit');
useEffect(() => () => {
dispatch(cancelEventCompose());
}, [statusId]);
const renderTabs = () => {
const items = [
{
text: intl.formatMessage(messages.edit),
action: () => setTab('edit'),
name: 'edit',
},
{
text: intl.formatMessage(messages.pending),
action: () => setTab('pending'),
name: 'pending',
},
];
return <Tabs items={items} activeItem={tab} />;
};
return (
<Column label={intl.formatMessage(statusId ? messages.manageEvent : messages.createEvent)}>
<Stack space={2}>
{statusId && renderTabs()}
{tab === 'edit' ? <EditEvent statusId={statusId} /> : <ManagePendingParticipants statusId={statusId!} />}
</Stack>
</Column>
);
};
export { ComposeEvent as default };

View file

@ -1,42 +1,38 @@
import React, { useEffect, useState } from 'react';
import React, { useCallback, useEffect, useState } from 'react';
import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
import { useHistory } from 'react-router-dom';
import { resetCompose } from 'pl-fe/actions/compose';
import {
submitEvent,
fetchEventParticipationRequests,
rejectEventParticipationRequest,
authorizeEventParticipationRequest,
cancelEventCompose,
initEventEdit,
submitEvent,
} from 'pl-fe/actions/events';
import { uploadFile } from 'pl-fe/actions/media';
import { fetchStatus } from 'pl-fe/actions/statuses';
import { ADDRESS_ICONS } from 'pl-fe/components/autosuggest-location';
import LocationSearch from 'pl-fe/components/location-search';
import Button from 'pl-fe/components/ui/button';
import Form from 'pl-fe/components/ui/form';
import FormActions from 'pl-fe/components/ui/form-actions';
import FormGroup from 'pl-fe/components/ui/form-group';
import HStack from 'pl-fe/components/ui/hstack';
import Icon from 'pl-fe/components/ui/icon';
import IconButton from 'pl-fe/components/ui/icon-button';
import Input from 'pl-fe/components/ui/input';
import Modal from 'pl-fe/components/ui/modal';
import Spinner from 'pl-fe/components/ui/spinner';
import Stack from 'pl-fe/components/ui/stack';
import Tabs from 'pl-fe/components/ui/tabs';
import Text from 'pl-fe/components/ui/text';
import Toggle from 'pl-fe/components/ui/toggle';
import AccountContainer from 'pl-fe/containers/account-container';
import { isCurrentOrFutureDate } from 'pl-fe/features/compose/components/schedule-form';
import { ComposeEditor, DatePicker } from 'pl-fe/features/ui/util/async-components';
import { useAppDispatch } from 'pl-fe/hooks/use-app-dispatch';
import { useAppSelector } from 'pl-fe/hooks/use-app-selector';
import { useModalsStore } from 'pl-fe/stores/modals';
import { makeGetStatus } from 'pl-fe/selectors';
import toast from 'pl-fe/toast';
import UploadButton from './upload-button';
import UploadButton from '../components/upload-button';
import type { BaseModalProps } from '../../modal-root';
import type { Location } from 'pl-api';
import type { MinifiedStatus } from 'pl-fe/reducers/statuses';
const messages = defineMessages({
eventNamePlaceholder: { id: 'compose_event.fields.name_placeholder', defaultMessage: 'Name' },
@ -44,86 +40,32 @@ const messages = defineMessages({
eventStartTimePlaceholder: { id: 'compose_event.fields.start_time_placeholder', defaultMessage: 'Event begins on…' },
eventEndTimePlaceholder: { id: 'compose_event.fields.end_time_placeholder', defaultMessage: 'Event ends on…' },
resetLocation: { id: 'compose_event.reset_location', defaultMessage: 'Reset location' },
edit: { id: 'compose_event.tabs.edit', defaultMessage: 'Edit details' },
pending: { id: 'compose_event.tabs.pending', defaultMessage: 'Manage requests' },
authorize: { id: 'compose_event.participation_requests.authorize', defaultMessage: 'Authorize' },
reject: { id: 'compose_event.participation_requests.reject', defaultMessage: 'Reject' },
confirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },
cancelEditing: { id: 'confirmations.cancel_editing.confirm', defaultMessage: 'Cancel editing' },
eventFetchFail: { id: 'compose_event.fetch_fail', defaultMessage: 'Failed to fetch edited event information' },
});
interface IAccount {
eventId: string;
id: string;
participationMessage: string | null;
interface IEditEvent {
statusId: string | null;
}
const Account: React.FC<IAccount> = ({ eventId, id, participationMessage }) => {
const EditEvent: React.FC<IEditEvent> = ({ statusId }) => {
const intl = useIntl();
const dispatch = useAppDispatch();
const history = useHistory();
const handleAuthorize = () => {
dispatch(authorizeEventParticipationRequest(eventId, id));
};
const handleReject = () => {
dispatch(rejectEventParticipationRequest(eventId, id));
};
return (
<AccountContainer
id={id}
note={participationMessage || undefined}
action={
<HStack space={2}>
<Button
theme='secondary'
size='sm'
text={intl.formatMessage(messages.authorize)}
onClick={handleAuthorize}
/>
<Button
theme='danger'
size='sm'
text={intl.formatMessage(messages.reject)}
onClick={handleReject}
/>
</HStack>
}
/>
);
};
interface ComposeEventModalProps {
status?: MinifiedStatus;
statusText?: string;
location?: Location;
}
const ComposeEventModal: React.FC<BaseModalProps & ComposeEventModalProps> = ({
onClose,
status,
statusText,
location: sourceLocation,
}) => {
const intl = useIntl();
const dispatch = useAppDispatch();
const { openModal } = useModalsStore();
const [tab, setTab] = useState<'edit' | 'pending'>('edit');
const getStatus = useCallback(makeGetStatus(), []);
const status = useAppSelector((state) => statusId ? getStatus(state, { id: statusId }) : undefined);
const [name, setName] = useState(status?.event?.name || '');
const [text, setText] = useState(statusText || '');
const [text, setText] = useState('');
const [startTime, setStartTime] = useState(status?.event?.start_time ? new Date(status.event.start_time) : new Date());
const [endTime, setEndTime] = useState(status?.event?.end_time ? new Date(status.event.end_time) : null);
const [approvalRequired, setApprovalRequired] = useState(status?.event?.join_mode !== 'free');
const [banner, setBanner] = useState(status?.event?.banner || null);
const [location, setLocation] = useState(sourceLocation || null);
const [location, setLocation] = useState<Location | null>(null);
const [isSubmitting, setIsSubmitting] = useState(false);
const [isDisabled, setIsDisabled] = useState(!!statusId);
const [isUploading, setIsUploading] = useState(false);
const statusId = status?.id || null;
const composeId = statusId ? `compose-event-modal-${statusId}` : 'compose-event-modal';
const onChangeName: React.ChangeEventHandler<HTMLInputElement> = ({ target }) => {
@ -163,26 +105,6 @@ const ComposeEventModal: React.FC<BaseModalProps & ComposeEventModalProps> = ({
});
};
const onClickClose = () => {
if (name.length || text.length || location || banner) {
openModal('CONFIRM', {
heading: statusId
? <FormattedMessage id='confirmations.cancel_event_editing.heading' defaultMessage='Cancel event editing' />
: <FormattedMessage id='confirmations.delete_event.heading' defaultMessage='Delete event' />,
message: statusId
? <FormattedMessage id='confirmations.cancel_event_editing.message' defaultMessage='Are you sure you want to cancel editing this event? All changes will be lost.' />
: <FormattedMessage id='confirmations.delete_event.message' defaultMessage='Are you sure you want to delete this event?' />,
confirm: intl.formatMessage(messages.confirm),
onConfirm: () => {
onClose('COMPOSE_EVENT');
dispatch(cancelEventCompose());
},
});
} else {
onClose('COMPOSE_EVENT');
}
};
const handleFiles = (files: FileList) => {
setIsUploading(true);
@ -202,7 +124,7 @@ const ComposeEventModal: React.FC<BaseModalProps & ComposeEventModalProps> = ({
};
const handleSubmit = () => {
setIsSubmitting(true);
setIsDisabled(true);
dispatch(submitEvent({
statusId,
@ -213,19 +135,38 @@ const ComposeEventModal: React.FC<BaseModalProps & ComposeEventModalProps> = ({
endTime,
joinMode: approvalRequired ? 'restricted' : 'free',
location,
})).then(() => {
setIsSubmitting(false);
})).then((status) => {
if (status) history.push(`/@${status.account.acct}/events/${status.id}`);
dispatch(resetCompose(composeId));
}).catch(() => {
setIsSubmitting(false);
});
};
const accounts = useAppSelector((state) => state.user_lists.event_participation_requests.get(statusId!)?.items);
useEffect(() => {
if (statusId) dispatch(fetchEventParticipationRequests(statusId));
}, []);
if (statusId) {
Promise.all([dispatch(initEventEdit(statusId)), dispatch(fetchStatus(statusId))])
.then(([source, status]) => {
if (!source || !status) throw new Error();
setText(source.text);
setLocation(source.location);
setName(status?.event?.name || '');
setStartTime(status?.event?.start_time ? new Date(status.event.start_time) : new Date());
setEndTime(status?.event?.end_time ? new Date(status.event.end_time) : null);
setApprovalRequired(status?.event?.join_mode !== 'free');
setBanner(status?.media_attachments[0] || null);
setIsDisabled(false);
}).catch(() => {
toast.error(messages.eventFetchFail);
});
}
return () => {
dispatch(cancelEventCompose());
};
}, [statusId]);
const renderLocation = () => location && (
<HStack className='h-[38px] text-gray-700 dark:text-gray-500' alignItems='center' space={2}>
@ -238,26 +179,8 @@ const ComposeEventModal: React.FC<BaseModalProps & ComposeEventModalProps> = ({
</HStack>
);
const renderTabs = () => {
const items = [
{
text: intl.formatMessage(messages.edit),
action: () => setTab('edit'),
name: 'edit',
},
{
text: intl.formatMessage(messages.pending),
action: () => setTab('pending'),
name: 'pending',
},
];
return <Tabs items={items} activeItem={tab} />;
};
let body;
if (tab === 'edit') body = (
<Form>
return (
<Form onSubmit={handleSubmit}>
<FormGroup
labelText={<FormattedMessage id='compose_event.fields.banner_label' defaultMessage='Event banner' />}
hintText={<FormattedMessage id='compose_event.fields.banner_hint' defaultMessage='PNG, GIF or JPG. Landscape format is preferred.' />}
@ -287,6 +210,7 @@ const ComposeEventModal: React.FC<BaseModalProps & ComposeEventModalProps> = ({
labelText={<FormattedMessage id='compose_event.fields.description_label' defaultMessage='Event description' />}
>
<ComposeEditor
key={String(isDisabled)}
className='block w-full rounded-md border border-gray-400 bg-white px-3 py-2 text-base text-gray-900 ring-1 placeholder:text-gray-600 focus-within:border-primary-500 focus-within:ring-primary-500 black:bg-black dark:border-gray-800 dark:bg-gray-900 dark:text-gray-100 dark:ring-gray-800 dark:placeholder:text-gray-600 dark:focus-within:border-primary-500 dark:focus-within:ring-primary-500 sm:text-sm'
placeholderClassName='pt-2'
composeId={composeId}
@ -354,38 +278,15 @@ const ComposeEventModal: React.FC<BaseModalProps & ComposeEventModalProps> = ({
</Text>
</HStack>
)}
<FormActions>
<Button disabled={isDisabled} theme='primary' type='submit'>
{statusId
? <FormattedMessage id='compose_event.update' defaultMessage='Update' />
: <FormattedMessage id='compose_event.create' defaultMessage='Create' />}
</Button>
</FormActions>
</Form>
);
else body = accounts ? (
<Stack space={3}>
{accounts.size > 0 ? (
accounts.map(({ account, participation_message }) =>
<Account key={account} eventId={statusId!} id={account} participationMessage={participation_message} />,
)
) : (
<FormattedMessage id='empty_column.event_participant_requests' defaultMessage='There are no pending event participation requests.' />
)}
</Stack>
) : <Spinner />;
return (
<Modal
title={statusId
? <FormattedMessage id='navigation_bar.compose_event' defaultMessage='Manage event' />
: <FormattedMessage id='navigation_bar.create_event' defaultMessage='Create new event' />}
confirmationAction={tab === 'edit' ? handleSubmit : undefined}
confirmationText={statusId
? <FormattedMessage id='compose_event.update' defaultMessage='Update' />
: <FormattedMessage id='compose_event.create' defaultMessage='Create' />}
confirmationDisabled={isSubmitting}
onClose={onClickClose}
>
<Stack space={2}>
{statusId && renderTabs()}
{body}
</Stack>
</Modal>
);
};
export { ComposeEventModal as default, type ComposeEventModalProps };
export { EditEvent };

View file

@ -0,0 +1,98 @@
import React, { useEffect } from 'react';
import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
import {
fetchEventParticipationRequests,
rejectEventParticipationRequest,
authorizeEventParticipationRequest,
cancelEventCompose,
} from 'pl-fe/actions/events';
import ScrollableList from 'pl-fe/components/scrollable-list';
import Button from 'pl-fe/components/ui/button';
import HStack from 'pl-fe/components/ui/hstack';
import Spinner from 'pl-fe/components/ui/spinner';
import Stack from 'pl-fe/components/ui/stack';
import AccountContainer from 'pl-fe/containers/account-container';
import { useAppDispatch } from 'pl-fe/hooks/use-app-dispatch';
import { useAppSelector } from 'pl-fe/hooks/use-app-selector';
const messages = defineMessages({
authorize: { id: 'compose_event.participation_requests.authorize', defaultMessage: 'Authorize' },
reject: { id: 'compose_event.participation_requests.reject', defaultMessage: 'Reject' },
});
interface IAccount {
eventId: string;
id: string;
participationMessage: string | null;
}
const Account: React.FC<IAccount> = ({ eventId, id, participationMessage }) => {
const intl = useIntl();
const dispatch = useAppDispatch();
const handleAuthorize = () => {
dispatch(authorizeEventParticipationRequest(eventId, id));
};
const handleReject = () => {
dispatch(rejectEventParticipationRequest(eventId, id));
};
return (
<AccountContainer
id={id}
note={participationMessage || undefined}
action={
<HStack space={2}>
<Button
theme='secondary'
size='sm'
text={intl.formatMessage(messages.authorize)}
onClick={handleAuthorize}
/>
<Button
theme='danger'
size='sm'
text={intl.formatMessage(messages.reject)}
onClick={handleReject}
/>
</HStack>
}
/>
);
};
interface IManagePendingParticipants {
statusId: string;
}
const ManagePendingParticipants: React.FC<IManagePendingParticipants> = ({ statusId }) => {
const dispatch = useAppDispatch();
const accounts = useAppSelector((state) => state.user_lists.event_participation_requests.get(statusId!)?.items);
useEffect(() => {
if (statusId) dispatch(fetchEventParticipationRequests(statusId));
return () => {
dispatch(cancelEventCompose());
};
}, [statusId]);
return accounts ? (
<Stack space={3}>
<ScrollableList
isLoading={!accounts}
showLoading={!accounts}
emptyMessage={<FormattedMessage id='empty_column.event_participant_requests' defaultMessage='There are no pending event participation requests.' />}
>
{accounts.map(({ account, participation_message }) =>
<Account key={account} eventId={statusId!} id={account} participationMessage={participation_message} />,
)}
</ScrollableList>
</Stack>
) : <Spinner />;
};
export { ManagePendingParticipants };

View file

@ -4,7 +4,7 @@ import { Link, useHistory } from 'react-router-dom';
import { blockAccount } from 'pl-fe/actions/accounts';
import { directCompose, mentionCompose, quoteCompose } from 'pl-fe/actions/compose';
import { editEvent, fetchEventIcs } from 'pl-fe/actions/events';
import { fetchEventIcs } from 'pl-fe/actions/events';
import { toggleBookmark, togglePin, toggleReblog } from 'pl-fe/actions/interactions';
import { deleteStatusModal, toggleStatusSensitivityModal } from 'pl-fe/actions/moderation';
import { initMuteModal } from 'pl-fe/actions/mutes';
@ -347,12 +347,6 @@ const EventHeader: React.FC<IEventHeader> = ({ status }) => {
return menu;
};
const handleManageClick: React.MouseEventHandler = e => {
e.stopPropagation();
dispatch(editEvent(status.id));
};
const handleParticipantsClick: React.MouseEventHandler = e => {
e.preventDefault();
e.stopPropagation();
@ -396,7 +390,7 @@ const EventHeader: React.FC<IEventHeader> = ({ status }) => {
<Button
size='sm'
theme='secondary'
onClick={handleManageClick}
to={`/@${account.acct}/events/${status.id}/edit`}
>
<FormattedMessage id='event.manage' defaultMessage='Manage' />
</Button>

View file

@ -8,7 +8,6 @@ import Column from 'pl-fe/components/ui/column';
import HStack from 'pl-fe/components/ui/hstack';
import { useAppDispatch } from 'pl-fe/hooks/use-app-dispatch';
import { useAppSelector } from 'pl-fe/hooks/use-app-selector';
import { useModalsStore } from 'pl-fe/stores/modals';
import EventCarousel from './components/event-carousel';
@ -19,7 +18,6 @@ const messages = defineMessages({
const Events = () => {
const intl = useIntl();
const { openModal } = useModalsStore();
const dispatch = useAppDispatch();
const recentEvents = useAppSelector((state) => state.status_lists.get('recent_events')!.items);
@ -27,10 +25,6 @@ const Events = () => {
const joinedEvents = useAppSelector((state) => state.status_lists.get('joined_events')!.items);
const joinedEventsLoading = useAppSelector((state) => state.status_lists.get('joined_events')!.isLoading);
const onComposeEvent = () => {
openModal('COMPOSE_EVENT');
};
useEffect(() => {
dispatch(fetchRecentEvents());
dispatch(fetchJoinedEvents());
@ -40,12 +34,7 @@ const Events = () => {
<Column label={intl.formatMessage(messages.title)}>
<HStack className='mb-2' space={2} justifyContent='between'>
<CardTitle title={<FormattedMessage id='events.recent_events' defaultMessage='Recent events' />} />
<Button
className='ml-auto xl:hidden'
theme='primary'
size='sm'
onClick={onComposeEvent}
>
<Button className='ml-auto xl:hidden' theme='primary' size='sm' to='/events/new'>
<FormattedMessage id='events.create_event' defaultMessage='Create event' />
</Button>
</HStack>

View file

@ -1,7 +1,6 @@
import React, { Suspense, lazy } from 'react';
import { cancelReplyCompose } from 'pl-fe/actions/compose';
import { cancelEventCompose } from 'pl-fe/actions/events';
import Base from 'pl-fe/components/modal-root';
import { useAppDispatch } from 'pl-fe/hooks/use-app-dispatch';
import { useModalsStore } from 'pl-fe/stores/modals';
@ -16,7 +15,6 @@ const MODAL_COMPONENTS = {
COMPARE_HISTORY: lazy(() => import('pl-fe/features/ui/components/modals/compare-history-modal')),
COMPONENT: lazy(() => import('pl-fe/features/ui/components/modals/component-modal')),
COMPOSE: lazy(() => import('pl-fe/features/ui/components/modals/compose-modal')),
COMPOSE_EVENT: lazy(() => import('pl-fe/features/ui/components/modals/compose-event-modal')),
CONFIRM: lazy(() => import('pl-fe/features/ui/components/modals/confirmation-modal')),
CREATE_GROUP: lazy(() => import('pl-fe/features/ui/components/modals/manage-group-modal')),
CRYPTO_DONATE: lazy(() => import('pl-fe/features/ui/components/modals/crypto-donate-modal')),
@ -69,9 +67,6 @@ const ModalRoot: React.FC = () => {
case 'COMPOSE':
dispatch(cancelReplyCompose());
break;
case 'COMPOSE_EVENT':
dispatch(cancelEventCompose());
break;
default:
break;
}

View file

@ -4,37 +4,28 @@ import { FormattedMessage } from 'react-intl';
import Button from 'pl-fe/components/ui/button';
import Stack from 'pl-fe/components/ui/stack';
import Text from 'pl-fe/components/ui/text';
import { useModalsStore } from 'pl-fe/stores/modals';
const NewEventPanel = () => {
const { openModal } = useModalsStore();
const NewEventPanel = () => (
<Stack space={2}>
<Stack>
<Text size='lg' weight='bold'>
<FormattedMessage id='new_event_panel.title' defaultMessage='Create New Event' />
</Text>
const createEvent = () => {
openModal('COMPOSE_EVENT');
};
return (
<Stack space={2}>
<Stack>
<Text size='lg' weight='bold'>
<FormattedMessage id='new_event_panel.title' defaultMessage='Create New Event' />
</Text>
<Text theme='muted' size='sm'>
<FormattedMessage id='new_event_panel.subtitle' defaultMessage="Can't find what you're looking for? Schedule your own event." />
</Text>
</Stack>
<Button
icon={require('@tabler/icons/outline/calendar-event.svg')}
onClick={createEvent}
theme='secondary'
block
>
<FormattedMessage id='new_event_panel.action' defaultMessage='Create event' />
</Button>
<Text theme='muted' size='sm'>
<FormattedMessage id='new_event_panel.subtitle' defaultMessage="Can't find what you're looking for? Schedule your own event." />
</Text>
</Stack>
);
};
<Button
icon={require('@tabler/icons/outline/calendar-event.svg')}
theme='secondary'
block
to='/events/new'
>
<FormattedMessage id='new_event_panel.action' defaultMessage='Create event' />
</Button>
</Stack>
);
export { NewEventPanel as default };

View file

@ -1,9 +1,9 @@
import clsx from 'clsx';
import React, { Suspense, lazy, useEffect, useRef } from 'react';
import { Switch, useHistory, useLocation, Redirect } from 'react-router-dom';
import { Redirect, Switch, useHistory, useLocation } from 'react-router-dom';
import { fetchFollowRequests } from 'pl-fe/actions/accounts';
import { fetchReports, fetchUsers, fetchConfig } from 'pl-fe/actions/admin';
import { fetchConfig, fetchReports, fetchUsers } from 'pl-fe/actions/admin';
import { fetchCustomEmojis } from 'pl-fe/actions/custom-emojis';
import { fetchDraftStatuses } from 'pl-fe/actions/draft-statuses';
import { fetchFilters } from 'pl-fe/actions/filters';
@ -47,98 +47,99 @@ import { isStandalone } from 'pl-fe/utils/state';
import BackgroundShapes from './components/background-shapes';
import {
Status,
CommunityTimeline,
PublicTimeline,
RemoteTimeline,
AccountTimeline,
AboutPage,
AccountGallery,
HomeTimeline,
Followers,
Following,
Conversations,
HashtagTimeline,
Notifications,
FollowRequests,
GenericNotFound,
FavouritedStatuses,
Blocks,
DomainBlocks,
Mutes,
Filters,
EditFilter,
PinnedStatuses,
Search,
ListTimeline,
Lists,
Bookmarks,
Settings,
EditProfile,
EditEmail,
EditPassword,
DeleteAccount,
PlFeConfig,
ExportData,
ImportData,
AccountHoverCard,
AccountTimeline,
Aliases,
Announcements,
AuthTokenList,
Backups,
MfaForm,
Blocks,
BookmarkFolders,
Bookmarks,
BubbleTimeline,
ChatIndex,
ChatWidget,
ServerInfo,
Dashboard,
ModerationLog,
CryptoDonate,
ScheduledStatuses,
UserIndex,
FederationRestrictions,
Aliases,
Migration,
FollowRecommendations,
Directory,
SidebarMenu,
AccountHoverCard,
StatusHoverCard,
Share,
NewStatus,
IntentionalError,
Developers,
CreateApp,
SettingsStore,
TestTimeline,
LogoutPage,
AuthTokenList,
ThemeEditor,
Quotes,
ServiceWorkerInfo,
EventInformation,
EventDiscussion,
Events,
GroupGallery,
Groups,
GroupMembers,
GroupTimeline,
ManageGroup,
GroupBlockedMembers,
GroupMembershipRequests,
Announcements,
EditGroup,
FollowedTags,
AboutPage,
RegistrationPage,
LoginPage,
PasswordReset,
RegisterInvite,
ExternalLogin,
LandingTimeline,
BookmarkFolders,
Domains,
Relays,
Rules,
DraftStatuses,
Circle,
BubbleTimeline,
CommunityTimeline,
ComposeEvent,
Conversations,
CreateApp,
CryptoDonate,
Dashboard,
DeleteAccount,
Developers,
Directory,
DomainBlocks,
Domains,
DraftStatuses,
EditEmail,
EditFilter,
EditGroup,
EditPassword,
EditProfile,
EventDiscussion,
EventInformation,
Events,
ExportData,
ExternalLogin,
FavouritedStatuses,
FederationRestrictions,
Filters,
FollowRecommendations,
FollowRequests,
FollowedTags,
Followers,
Following,
GenericNotFound,
GroupBlockedMembers,
GroupGallery,
GroupMembers,
GroupMembershipRequests,
GroupTimeline,
Groups,
HashtagTimeline,
HomeTimeline,
ImportData,
IntentionalError,
InteractionPolicies,
InteractionRequests,
LandingTimeline,
ListTimeline,
Lists,
LoginPage,
LogoutPage,
ManageGroup,
MfaForm,
Migration,
ModerationLog,
Mutes,
NewStatus,
Notifications,
PasswordReset,
PinnedStatuses,
PlFeConfig,
PublicTimeline,
Quotes,
RegisterInvite,
RegistrationPage,
Relays,
RemoteTimeline,
Rules,
ScheduledStatuses,
Search,
ServerInfo,
ServiceWorkerInfo,
Settings,
SettingsStore,
Share,
SidebarMenu,
Status,
StatusHoverCard,
TestTimeline,
ThemeEditor,
UserIndex,
} from './util/async-components';
import GlobalHotkeys from './util/global-hotkeys';
import { WrappedRoute } from './util/react-router-helpers';
@ -241,6 +242,7 @@ const SwitchingColumnsArea: React.FC<ISwitchingColumnsArea> = ({ children }) =>
<WrappedRoute path='/search' layout={SearchLayout} component={Search} content={children} publicRoute />
{features.suggestions && <WrappedRoute path='/suggestions' publicRoute layout={DefaultLayout} component={FollowRecommendations} content={children} />}
{features.profileDirectory && <WrappedRoute path='/directory' publicRoute layout={DefaultLayout} component={Directory} content={children} />}
{features.events && <WrappedRoute path='/events/new' layout={EventsLayout} component={ComposeEvent} content={children} />}
{features.events && <WrappedRoute path='/events' layout={EventsLayout} component={Events} content={children} />}
{features.chats && <WrappedRoute path='/chats' exact layout={ChatsLayout} component={ChatIndex} content={children} />}
@ -268,6 +270,7 @@ const SwitchingColumnsArea: React.FC<ISwitchingColumnsArea> = ({ children }) =>
<WrappedRoute path='/@:username/posts/:statusId' publicRoute exact layout={StatusLayout} component={Status} content={children} />
<WrappedRoute path='/@:username/posts/:statusId/quotes' publicRoute layout={StatusLayout} component={Quotes} content={children} />
{features.events && <WrappedRoute path='/@:username/events/:statusId' publicRoute exact layout={EventLayout} component={EventInformation} content={children} />}
{features.events && <WrappedRoute path='/@:username/events/:statusId/edit' publicRoute exact layout={EventsLayout} component={ComposeEvent} content={children} />}
{features.events && <WrappedRoute path='/@:username/events/:statusId/discussion' publicRoute exact layout={EventLayout} component={EventDiscussion} content={children} />}
<Redirect from='/@:username/:statusId' to='/@:username/posts/:statusId' />
<WrappedRoute path='/posts/:statusId' publicRoute exact layout={DefaultLayout} component={Status} content={children} />

View file

@ -16,6 +16,7 @@ export const ChatIndex = lazy(() => import('pl-fe/features/chats'));
export const Circle = lazy(() => import('pl-fe/features/circle'));
export const CommunityTimeline = lazy(() => import('pl-fe/features/community-timeline'));
export const ComposeEditor = lazy(() => import('pl-fe/features/compose/editor'));
export const ComposeEvent = lazy(() => import('pl-fe/features/compose-event'));
export const Conversations = lazy(() => import('pl-fe/features/conversations'));
export const CreateApp = lazy(() => import('pl-fe/features/developers/apps/create'));
export const CryptoDonate = lazy(() => import('pl-fe/features/crypto-donate'));

View file

@ -1197,7 +1197,7 @@
"navigation_bar.compose": "انشاء منشور",
"navigation_bar.compose_direct": "رسالة خاصة",
"navigation_bar.compose_edit": "تحرير المنشور",
"navigation_bar.compose_event": "إدارة الحدث",
"navigation_bar.manage_event": "إدارة الحدث",
"navigation_bar.compose_group": "النشر في المجموعة",
"navigation_bar.compose_group_reply": "الرد في المجموعة",
"navigation_bar.compose_quote": "اقتباس المنشور",

View file

@ -1092,7 +1092,7 @@
"navigation_bar.compose": "Compose new post",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1091,7 +1091,7 @@
"navigation_bar.compose": "Compose new post",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1092,7 +1092,7 @@
"navigation_bar.compose": "নতুন টুট লিখুন",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1089,7 +1089,7 @@
"navigation_bar.compose": "Compose new post",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1109,7 +1109,7 @@
"navigation_bar.compose": "",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1094,7 +1094,7 @@
"navigation_bar.compose": "Redacta nou toot",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1092,7 +1092,7 @@
"navigation_bar.compose": "Scrive un novu statutu",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1097,7 +1097,7 @@
"navigation_bar.compose": "Vytvořit nový příspěvek",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1101,7 +1101,7 @@
"navigation_bar.compose": "Ysgrifennu neges",
"navigation_bar.compose_direct": "Neges breifat",
"navigation_bar.compose_edit": "Golygu'r neges",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1092,7 +1092,7 @@
"navigation_bar.compose": "Skriv nyt trut",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1141,7 +1141,7 @@
"navigation_bar.compose": "Neuen Beitrag verfassen",
"navigation_bar.compose_direct": "Direktnachricht",
"navigation_bar.compose_edit": "Beitrag bearbeiten",
"navigation_bar.compose_event": "Veranstaltung verwalten",
"navigation_bar.manage_event": "Veranstaltung verwalten",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Beitrag zitieren",

View file

@ -1108,7 +1108,7 @@
"navigation_bar.compose": "Γράψε νέο τουτ",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1108,7 +1108,7 @@
"navigation_bar.compose": "𐑒𐑩𐑥𐑐𐑴𐑟 𐑯𐑿 𐑐𐑴𐑕𐑑",
"navigation_bar.compose_direct": "𐑛𐑦𐑮𐑧𐑒𐑑 𐑥𐑧𐑕𐑦𐑡",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1089,7 +1089,7 @@
"navigation_bar.compose": "Compose a post",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "Manage event",
"navigation_bar.manage_event": "Manage event",
"navigation_bar.compose_group": "Compose to group",
"navigation_bar.compose_group_reply": "Reply to group post",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1092,7 +1092,7 @@
"navigation_bar.compose": "Skribi novan mesaĝon",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1113,7 +1113,7 @@
"navigation_bar.compose": "Redactar un nuevo toot",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1200,7 +1200,7 @@
"navigation_bar.compose": "Escribir un nuevo toot",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "Administrar evento",
"navigation_bar.manage_event": "Administrar evento",
"navigation_bar.compose_group": "Redactar para grupo",
"navigation_bar.compose_group_reply": "Responder al mensaje del grupo",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1092,7 +1092,7 @@
"navigation_bar.compose": "Koosta uus tuut",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1092,7 +1092,7 @@
"navigation_bar.compose": "Idatzi toot berria",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1108,7 +1108,7 @@
"navigation_bar.compose": "نوشتن بوق تازه",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1092,7 +1092,7 @@
"navigation_bar.compose": "Kirjoita uusi tuuttaus",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1137,7 +1137,7 @@
"navigation_bar.compose": "Rédiger un nouveau toot",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "Gérer lévènement",
"navigation_bar.manage_event": "Gérer lévènement",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1108,7 +1108,7 @@
"navigation_bar.compose": "Compose new post",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1092,7 +1092,7 @@
"navigation_bar.compose": "Escribir novo toot",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1166,7 +1166,7 @@
"navigation_bar.compose": "כתוב פוסט חדש",
"navigation_bar.compose_direct": "הודעה ישירה",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1108,7 +1108,7 @@
"navigation_bar.compose": "Compose new post",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1131,7 +1131,7 @@
"navigation_bar.compose": "Sastavite novu objavu",
"navigation_bar.compose_direct": "Izravna poruka",
"navigation_bar.compose_edit": "Uredi objavu",
"navigation_bar.compose_event": "Upravljanje događajem",
"navigation_bar.manage_event": "Upravljanje događajem",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Citiraj objavu",

View file

@ -1108,7 +1108,7 @@
"navigation_bar.compose": "Új tülk írása",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1089,7 +1089,7 @@
"navigation_bar.compose": "Compose new post",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1197,7 +1197,7 @@
"navigation_bar.compose": "Tulis toot baru",
"navigation_bar.compose_direct": "Pesan Langsung",
"navigation_bar.compose_edit": "Edit postingan",
"navigation_bar.compose_event": "Kelola acara",
"navigation_bar.manage_event": "Kelola acara",
"navigation_bar.compose_group": "Menulis ke grup",
"navigation_bar.compose_group_reply": "Membalas kiriman grup",
"navigation_bar.compose_quote": "Postingan quote",

View file

@ -1108,7 +1108,7 @@
"navigation_bar.compose": "Compose new post",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1108,7 +1108,7 @@
"navigation_bar.compose": "Semja nýja færslu",
"navigation_bar.compose_direct": "Bein skilaboð",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1200,7 +1200,7 @@
"navigation_bar.compose": "Pubblica qualcosa",
"navigation_bar.compose_direct": "Comunica privatamente",
"navigation_bar.compose_edit": "Salva modifiche",
"navigation_bar.compose_event": "Gestione evento",
"navigation_bar.manage_event": "Gestione evento",
"navigation_bar.compose_group": "Scrivi nel gruppo",
"navigation_bar.compose_group_reply": "Rispondi alla pubblicazione nel gruppo",
"navigation_bar.compose_quote": "Citazione",

View file

@ -1183,7 +1183,7 @@
"navigation_bar.compose": "投稿の新規作成",
"navigation_bar.compose_direct": "ダイレクトメッセージ",
"navigation_bar.compose_edit": "投稿を編集",
"navigation_bar.compose_event": "イベントを管理する",
"navigation_bar.manage_event": "イベントを管理する",
"navigation_bar.compose_group": "グループに投稿する",
"navigation_bar.compose_group_reply": "グループの投稿に返信",
"navigation_bar.compose_quote": "投稿を引用",

View file

@ -1083,7 +1083,7 @@
"navigation_bar.compose": "",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1091,7 +1091,7 @@
"navigation_bar.compose": "Compose new post",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1108,7 +1108,7 @@
"navigation_bar.compose": "Жаңа жазба бастау",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1108,7 +1108,7 @@
"navigation_bar.compose": "새 툿 작성",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1108,7 +1108,7 @@
"navigation_bar.compose": "Compose new post",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1108,7 +1108,7 @@
"navigation_bar.compose": "Compose new post",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1108,7 +1108,7 @@
"navigation_bar.compose": "Compose new post",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1108,7 +1108,7 @@
"navigation_bar.compose": "Compose new post",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1092,7 +1092,7 @@
"navigation_bar.compose": "Nieuw toot schrijven",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1108,7 +1108,7 @@
"navigation_bar.compose": "Compose new post",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1166,7 +1166,7 @@
"navigation_bar.compose": "Compose new post",
"navigation_bar.compose_direct": "Direktemeldinger",
"navigation_bar.compose_edit": "Rediger innlegg",
"navigation_bar.compose_event": "Administrere arrangement",
"navigation_bar.manage_event": "Administrere arrangement",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Siter innlegg",

View file

@ -1108,7 +1108,7 @@
"navigation_bar.compose": "Escriure un nòu tut",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1083,7 +1083,7 @@
"navigation_bar.compose": "Utwórz nowy wpis",
"navigation_bar.compose_direct": "Wiadomość bezpośrednia",
"navigation_bar.compose_edit": "Edytuj wpis",
"navigation_bar.compose_event": "Zarządzaj wydarzeniem",
"navigation_bar.manage_event": "Zarządzaj wydarzeniem",
"navigation_bar.compose_group": "Utwórz wpis w grupie",
"navigation_bar.compose_group_reply": "Odpowiedz na wpis w grupie",
"navigation_bar.compose_quote": "Cytuj wpis",

View file

@ -1108,7 +1108,7 @@
"navigation_bar.compose": "Compor um novo toot",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1108,7 +1108,7 @@
"navigation_bar.compose": "Escrever uma nova publicação",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1108,7 +1108,7 @@
"navigation_bar.compose": "Compune o nouă postare",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1197,7 +1197,7 @@
"navigation_bar.compose": "Создать новый статус",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "Управление мероприятием",
"navigation_bar.manage_event": "Управление мероприятием",
"navigation_bar.compose_group": "Написать в группу",
"navigation_bar.compose_group_reply": "Ответ на пост группы",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1108,7 +1108,7 @@
"navigation_bar.compose": "Napíš nový príspevok",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1092,7 +1092,7 @@
"navigation_bar.compose": "Sestavi nov tut",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1092,7 +1092,7 @@
"navigation_bar.compose": "Hartoni mesazh të ri",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1108,7 +1108,7 @@
"navigation_bar.compose": "Compose new post",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1108,7 +1108,7 @@
"navigation_bar.compose": "Саставите нову трубу",
"navigation_bar.compose_direct": "Direct message",
"navigation_bar.compose_edit": "Edit post",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "Quote post",

View file

@ -1092,7 +1092,7 @@
"navigation_bar.compose": "Författa ny toot",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1092,7 +1092,7 @@
"navigation_bar.compose": "புதியவற்றை எழுதுக toot",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1092,7 +1092,7 @@
"navigation_bar.compose": "కొత్త టూట్ను రాయండి",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1092,7 +1092,7 @@
"navigation_bar.compose": "เขียนโพสต์ใหม่",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1196,7 +1196,7 @@
"navigation_bar.compose": "Bir gönderi oluşturun",
"navigation_bar.compose_direct": "Özel mesaj",
"navigation_bar.compose_edit": "Gönderiyi düzenle",
"navigation_bar.compose_event": "Etkinliği yönet",
"navigation_bar.manage_event": "Etkinliği yönet",
"navigation_bar.compose_group": "Guruba içerik oluştur",
"navigation_bar.compose_group_reply": "Grup gönderisine yanıt ver",
"navigation_bar.compose_quote": "Gönderiyi alıntıla",

View file

@ -1092,7 +1092,7 @@
"navigation_bar.compose": "Написати новий дмух",
"navigation_bar.compose_direct": "",
"navigation_bar.compose_edit": "",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "",

View file

@ -1197,7 +1197,7 @@
"navigation_bar.compose": "撰写新帖",
"navigation_bar.compose_direct": "撰写私信",
"navigation_bar.compose_edit": "编辑帖文",
"navigation_bar.compose_event": "管理活动",
"navigation_bar.manage_event": "管理活动",
"navigation_bar.compose_group": "撰写至群组",
"navigation_bar.compose_group_reply": "回复群组帖文",
"navigation_bar.compose_quote": "引用帖文",

View file

@ -1107,7 +1107,7 @@
"navigation_bar.compose": "撰寫新帖文",
"navigation_bar.compose_direct": "發送私人訊息",
"navigation_bar.compose_edit": "編輯帖文",
"navigation_bar.compose_event": "",
"navigation_bar.manage_event": "",
"navigation_bar.compose_group": "",
"navigation_bar.compose_group_reply": "",
"navigation_bar.compose_quote": "引用帖文",

View file

@ -1197,7 +1197,7 @@
"navigation_bar.compose": "撰寫新貼文",
"navigation_bar.compose_direct": "發送私人訊息",
"navigation_bar.compose_edit": "編輯貼文",
"navigation_bar.compose_event": "管理活動",
"navigation_bar.manage_event": "管理活動",
"navigation_bar.compose_group": "發文到群組",
"navigation_bar.compose_group_reply": "回覆群組貼文",
"navigation_bar.compose_quote": "引用貼文",

View file

@ -7,7 +7,6 @@ import type { AccountModerationModalProps } from 'pl-fe/features/ui/components/m
import type { BoostModalProps } from 'pl-fe/features/ui/components/modals/boost-modal';
import type { CompareHistoryModalProps } from 'pl-fe/features/ui/components/modals/compare-history-modal';
import type { ComponentModalProps } from 'pl-fe/features/ui/components/modals/component-modal';
import type { ComposeEventModalProps } from 'pl-fe/features/ui/components/modals/compose-event-modal';
import type { ComposeModalProps } from 'pl-fe/features/ui/components/modals/compose-modal';
import type { ConfirmationModalProps } from 'pl-fe/features/ui/components/modals/confirmation-modal';
import type { DislikesModalProps } from 'pl-fe/features/ui/components/modals/dislikes-modal';
@ -44,7 +43,6 @@ type OpenModalProps =
| [type: 'COMPARE_HISTORY', props: CompareHistoryModalProps]
| [type: 'COMPONENT', props: ComponentModalProps]
| [type: 'COMPOSE', props?: ComposeModalProps]
| [type: 'COMPOSE_EVENT', props?: ComposeEventModalProps]
| [type: 'CONFIRM', props: ConfirmationModalProps]
| [type: 'CRYPTO_DONATE', props: ICryptoAddress]
| [type: 'DISLIKES', props: DislikesModalProps]