diff --git a/.gitignore b/.gitignore index 8f322f0..45c1abc 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ yarn-error.log* # local env files .env*.local +.env # vercel .vercel diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000..df60d30 --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,9 @@ +module.exports = { + semi: true, + singleQuote: true, + trailingComma: 'all', + bracketSameLine: true, + tabWidth: 2, + useTabs: false, + arrowParens: 'always', +}; diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..843f0c2 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,18 @@ +{ + "[javascript]": { + "editor.formatOnSave": false + }, + "eslint.alwaysShowStatus": true, + "javascript.validate.enable": false, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + }, + "workbench.colorCustomizations": { + "titleBar.activeBackground": "#3770FF", + "titleBar.activeForeground": "#ffffff", + "titleBar.inactiveBackground": "#3770FF", + "titleBar.inactiveForeground": "#ffffff" + } + // Enables TypeScript check for all files, but instantly kills RAM so only enable when needed + // "typescript.tsserver.experimental.enableProjectDiagnostics": true +} diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx index a3c8586..3dd02ca 100644 --- a/app/dashboard/page.tsx +++ b/app/dashboard/page.tsx @@ -1,10 +1,17 @@ -import StatusAlert from "@/components/ui/status-alert"; +import PageContent from '@/components/layouts/page-content'; +import DashboardFeatureList from '@/components/sections/dashboard-features-list'; +import DashboardRecentActivity from '@/components/sections/dashboard-recent-activity'; +import TopicSuggestions from '@/components/sections/topic-suggestions'; -const Dashboard: React.FunctionComponent = () =>{ - return( -
- -
- ) -} -export default Dashboard; \ No newline at end of file +const Dashboard: React.FunctionComponent = () => { + return ( + +
+ + {/* */} + {/* */} +
+
+ ); +}; +export default Dashboard; diff --git a/app/globals.css b/app/globals.css index bd6213e..af525c0 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,3 +1,29 @@ @tailwind base; @tailwind components; -@tailwind utilities; \ No newline at end of file +@tailwind utilities; + +body, +html { + @apply text-neutral-800; +} + +.view-container { + @apply box-border mx-auto; + @apply w-[1250px] max-2xl:w-[1200px] max-xl:w-[920px] max-lg:w-[720px] max-md:w-[600px] max-sm:w-[440px]; +} + +h1, +h2, +h3, +h4 { + @apply tracking-tight; +} + +.hide-scrollbar::-webkit-scrollbar { + width: 0; /* Remove scrollbar space */ + background: transparent; /* Optional: just make scrollbar invisible */ +} + +.form-input-wrapper { + @apply grid grid-cols-1 gap-2 my-6; +} diff --git a/app/layout.tsx b/app/layout.tsx index 7870e8b..a9fd906 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,16 +1,20 @@ -import './globals.css' -import { Inter } from 'next/font/google' +import Navbar from '@/components/sections/navbar'; +import './globals.css'; +import { Inter } from 'next/font/google'; -const inter = Inter({ subsets: ['latin'] }) +const inter = Inter({ subsets: ['latin'] }); export default function RootLayout({ children, }: { - children: React.ReactNode + children: React.ReactNode; }) { return ( - {children} + + + {children} + - ) + ); } diff --git a/app/page.tsx b/app/page.tsx index 18f3e06..25d9f69 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,11 +1,15 @@ -import StatusAlert from "@/components/ui/status-alert"; +import PageContent from '@/components/layouts/page-content'; +import ViewContainer from '@/components/layouts/view-container'; +import StatusAlert from '@/components/ui/status-alert'; const App: React.FunctionComponent = () => { return ( -
- -
- ) -} + + + + + + ); +}; -export default App; \ No newline at end of file +export default App; diff --git a/app/qna/page.tsx b/app/qna/page.tsx new file mode 100644 index 0000000..8a3880f --- /dev/null +++ b/app/qna/page.tsx @@ -0,0 +1,120 @@ +'use client'; +import PageContent from '@/components/layouts/page-content'; +import ViewContainer from '@/components/layouts/view-container'; + +import { Button } from '@/components/ui/button'; + +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from '@/components/ui/dialog'; + +import { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectLabel, + SelectTrigger, + SelectValue, +} from '@/components/ui/select'; + +import { Label } from '@/components/ui/label'; +import { useState } from 'react'; +import { fetchRecentQNASessions } from '@/middleware/qna/recent-sessions'; +import { RecentSessionsEmptyStateView } from '@/components/ui/empty-states'; +import { RecentQnASessionsList } from '@/components/sections/recent-qna-sessions-list'; +import { fetchTopics } from '@/middleware/qna/sessions'; +import { getTopicDepthLevels } from '@/common'; + +const TopicBasedQNA: React.FunctionComponent = () => { + const [recentQNASessions, setRecentQNASessions] = useState< + Array + >(fetchRecentQNASessions()); + + const [userTopics, setUserTopics] + = useState>(fetchTopics()); + + return ( + +
+ +

{'Your Q/A Sessions'}

+
+ + + + + + + Start a new Q/A Session + + Provide information related to new session. This helps us to + gather topics for you + + +
+
+ + +
+
+ + +
+
+ + + + + +
+
+
+
+
+ {recentQNASessions.length ? ( + + ) : ( + + )} +
+ ); +}; + +export default TopicBasedQNA; diff --git a/common/dashboard-feature-list.tsx b/common/dashboard-feature-list.tsx new file mode 100644 index 0000000..d77b882 --- /dev/null +++ b/common/dashboard-feature-list.tsx @@ -0,0 +1,38 @@ +import { cn } from '@/lib/utils'; +import { + Briefcase, + FileSearch, + MessagesSquare, + PencilLine, + Video, +} from 'lucide-react'; + +const FeatureList: Array = [ + { + featureName: 'Video Interview', + icon: