lume/src/app.tsx

304 lines
8.4 KiB
TypeScript
Raw Permalink Normal View History

2023-10-06 08:30:59 +07:00
import { message } from '@tauri-apps/plugin-dialog';
2023-11-12 15:43:14 +07:00
import { fetch } from '@tauri-apps/plugin-http';
2023-09-30 15:12:33 +07:00
import { RouterProvider, createBrowserRouter, defer, redirect } from 'react-router-dom';
2023-10-01 15:00:38 +07:00
import { ReactFlowProvider } from 'reactflow';
2023-07-04 13:24:42 +07:00
import { OnboardingScreen } from '@app/auth/onboarding';
2023-10-04 11:15:10 +07:00
import { ChatsScreen } from '@app/chats';
2023-07-04 13:24:42 +07:00
import { ErrorScreen } from '@app/error';
2023-10-01 15:00:38 +07:00
import { ExploreScreen } from '@app/explore';
2023-07-04 13:24:42 +07:00
2023-09-24 07:55:27 +07:00
import { useStorage } from '@libs/storage/provider';
2023-08-06 07:59:43 +07:00
import { LoaderIcon } from '@shared/icons';
2023-08-26 09:45:39 +07:00
import { AppLayout } from '@shared/layouts/app';
import { AuthLayout } from '@shared/layouts/auth';
2023-11-17 09:24:21 +07:00
import { NewLayout } from '@shared/layouts/new';
2023-08-26 09:45:39 +07:00
import { NoteLayout } from '@shared/layouts/note';
import { SettingsLayout } from '@shared/layouts/settings';
2023-07-04 13:24:42 +07:00
2023-10-06 07:40:50 +07:00
import './app.css';
2023-06-24 18:31:40 +07:00
2023-09-24 07:55:27 +07:00
export default function App() {
const { db } = useStorage();
2023-09-08 09:22:09 +07:00
2023-09-24 07:55:27 +07:00
const accountLoader = async () => {
try {
2023-10-12 09:13:06 +07:00
// redirect to welcome screen if none user exist
2023-10-16 14:42:19 +07:00
const totalAccount = await db.checkAccount();
2023-10-12 09:13:06 +07:00
if (totalAccount === 0) return redirect('/auth/welcome');
2023-09-24 07:55:27 +07:00
return null;
} catch (e) {
await message(e, { title: 'An unexpected error has occurred', type: 'error' });
}
};
2023-08-06 07:59:43 +07:00
2023-09-30 15:12:33 +07:00
const relayLoader = async ({ params }) => {
return defer({
relay: fetch(`https://${params.url}`, {
method: 'GET',
headers: {
Accept: 'application/nostr+json',
},
2023-10-06 09:08:37 +07:00
}).then((res) => res.json()),
2023-09-30 15:12:33 +07:00
});
};
2023-09-24 07:55:27 +07:00
const router = createBrowserRouter([
{
path: '/',
element: <AppLayout />,
errorElement: <ErrorScreen />,
loader: accountLoader,
children: [
{
path: '',
async lazy() {
2023-11-09 18:02:25 +07:00
const { HomeScreen } = await import('@app/home');
return { Component: HomeScreen };
2023-09-24 07:55:27 +07:00
},
2023-08-11 11:55:31 +07:00
},
2023-09-24 07:55:27 +07:00
{
path: 'users/:pubkey',
async lazy() {
const { UserScreen } = await import('@app/users');
return { Component: UserScreen };
2023-09-22 14:13:55 +07:00
},
2023-08-11 11:55:31 +07:00
},
2023-09-24 07:55:27 +07:00
{
path: 'nwc',
async lazy() {
const { NWCScreen } = await import('@app/nwc');
return { Component: NWCScreen };
},
2023-09-12 08:27:29 +07:00
},
2023-09-30 15:12:33 +07:00
{
path: 'relays',
async lazy() {
const { RelaysScreen } = await import('@app/relays');
return { Component: RelaysScreen };
},
2023-09-30 19:07:17 +07:00
},
{
path: 'relays/:url',
loader: relayLoader,
async lazy() {
const { RelayScreen } = await import('@app/relays/relay');
return { Component: RelayScreen };
},
2023-09-30 15:12:33 +07:00
},
2023-10-04 11:15:10 +07:00
{
path: 'explore',
element: (
<ReactFlowProvider>
<ExploreScreen />
</ReactFlowProvider>
),
errorElement: <ErrorScreen />,
},
{
path: 'chats',
element: <ChatsScreen />,
errorElement: <ErrorScreen />,
children: [
{
path: 'chat/:pubkey',
async lazy() {
const { ChatScreen } = await import('@app/chats/chat');
return { Component: ChatScreen };
},
},
],
},
2023-11-03 15:38:58 +07:00
],
},
2023-09-24 07:55:27 +07:00
{
2023-10-24 13:11:10 +07:00
path: '/new',
2023-11-17 09:24:21 +07:00
element: <NewLayout />,
2023-09-24 07:55:27 +07:00
errorElement: <ErrorScreen />,
children: [
2023-10-21 15:58:39 +07:00
{
2023-10-24 13:11:10 +07:00
path: '',
async lazy() {
const { NewPostScreen } = await import('@app/new/post');
return { Component: NewPostScreen };
},
},
{
path: 'article',
async lazy() {
const { NewArticleScreen } = await import('@app/new/article');
return { Component: NewArticleScreen };
},
},
{
path: 'file',
2023-10-21 15:58:39 +07:00
async lazy() {
2023-10-24 13:11:10 +07:00
const { NewFileScreen } = await import('@app/new/file');
return { Component: NewFileScreen };
2023-10-21 15:58:39 +07:00
},
},
2023-11-17 09:24:21 +07:00
{
path: 'privkey',
async lazy() {
const { NewPrivkeyScreen } = await import('@app/new/privkey');
return { Component: NewPrivkeyScreen };
},
},
2023-10-24 13:11:10 +07:00
],
},
{
path: '/notes',
element: <NoteLayout />,
errorElement: <ErrorScreen />,
children: [
2023-09-24 07:55:27 +07:00
{
path: 'text/:id',
async lazy() {
const { TextNoteScreen } = await import('@app/notes/text');
return { Component: TextNoteScreen };
},
2023-08-26 09:45:39 +07:00
},
2023-09-24 07:55:27 +07:00
{
path: 'article/:id',
async lazy() {
const { ArticleNoteScreen } = await import('@app/notes/article');
return { Component: ArticleNoteScreen };
},
2023-08-26 09:45:39 +07:00
},
2023-09-24 07:55:27 +07:00
],
},
{
path: '/auth',
element: <AuthLayout />,
errorElement: <ErrorScreen />,
children: [
{
path: 'welcome',
async lazy() {
const { WelcomeScreen } = await import('@app/auth/welcome');
return { Component: WelcomeScreen };
},
2023-08-11 11:55:31 +07:00
},
2023-09-24 07:55:27 +07:00
{
2023-10-15 16:10:16 +07:00
path: 'create',
2023-10-16 14:42:19 +07:00
async lazy() {
const { CreateAccountScreen } = await import('@app/auth/create');
return { Component: CreateAccountScreen };
},
2023-09-24 07:55:27 +07:00
},
{
2023-10-15 16:10:16 +07:00
path: 'import',
async lazy() {
const { ImportAccountScreen } = await import('@app/auth/import');
return { Component: ImportAccountScreen };
},
2023-09-24 07:55:27 +07:00
},
{
path: 'onboarding',
element: <OnboardingScreen />,
errorElement: <ErrorScreen />,
children: [
{
path: '',
async lazy() {
2023-10-16 14:42:19 +07:00
const { OnboardingListScreen } = await import(
'@app/auth/onboarding/list'
2023-09-24 07:55:27 +07:00
);
2023-10-16 14:42:19 +07:00
return { Component: OnboardingListScreen };
2023-09-24 07:55:27 +07:00
},
2023-08-11 11:55:31 +07:00
},
2023-09-24 07:55:27 +07:00
{
2023-10-16 14:42:19 +07:00
path: 'enrich',
2023-09-24 07:55:27 +07:00
async lazy() {
2023-10-16 14:42:19 +07:00
const { OnboardEnrichScreen } = await import(
'@app/auth/onboarding/enrich'
2023-09-24 07:55:27 +07:00
);
2023-10-16 14:42:19 +07:00
return { Component: OnboardEnrichScreen };
2023-09-24 07:55:27 +07:00
},
2023-08-11 11:55:31 +07:00
},
2023-10-17 16:33:41 +07:00
{
path: 'hashtag',
async lazy() {
const { OnboardHashtagScreen } = await import(
'@app/auth/onboarding/hashtag'
);
return { Component: OnboardHashtagScreen };
},
},
2023-09-24 07:55:27 +07:00
],
},
],
},
{
path: '/settings',
element: <SettingsLayout />,
errorElement: <ErrorScreen />,
children: [
{
path: '',
async lazy() {
2023-11-15 14:20:45 +07:00
const { UserSettingScreen } = await import('@app/settings');
return { Component: UserSettingScreen };
},
},
{
path: 'edit-profile',
async lazy() {
const { EditProfileScreen } = await import('@app/settings/editProfile');
return { Component: EditProfileScreen };
},
},
{
path: 'edit-contact',
async lazy() {
const { EditContactScreen } = await import('@app/settings/editContact');
return { Component: EditContactScreen };
},
},
{
path: 'general',
async lazy() {
const { GeneralSettingScreen } = await import('@app/settings/general');
return { Component: GeneralSettingScreen };
},
},
{
path: 'backup',
async lazy() {
const { BackupSettingScreen } = await import('@app/settings/backup');
return { Component: BackupSettingScreen };
},
},
{
path: 'advanced',
async lazy() {
const { AdvancedSettingScreen } = await import('@app/settings/advanced');
return { Component: AdvancedSettingScreen };
},
},
{
path: 'about',
async lazy() {
const { AboutScreen } = await import('@app/settings/about');
return { Component: AboutScreen };
2023-09-24 07:55:27 +07:00
},
2023-08-11 11:55:31 +07:00
},
2023-09-24 07:55:27 +07:00
],
},
]);
2023-06-24 18:31:40 +07:00
2023-07-04 13:24:42 +07:00
return (
<RouterProvider
router={router}
2023-08-06 07:59:43 +07:00
fallbackElement={
2023-10-06 07:40:50 +07:00
<div className="flex h-full w-full items-center justify-center">
2023-08-06 07:59:43 +07:00
<LoaderIcon className="h-6 w-6 animate-spin text-white" />
2023-10-06 07:40:50 +07:00
</div>
2023-08-06 07:59:43 +07:00
}
2023-09-24 07:55:27 +07:00
future={{ v7_startTransition: true }}
2023-07-04 13:24:42 +07:00
/>
);
2023-06-24 18:31:40 +07:00
}