58 lines
1.6 KiB
TypeScript
58 lines
1.6 KiB
TypeScript
import { getSessionFromHeaders } from '@konobangu/auth/server';
|
|
import { database } from '@konobangu/database';
|
|
import { env } from '@konobangu/env';
|
|
import type { Metadata } from 'next';
|
|
import dynamic from 'next/dynamic';
|
|
import { notFound } from 'next/navigation';
|
|
import { AvatarStack } from './components/avatar-stack';
|
|
import { Cursors } from './components/cursors';
|
|
import { Header } from './components/header';
|
|
|
|
const title = 'Acme Inc';
|
|
const description = 'My application.';
|
|
|
|
const CollaborationProvider = dynamic(() =>
|
|
import('./components/collaboration-provider').then(
|
|
(mod) => mod.CollaborationProvider
|
|
)
|
|
);
|
|
|
|
export const metadata: Metadata = {
|
|
title,
|
|
description,
|
|
};
|
|
|
|
const App = async () => {
|
|
const pages = await database.selectFrom('page').selectAll().execute();
|
|
const { orgId } = await getSessionFromHeaders();
|
|
|
|
if (!orgId) {
|
|
notFound();
|
|
}
|
|
|
|
return (
|
|
<>
|
|
<Header pages={['Building Your Application']} page="Data Fetching">
|
|
{env.LIVEBLOCKS_SECRET && (
|
|
<CollaborationProvider orgId={orgId}>
|
|
<AvatarStack />
|
|
<Cursors />
|
|
</CollaborationProvider>
|
|
)}
|
|
</Header>
|
|
<div className="flex flex-1 flex-col gap-4 p-4 pt-0">
|
|
<div className="grid auto-rows-min gap-4 md:grid-cols-3">
|
|
{pages.map((page) => (
|
|
<div key={page.id} className="aspect-video rounded-xl bg-muted/50">
|
|
{page.name}
|
|
</div>
|
|
))}
|
|
</div>
|
|
<div className="min-h-[100vh] flex-1 rounded-xl bg-muted/50 md:min-h-min" />
|
|
</div>
|
|
</>
|
|
);
|
|
};
|
|
|
|
export default App;
|