webapp/src/components/App.tsx

140 lines
4.9 KiB
TypeScript
Raw Normal View History

import type { PageProps, RootSearchParams } from '../pages/types'
import { Meta, MetaProvider } from '@solidjs/meta'
2023-03-04 17:26:28 +00:00
import { Component, createEffect, createMemo } from 'solid-js'
2023-02-17 09:21:02 +00:00
import { Dynamic } from 'solid-js/web'
import { ConfirmProvider } from '../context/confirm'
2023-11-28 15:36:00 +00:00
import { ConnectProvider } from '../context/connect'
import { EditorProvider } from '../context/editor'
2024-01-31 12:34:15 +00:00
import { FollowingProvider } from '../context/following'
2024-01-29 09:10:30 +00:00
import { InboxProvider } from '../context/inbox'
import { LocalizeProvider } from '../context/localize'
import { MediaQueryProvider } from '../context/mediaQuery'
import { NotificationsProvider } from '../context/notifications'
import { SessionProvider } from '../context/session'
import { SnackbarProvider } from '../context/snackbar'
2023-02-17 09:21:02 +00:00
import { DiscussionRulesPage } from '../pages/about/discussionRules.page'
import { DogmaPage } from '../pages/about/dogma.page'
import { GuidePage } from '../pages/about/guide.page'
import { HelpPage } from '../pages/about/help.page'
import { ManifestPage } from '../pages/about/manifest.page'
import { PartnersPage } from '../pages/about/partners.page'
import { PrinciplesPage } from '../pages/about/principles.page'
import { ProjectsPage } from '../pages/about/projects.page'
import { TermsOfUsePage } from '../pages/about/termsOfUse.page'
import { ThanksPage } from '../pages/about/thanks.page'
import { AllAuthorsPage } from '../pages/allAuthors.page'
import { AllTopicsPage } from '../pages/allTopics.page'
import { ArticlePage } from '../pages/article.page'
import { AuthorPage } from '../pages/author.page'
import { ConnectPage } from '../pages/connect.page'
2023-02-17 09:21:02 +00:00
import { CreatePage } from '../pages/create.page'
import { DraftsPage } from '../pages/drafts.page'
2023-04-11 13:57:48 +00:00
import { EditPage } from '../pages/edit.page'
2023-10-10 15:38:02 +00:00
import { ExpoPage } from '../pages/expo/expo.page'
import { FeedPage } from '../pages/feed.page'
import { FourOuFourPage } from '../pages/fourOuFour.page'
import { InboxPage } from '../pages/inbox.page'
import { HomePage } from '../pages/index.page'
2023-02-17 09:21:02 +00:00
import { ProfileSecurityPage } from '../pages/profile/profileSecurity.page'
import { ProfileSettingsPage } from '../pages/profile/profileSettings.page'
2023-02-17 09:21:02 +00:00
import { ProfileSubscriptionsPage } from '../pages/profile/profileSubscriptions.page'
import { SearchPage } from '../pages/search.page'
import { TopicPage } from '../pages/topic.page'
import { ROUTES, useRouter } from '../stores/router'
2024-02-04 11:25:21 +00:00
import { MODALS, hideModal, showModal } from '../stores/ui'
2023-02-17 09:21:02 +00:00
// TODO: lazy load
// const SomePage = lazy(() => import('./Pages/SomePage'))
const pagesMap: Record<keyof typeof ROUTES, Component<PageProps>> = {
author: AuthorPage,
authorComments: AuthorPage,
authorAbout: AuthorPage,
2023-02-17 09:21:02 +00:00
inbox: InboxPage,
2023-10-10 15:38:02 +00:00
expo: ExpoPage,
2023-02-17 09:21:02 +00:00
connect: ConnectPage,
create: CreatePage,
2023-04-11 13:57:48 +00:00
edit: EditPage,
editSettings: EditPage,
2023-05-01 18:32:32 +00:00
drafts: DraftsPage,
2023-02-17 09:21:02 +00:00
home: HomePage,
topics: AllTopicsPage,
topic: TopicPage,
authors: AllAuthorsPage,
feed: FeedPage,
feedMy: FeedPage,
feedNotifications: FeedPage,
feedBookmarks: FeedPage,
feedCollaborations: FeedPage,
feedDiscussions: FeedPage,
2023-02-17 09:21:02 +00:00
article: ArticlePage,
search: SearchPage,
discussionRules: DiscussionRulesPage,
dogma: DogmaPage,
guide: GuidePage,
help: HelpPage,
manifest: ManifestPage,
projects: ProjectsPage,
partners: PartnersPage,
principles: PrinciplesPage,
termsOfUse: TermsOfUsePage,
thanks: ThanksPage,
profileSettings: ProfileSettingsPage,
profileSecurity: ProfileSecurityPage,
profileSubscriptions: ProfileSubscriptionsPage,
fourOuFour: FourOuFourPage,
2023-02-17 09:21:02 +00:00
}
2023-11-18 15:20:15 +00:00
type Props = PageProps & { is404: boolean }
export const App = (props: Props) => {
2023-02-17 09:21:02 +00:00
const { page, searchParams } = useRouter<RootSearchParams>()
2024-01-31 12:34:15 +00:00
const is404 = createMemo(() => props.is404)
2023-03-04 17:26:28 +00:00
2023-02-17 09:21:02 +00:00
createEffect(() => {
2024-01-27 06:21:48 +00:00
const modal = MODALS[searchParams().m]
2023-02-17 09:21:02 +00:00
if (modal) {
showModal(modal)
}
})
2023-03-04 17:26:28 +00:00
2023-02-17 09:21:02 +00:00
const pageComponent = createMemo(() => {
const result = pagesMap[page()?.route || 'home']
2024-01-31 12:34:15 +00:00
if (is404() || !result || page()?.path === '/404') {
2023-02-17 09:21:02 +00:00
return FourOuFourPage
}
return result
})
return (
<MetaProvider>
<Meta name="viewport" content="width=device-width, initial-scale=1" />
<LocalizeProvider>
<MediaQueryProvider>
<SnackbarProvider>
<ConfirmProvider>
<SessionProvider onStateChangeCallback={console.log}>
2024-01-31 12:34:15 +00:00
<FollowingProvider>
<ConnectProvider>
<NotificationsProvider>
<EditorProvider>
<InboxProvider>
<Dynamic component={pageComponent()} {...props} />
</InboxProvider>
</EditorProvider>
</NotificationsProvider>
</ConnectProvider>
</FollowingProvider>
</SessionProvider>
</ConfirmProvider>
</SnackbarProvider>
</MediaQueryProvider>
</LocalizeProvider>
</MetaProvider>
2023-02-17 09:21:02 +00:00
)
}