pl-fe: some cleanup and make it build
Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
This commit is contained in:
@ -1,6 +1,6 @@
|
||||
import { Outlet, useNavigate } from '@tanstack/react-router';
|
||||
import clsx from 'clsx';
|
||||
import React, { Suspense, lazy, useEffect, useRef } from 'react';
|
||||
import React, { Suspense, useEffect, useRef } from 'react';
|
||||
import { Toaster } from 'react-hot-toast';
|
||||
import { Redirect, Switch, useLocation } from 'react-router-dom';
|
||||
|
||||
@ -11,7 +11,6 @@ import { expandNotifications } from 'pl-fe/actions/notifications';
|
||||
import { register as registerPushNotifications } from 'pl-fe/actions/push-notifications/registerer';
|
||||
import { fetchHomeTimeline } from 'pl-fe/actions/timelines';
|
||||
import { useUserStream } from 'pl-fe/api/hooks/streaming/use-user-stream';
|
||||
import { WITH_LANDING_PAGE } from 'pl-fe/build-config';
|
||||
import SidebarNavigation from 'pl-fe/components/sidebar-navigation';
|
||||
import ThumbNavigation from 'pl-fe/components/thumb-navigation';
|
||||
import Layout from 'pl-fe/components/ui/layout';
|
||||
@ -21,25 +20,9 @@ import { useClient } from 'pl-fe/hooks/use-client';
|
||||
import { useDraggedFiles } from 'pl-fe/hooks/use-dragged-files';
|
||||
import { useFeatures } from 'pl-fe/hooks/use-features';
|
||||
import { useInstance } from 'pl-fe/hooks/use-instance';
|
||||
import { useLoggedIn } from 'pl-fe/hooks/use-logged-in';
|
||||
import { useOwnAccount } from 'pl-fe/hooks/use-own-account';
|
||||
import { usePlFeConfig } from 'pl-fe/hooks/use-pl-fe-config';
|
||||
import AdminLayout from 'pl-fe/layouts/admin-layout';
|
||||
import ChatsLayout from 'pl-fe/layouts/chats-layout';
|
||||
import DefaultLayout from 'pl-fe/layouts/default-layout';
|
||||
import EmptyLayout from 'pl-fe/layouts/empty-layout';
|
||||
import EventLayout from 'pl-fe/layouts/event-layout';
|
||||
import EventsLayout from 'pl-fe/layouts/events-layout';
|
||||
import ExternalLoginLayout from 'pl-fe/layouts/external-login-layout';
|
||||
import GroupLayout from 'pl-fe/layouts/group-layout';
|
||||
import GroupsLayout from 'pl-fe/layouts/groups-layout';
|
||||
import HomeLayout from 'pl-fe/layouts/home-layout';
|
||||
import LandingLayout from 'pl-fe/layouts/landing-layout';
|
||||
import ManageGroupsLayout from 'pl-fe/layouts/manage-groups-layout';
|
||||
import ProfileLayout from 'pl-fe/layouts/profile-layout';
|
||||
import RemoteInstanceLayout from 'pl-fe/layouts/remote-instance-layout';
|
||||
import SearchLayout from 'pl-fe/layouts/search-layout';
|
||||
import StatusLayout from 'pl-fe/layouts/status-layout';
|
||||
import { prefetchFollowRequests } from 'pl-fe/queries/accounts/use-follow-requests';
|
||||
import { queryClient } from 'pl-fe/queries/client';
|
||||
import { prefetchCustomEmojis } from 'pl-fe/queries/instance/use-custom-emojis';
|
||||
@ -53,108 +36,12 @@ import { isStandalone } from 'pl-fe/utils/state';
|
||||
import BackgroundShapes from './components/background-shapes';
|
||||
import {
|
||||
ModalRoot,
|
||||
AboutPage,
|
||||
AccountGallery,
|
||||
AccountHoverCard,
|
||||
AccountTimeline,
|
||||
AdminAccount,
|
||||
Aliases,
|
||||
Announcements,
|
||||
AuthTokenList,
|
||||
Backups,
|
||||
Blocks,
|
||||
BookmarkFolders,
|
||||
Bookmarks,
|
||||
BubbleTimeline,
|
||||
ChatIndex,
|
||||
ChatWidget,
|
||||
Circle,
|
||||
Circles,
|
||||
CircleTimeline,
|
||||
CommunityTimeline,
|
||||
ComposeEvent,
|
||||
Conversations,
|
||||
CreateApp,
|
||||
CryptoDonate,
|
||||
Dashboard,
|
||||
DeleteAccount,
|
||||
Developers,
|
||||
Directory,
|
||||
DomainBlocks,
|
||||
Domains,
|
||||
DraftStatuses,
|
||||
DropdownNavigation,
|
||||
EditEmail,
|
||||
EditFilter,
|
||||
EditGroup,
|
||||
EditPassword,
|
||||
EditProfile,
|
||||
EventDiscussion,
|
||||
EventInformation,
|
||||
Events,
|
||||
ExportData,
|
||||
ExternalLogin,
|
||||
FavouritedStatuses,
|
||||
FederationRestrictions,
|
||||
Filters,
|
||||
FollowRequests,
|
||||
FollowedTags,
|
||||
Followers,
|
||||
Following,
|
||||
GenericNotFound,
|
||||
GroupBlockedMembers,
|
||||
GroupGallery,
|
||||
GroupMembers,
|
||||
GroupMembershipRequests,
|
||||
GroupTimeline,
|
||||
Groups,
|
||||
HashtagTimeline,
|
||||
HomeTimeline,
|
||||
ImportData,
|
||||
IntentionalError,
|
||||
InteractionPolicies,
|
||||
InteractionRequests,
|
||||
LandingPage,
|
||||
LandingTimeline,
|
||||
LinkTimeline,
|
||||
ListTimeline,
|
||||
Lists,
|
||||
LoginPage,
|
||||
LogoutPage,
|
||||
ManageGroup,
|
||||
MfaForm,
|
||||
Migration,
|
||||
ModerationLog,
|
||||
Mutes,
|
||||
NewStatus,
|
||||
Notifications,
|
||||
OutgoingFollowRequests,
|
||||
PasswordReset,
|
||||
PinnedStatuses,
|
||||
PlFeConfig,
|
||||
PublicTimeline,
|
||||
Quotes,
|
||||
RegisterInvite,
|
||||
RegistrationPage,
|
||||
Relays,
|
||||
RemoteTimeline,
|
||||
Report,
|
||||
Rules,
|
||||
ScheduledStatuses,
|
||||
Search,
|
||||
ServerInfo,
|
||||
ServiceWorkerInfo,
|
||||
Settings,
|
||||
SettingsStore,
|
||||
Share,
|
||||
Status,
|
||||
StatusHoverCard,
|
||||
TestTimeline,
|
||||
ThemeEditor,
|
||||
Privacy,
|
||||
UserIndex,
|
||||
WrenchedTimeline,
|
||||
Drive,
|
||||
} from './util/async-components';
|
||||
import GlobalHotkeys from './util/global-hotkeys';
|
||||
import { WrappedRoute } from './util/react-router-helpers';
|
||||
@ -168,14 +55,7 @@ interface ISwitchingColumnsArea {
|
||||
}
|
||||
|
||||
const SwitchingColumnsArea: React.FC<ISwitchingColumnsArea> = React.memo(({ children }) => {
|
||||
const instance = useInstance();
|
||||
const features = useFeatures();
|
||||
const { search } = useLocation();
|
||||
const { isLoggedIn } = useLoggedIn();
|
||||
const standalone = useAppSelector(isStandalone);
|
||||
|
||||
const { cryptoAddresses, redirectRootNoLogin } = usePlFeConfig();
|
||||
const hasCrypto = cryptoAddresses.length > 0;
|
||||
|
||||
// NOTE: Mastodon and Pleroma route some basenames to the backend.
|
||||
// When adding new routes, use a basename that does NOT conflict
|
||||
@ -184,35 +64,6 @@ const SwitchingColumnsArea: React.FC<ISwitchingColumnsArea> = React.memo(({ chil
|
||||
// Ex: use /login instead of /auth, but redirect /auth to /login
|
||||
return (
|
||||
<Switch>
|
||||
{(!isLoggedIn && redirectRootNoLogin) && (
|
||||
<Redirect exact from='/' to={redirectRootNoLogin} />
|
||||
)}
|
||||
|
||||
{standalone && !isLoggedIn && (WITH_LANDING_PAGE
|
||||
? <WrappedRoute path='/' exact layout={DefaultLayout} component={LandingPage} publicRoute />
|
||||
: <Redirect from='/' to='/login/external' exact />)}
|
||||
|
||||
<WrappedRoute path='/logout' layout={EmptyLayout} component={LogoutPage} publicRoute exact />
|
||||
|
||||
{isLoggedIn ? (
|
||||
<WrappedRoute path='/' exact layout={HomeLayout} component={HomeTimeline} content={children} />
|
||||
) : (
|
||||
<WrappedRoute path='/' exact layout={LandingLayout} component={LandingTimeline} content={children} publicRoute />
|
||||
)}
|
||||
|
||||
{/*
|
||||
NOTE: we cannot nest routes in a fragment
|
||||
https://stackoverflow.com/a/68637108
|
||||
*/}
|
||||
{features.federating && <WrappedRoute path='/timeline/local' exact layout={HomeLayout} component={CommunityTimeline} content={children} publicRoute />}
|
||||
{features.federating && <WrappedRoute path='/timeline/fediverse' exact layout={HomeLayout} component={PublicTimeline} content={children} publicRoute />}
|
||||
{features.bubbleTimeline && <WrappedRoute path='/timeline/bubble' exact layout={HomeLayout} component={BubbleTimeline} content={children} publicRoute />}
|
||||
{features.wrenchedTimeline && <WrappedRoute path='/timeline/wrenched' exact layout={HomeLayout} component={WrenchedTimeline} content={children} publicRoute />}
|
||||
{features.federating && <WrappedRoute path='/timeline/:instance' exact layout={RemoteInstanceLayout} component={RemoteTimeline} content={children} />}
|
||||
|
||||
{features.conversations && <WrappedRoute path='/conversations' layout={DefaultLayout} component={Conversations} content={children} />}
|
||||
{features.conversations && <Redirect from='/messages' to='/conversations' />}
|
||||
|
||||
{/* Mastodon web routes */}
|
||||
<Redirect from='/web/:path1/:path2/:path3' to='/:path1/:path2/:path3' />
|
||||
<Redirect from='/web/:path1/:path2' to='/:path1/:path2' />
|
||||
@ -253,131 +104,6 @@ const SwitchingColumnsArea: React.FC<ISwitchingColumnsArea> = React.memo(({ chil
|
||||
|
||||
{/* Pleroma hard-coded email URLs */}
|
||||
<Redirect from='/registration/:token' to='/invite/:token' />
|
||||
|
||||
<WrappedRoute path='/tags/:id' publicRoute layout={DefaultLayout} component={HashtagTimeline} content={children} />
|
||||
<WrappedRoute path='/links/:url' publicRoute layout={DefaultLayout} component={LinkTimeline} content={children} />
|
||||
|
||||
{features.lists && <WrappedRoute path='/lists' layout={DefaultLayout} component={Lists} content={children} />}
|
||||
{features.lists && <WrappedRoute path='/list/:id' layout={DefaultLayout} component={ListTimeline} content={children} />}
|
||||
{features.circles && <WrappedRoute path='/circles/:id' layout={DefaultLayout} component={CircleTimeline} content={children} />}
|
||||
{features.circles && <WrappedRoute path='/circles' layout={DefaultLayout} component={Circles} content={children} />}
|
||||
{features.bookmarks && <WrappedRoute path='/bookmarks/all' layout={DefaultLayout} component={Bookmarks} content={children} />}
|
||||
{features.bookmarks && <WrappedRoute path='/bookmarks/:id' layout={DefaultLayout} component={Bookmarks} content={children} />}
|
||||
<WrappedRoute path='/bookmarks' layout={DefaultLayout} component={BookmarkFolders} content={children} />
|
||||
|
||||
<WrappedRoute path='/notifications' layout={DefaultLayout} component={Notifications} content={children} />
|
||||
|
||||
<WrappedRoute path='/search' layout={SearchLayout} component={Search} content={children} publicRoute />
|
||||
{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/{-$chatId}' exact layout={ChatsLayout} component={ChatIndex} content={children} />}
|
||||
{features.chats && <WrappedRoute path='/chats/new' layout={ChatsLayout} component={ChatIndex} content={children} />}
|
||||
{features.chats && <WrappedRoute path='/chats/settings' layout={ChatsLayout} component={ChatIndex} content={children} />}
|
||||
{features.shoutbox && <WrappedRoute path='/chats/shoutbox' layout={ChatsLayout} component={ChatIndex} content={children} />}
|
||||
{features.chats && <WrappedRoute path='/chats/:chatId' layout={ChatsLayout} component={ChatIndex} content={children} />}
|
||||
|
||||
<WrappedRoute path='/follow_requests' layout={DefaultLayout} component={FollowRequests} content={children} />
|
||||
{features.outgoingFollowRequests && <WrappedRoute path='/outgoing_follow_requests' layout={DefaultLayout} component={OutgoingFollowRequests} content={children} />}
|
||||
<WrappedRoute path='/blocks' layout={DefaultLayout} component={Blocks} content={children} />
|
||||
{features.federating && <WrappedRoute path='/domain_blocks' layout={DefaultLayout} component={DomainBlocks} content={children} />}
|
||||
<WrappedRoute path='/mutes' layout={DefaultLayout} component={Mutes} content={children} />
|
||||
{(features.filters || features.filtersV2) && <WrappedRoute path='/filters/new' layout={DefaultLayout} component={EditFilter} content={children} />}
|
||||
{(features.filters || features.filtersV2) && <WrappedRoute path='/filters/:id' layout={DefaultLayout} component={EditFilter} content={children} />}
|
||||
{(features.filters || features.filtersV2) && <WrappedRoute path='/filters' layout={DefaultLayout} component={Filters} content={children} />}
|
||||
{(features.followedHashtagsList) && <WrappedRoute path='/followed_tags' layout={DefaultLayout} component={FollowedTags} content={children} />}
|
||||
{features.interactionRequests && <WrappedRoute path='/interaction_requests' layout={DefaultLayout} component={InteractionRequests} content={children} />}
|
||||
<WrappedRoute path='/@:username' publicRoute exact layout={ProfileLayout} component={AccountTimeline} content={children} />
|
||||
<WrappedRoute path='/@:username/with_replies' publicRoute layout={ProfileLayout} component={AccountTimeline} content={children} componentParams={{ withReplies: true }} />
|
||||
<WrappedRoute path='/@:username/followers' publicRoute layout={ProfileLayout} component={Followers} content={children} />
|
||||
<WrappedRoute path='/@:username/following' publicRoute layout={ProfileLayout} component={Following} content={children} />
|
||||
<WrappedRoute path='/@:username/media' publicRoute layout={ProfileLayout} component={AccountGallery} content={children} />
|
||||
<WrappedRoute path='/@:username/tagged/:tag' exact layout={ProfileLayout} component={AccountTimeline} content={children} />
|
||||
<WrappedRoute path='/@:username/favorites' layout={ProfileLayout} component={FavouritedStatuses} content={children} />
|
||||
<WrappedRoute path='/@:username/pins' layout={ProfileLayout} component={PinnedStatuses} content={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} />
|
||||
|
||||
{features.groups && <WrappedRoute path='/groups' exact layout={GroupsLayout} component={Groups} content={children} />}
|
||||
{features.groups && <WrappedRoute path='/groups/:groupId' exact layout={GroupLayout} component={GroupTimeline} content={children} />}
|
||||
{features.groups && <WrappedRoute path='/groups/:groupId/members' exact layout={GroupLayout} component={GroupMembers} content={children} />}
|
||||
{features.groups && <WrappedRoute path='/groups/:groupId/media' layout={GroupLayout} component={GroupGallery} content={children} />}
|
||||
{features.groups && <WrappedRoute path='/groups/:groupId/manage' exact layout={ManageGroupsLayout} component={ManageGroup} content={children} />}
|
||||
{features.groups && <WrappedRoute path='/groups/:groupId/manage/edit' exact layout={ManageGroupsLayout} component={EditGroup} content={children} />}
|
||||
{features.groups && <WrappedRoute path='/groups/:groupId/manage/blocks' exact layout={ManageGroupsLayout} component={GroupBlockedMembers} content={children} />}
|
||||
{features.groups && <WrappedRoute path='/groups/:groupId/manage/requests' exact layout={ManageGroupsLayout} component={GroupMembershipRequests} content={children} />}
|
||||
{features.groups && <WrappedRoute path='/groups/:groupId/posts/:statusId' exact layout={StatusLayout} component={Status} content={children} />}
|
||||
|
||||
<WrappedRoute path='/statuses/new' layout={DefaultLayout} component={NewStatus} content={children} exact />
|
||||
<WrappedRoute path='/statuses/:statusId' exact layout={StatusLayout} component={Status} content={children} />
|
||||
{features.scheduledStatuses && <WrappedRoute path='/scheduled_statuses' layout={DefaultLayout} component={ScheduledStatuses} content={children} />}
|
||||
<WrappedRoute path='/draft_statuses' layout={DefaultLayout} component={DraftStatuses} content={children} />
|
||||
|
||||
{features.drive && <WrappedRoute path='/drive/:folderId?' layout={DefaultLayout} component={Drive} content={children} exact />}
|
||||
|
||||
<WrappedRoute path='/circle' layout={DefaultLayout} component={Circle} content={children} />
|
||||
|
||||
<WrappedRoute path='/settings/profile' layout={DefaultLayout} component={EditProfile} content={children} />
|
||||
<WrappedRoute path='/settings/export' layout={DefaultLayout} component={ExportData} content={children} />
|
||||
{(features.importBlocks || features.importFollows || features.importMutes) && <WrappedRoute path='/settings/import' layout={DefaultLayout} component={ImportData} content={children} />}
|
||||
{features.manageAccountAliases && <WrappedRoute path='/settings/aliases' layout={DefaultLayout} component={Aliases} content={children} />}
|
||||
{features.accountMoving && <WrappedRoute path='/settings/migration' layout={DefaultLayout} component={Migration} content={children} />}
|
||||
{features.accountBackups && <WrappedRoute path='/settings/backups' layout={DefaultLayout} component={Backups} content={children} />}
|
||||
<WrappedRoute path='/settings/email' layout={DefaultLayout} component={EditEmail} content={children} />
|
||||
<WrappedRoute path='/settings/password' layout={DefaultLayout} component={EditPassword} content={children} />
|
||||
<WrappedRoute path='/settings/account' layout={DefaultLayout} component={DeleteAccount} content={children} />
|
||||
<WrappedRoute path='/settings/mfa' layout={DefaultLayout} component={MfaForm} exact />
|
||||
<WrappedRoute path='/settings/tokens' layout={DefaultLayout} component={AuthTokenList} content={children} />
|
||||
{features.interactionRequests && <WrappedRoute path='/settings/interaction_policies' layout={DefaultLayout} component={InteractionPolicies} content={children} />}
|
||||
<Redirect from='/settings/url_privacy' to='/settings/privacy' />
|
||||
<WrappedRoute path='/settings/privacy' layout={DefaultLayout} component={Privacy} content={children} />
|
||||
<WrappedRoute path='/settings' layout={DefaultLayout} component={Settings} content={children} />
|
||||
<WrappedRoute path='/pl-fe/config' adminOnly layout={DefaultLayout} component={PlFeConfig} content={children} />
|
||||
|
||||
<WrappedRoute path='/pl-fe/admin' staffOnly layout={AdminLayout} component={Dashboard} content={children} exact />
|
||||
<WrappedRoute path='/pl-fe/admin/accounts/:accountId' staffOnly layout={AdminLayout} component={AdminAccount} content={children} exact />
|
||||
<WrappedRoute path='/pl-fe/admin/approval' staffOnly layout={AdminLayout} component={Dashboard} content={children} exact />
|
||||
<WrappedRoute path='/pl-fe/admin/reports' staffOnly layout={AdminLayout} component={Dashboard} content={children} exact />
|
||||
<WrappedRoute path='/pl-fe/admin/reports/:reportId' staffOnly layout={AdminLayout} component={Report} content={children} exact />
|
||||
<WrappedRoute path='/pl-fe/admin/log' staffOnly layout={AdminLayout} component={ModerationLog} content={children} exact />
|
||||
<WrappedRoute path='/pl-fe/admin/users' staffOnly layout={AdminLayout} component={UserIndex} content={children} exact />
|
||||
<WrappedRoute path='/pl-fe/admin/theme' staffOnly layout={AdminLayout} component={ThemeEditor} content={children} exact />
|
||||
<WrappedRoute path='/pl-fe/admin/relays' staffOnly layout={AdminLayout} component={Relays} content={children} exact />
|
||||
{features.pleromaAdminAnnouncements && <WrappedRoute path='/pl-fe/admin/announcements' staffOnly layout={AdminLayout} component={Announcements} content={children} exact />}
|
||||
{features.domains && <WrappedRoute path='/pl-fe/admin/domains' staffOnly layout={AdminLayout} component={Domains} content={children} exact />}
|
||||
{features.adminRules && <WrappedRoute path='/pl-fe/admin/rules' staffOnly layout={AdminLayout} component={Rules} content={children} exact />}
|
||||
<WrappedRoute path='/info' layout={EmptyLayout} component={ServerInfo} content={children} />
|
||||
|
||||
<WrappedRoute path='/developers/apps/create' layout={DefaultLayout} component={CreateApp} content={children} />
|
||||
<WrappedRoute path='/developers/settings_store' layout={DefaultLayout} component={SettingsStore} content={children} />
|
||||
<WrappedRoute path='/developers/timeline' layout={DefaultLayout} component={TestTimeline} content={children} />
|
||||
<WrappedRoute path='/developers/sw' layout={DefaultLayout} component={ServiceWorkerInfo} content={children} />
|
||||
<WrappedRoute path='/developers' layout={DefaultLayout} component={Developers} content={children} />
|
||||
<WrappedRoute path='/error/network' layout={EmptyLayout} component={lazy(() => Promise.reject(new TypeError('Failed to fetch dynamically imported module: TEST')))} content={children} />
|
||||
<WrappedRoute path='/error' layout={EmptyLayout} component={IntentionalError} content={children} />
|
||||
|
||||
{hasCrypto && <WrappedRoute path='/donate/crypto' publicRoute layout={DefaultLayout} component={CryptoDonate} content={children} />}
|
||||
{features.federating && <WrappedRoute path='/federation_restrictions' publicRoute layout={DefaultLayout} component={FederationRestrictions} content={children} />}
|
||||
|
||||
<WrappedRoute path='/share' layout={DefaultLayout} component={Share} content={children} exact />
|
||||
|
||||
<WrappedRoute path='/about/:slug?' layout={DefaultLayout} component={AboutPage} publicRoute exact />
|
||||
|
||||
{(features.accountCreation && instance.registrations.enabled) && (
|
||||
<WrappedRoute path='/signup' layout={EmptyLayout} component={RegistrationPage} publicRoute exact />
|
||||
)}
|
||||
|
||||
<WrappedRoute path='/login/external' layout={ExternalLoginLayout} component={ExternalLogin} publicRoute exact />
|
||||
<WrappedRoute path='/login/add' layout={DefaultLayout} component={LoginPage} publicRoute exact />
|
||||
<WrappedRoute path='/login' layout={DefaultLayout} component={LoginPage} publicRoute exact />
|
||||
<WrappedRoute path='/reset-password' layout={DefaultLayout} component={PasswordReset} publicRoute exact />
|
||||
<WrappedRoute path='/invite/:token' layout={DefaultLayout} component={RegisterInvite} publicRoute exact />
|
||||
<Redirect from='/auth/password/new' to='/reset-password' />
|
||||
<Redirect from='/auth/password/edit' to={`/edit-password${search}`} />
|
||||
|
||||
@ -386,6 +112,8 @@ const SwitchingColumnsArea: React.FC<ISwitchingColumnsArea> = React.memo(({ chil
|
||||
);
|
||||
});
|
||||
|
||||
SwitchingColumnsArea.displayName = '_';
|
||||
|
||||
const UI: React.FC = React.memo(() => {
|
||||
const navigate = useNavigate();
|
||||
const dispatch = useAppDispatch();
|
||||
|
||||
@ -3,6 +3,7 @@ import {
|
||||
createRootRouteWithContext,
|
||||
createRoute,
|
||||
createRouter,
|
||||
Navigate,
|
||||
notFound,
|
||||
redirect,
|
||||
RouterProvider,
|
||||
@ -15,6 +16,7 @@ import Layout from 'pl-fe/components/ui/layout';
|
||||
import { useAppSelector } from 'pl-fe/hooks/use-app-selector';
|
||||
import { useFeatures } from 'pl-fe/hooks/use-features';
|
||||
import { useInstance } from 'pl-fe/hooks/use-instance';
|
||||
import { useLoggedIn } from 'pl-fe/hooks/use-logged-in';
|
||||
import { useOwnAccount } from 'pl-fe/hooks/use-own-account';
|
||||
import { usePlFeConfig } from 'pl-fe/hooks/use-pl-fe-config';
|
||||
import AdminLayout from 'pl-fe/layouts/admin-layout';
|
||||
@ -150,7 +152,6 @@ import type { Features } from 'pl-api';
|
||||
interface RouterContext {
|
||||
instance: ReturnType<typeof useInstance>;
|
||||
features: ReturnType<typeof useFeatures>;
|
||||
isStandalone: boolean;
|
||||
isLoggedIn: boolean;
|
||||
isAdmin: boolean;
|
||||
hasCrypto: boolean;
|
||||
@ -263,22 +264,23 @@ const layouts = {
|
||||
};
|
||||
|
||||
// Root routes
|
||||
export const homeTimelineRoute = createRoute({
|
||||
const HomeRoute = () => {
|
||||
const { redirectRootNoLogin } = usePlFeConfig();
|
||||
const standalone = useAppSelector(isStandalone);
|
||||
const { isLoggedIn } = useLoggedIn();
|
||||
|
||||
if (!isLoggedIn && redirectRootNoLogin) return <Navigate to={redirectRootNoLogin} replace />;
|
||||
if (standalone && !isLoggedIn && !WITH_LANDING_PAGE) return <Navigate to='/login/external' replace />;
|
||||
|
||||
if (isLoggedIn) return <HomeTimeline />;
|
||||
if (standalone && WITH_LANDING_PAGE) return <LandingPage />;
|
||||
return <LandingTimeline />;
|
||||
};
|
||||
|
||||
export const homeRoute = createRoute({
|
||||
getParentRoute: () => layouts.home,
|
||||
path: '/',
|
||||
component: HomeTimeline,
|
||||
beforeLoad: ({ context: { isLoggedIn } }) => {
|
||||
if (!isLoggedIn) throw notFound();
|
||||
},
|
||||
});
|
||||
|
||||
export const landingTimelineRoute = createRoute({
|
||||
getParentRoute: () => layouts.landing,
|
||||
path: '/',
|
||||
component: LandingTimeline,
|
||||
beforeLoad: ({ context: { isLoggedIn } }) => {
|
||||
if (isLoggedIn) throw notFound();
|
||||
},
|
||||
component: HomeRoute,
|
||||
});
|
||||
|
||||
// Auth routes
|
||||
@ -1301,13 +1303,13 @@ const routeTree = rootRoute.addChildren([
|
||||
]),
|
||||
layouts.groups.addChildren([groupsRoute]),
|
||||
layouts.home.addChildren([
|
||||
homeTimelineRoute,
|
||||
homeRoute,
|
||||
localTimelineRoute,
|
||||
federatedTimelineRoute,
|
||||
bubbleTimelineRoute,
|
||||
wrenchedTimelineRoute,
|
||||
]),
|
||||
layouts.landing.addChildren([landingTimelineRoute]),
|
||||
layouts.landing.addChildren([/*landingTimelineRoute*/]),
|
||||
layouts.manageGroups.addChildren([
|
||||
manageGroupRoute,
|
||||
editGroupRoute,
|
||||
@ -1355,7 +1357,6 @@ const router = createRouter({
|
||||
instance: instanceInitialState,
|
||||
features: {} as Features,
|
||||
isLoggedIn: false,
|
||||
isStandalone: false,
|
||||
isAdmin: false,
|
||||
hasCrypto: false,
|
||||
},
|
||||
@ -1377,19 +1378,17 @@ declare module '@tanstack/react-router' {
|
||||
const RouterWithContext = () => {
|
||||
const instance = useInstance();
|
||||
const features = useFeatures();
|
||||
const standalone = useAppSelector(isStandalone);
|
||||
const { cryptoAddresses } = usePlFeConfig();
|
||||
const hasCrypto = cryptoAddresses.length > 0;
|
||||
const { account } = useOwnAccount();
|
||||
|
||||
const context = useMemo(() => ({
|
||||
const context: RouterContext = useMemo(() => ({
|
||||
instance,
|
||||
features,
|
||||
isLoggedIn: !!account,
|
||||
isStandalone: standalone,
|
||||
isAdmin: account?.is_admin || account?.is_moderator,
|
||||
isAdmin: !!(account?.is_admin || account?.is_moderator),
|
||||
hasCrypto,
|
||||
}), [features.version, standalone, hasCrypto, !!account, account?.is_admin, account?.is_moderator]);
|
||||
}), [features.version, hasCrypto, !!account, account?.is_admin, account?.is_moderator]);
|
||||
|
||||
return (
|
||||
<RouterProvider router={router} context={context} />
|
||||
|
||||
Reference in New Issue
Block a user