├── app ├── favicon.ico ├── page.tsx ├── (auth) │ ├── login │ │ └── [[...login]] │ │ │ └── page.tsx │ └── register │ │ └── [[...register]] │ │ └── page.tsx ├── (main) │ ├── (public) │ │ └── book │ │ │ ├── [clerkUserId] │ │ │ ├── page.tsx │ │ │ └── [eventId] │ │ │ │ ├── page.tsx │ │ │ │ └── success │ │ │ │ └── page.tsx │ │ │ └── page.tsx │ ├── layout.tsx │ └── (private) │ │ ├── events │ │ ├── new │ │ │ └── page.tsx │ │ ├── [eventId] │ │ │ └── edit │ │ │ │ └── page.tsx │ │ └── page.tsx │ │ └── schedule │ │ └── page.tsx ├── layout.tsx └── globals.css ├── postcss.config.mjs ├── next.config.ts ├── drizzle ├── migrations │ ├── meta │ │ ├── _journal.json │ │ └── 0000_snapshot.json │ └── 0000_careful_mesmero.sql ├── db.ts └── schema.ts ├── .env.example ├── components ├── Loading.tsx ├── Booking.tsx ├── ui │ ├── sonner.tsx │ ├── label.tsx │ ├── textarea.tsx │ ├── input.tsx │ ├── switch.tsx │ ├── popover.tsx │ ├── button.tsx │ ├── card.tsx │ ├── calendar.tsx │ ├── form.tsx │ ├── alert-dialog.tsx │ └── select.tsx ├── NoTimeSlots.tsx ├── LandingPage.tsx ├── PublicNavBar.tsx ├── PublicEventCard.tsx ├── cards │ └── EventCard.tsx ├── PrivateNavBar.tsx ├── CopyEventButton.tsx ├── PublicProfile.tsx └── forms │ ├── EventForm.tsx │ ├── ScheduleForm.tsx │ └── MeetingForm.tsx ├── components.json ├── README.md ├── constants └── index.ts ├── .gitignore ├── middleware.ts ├── tsconfig.json ├── lib ├── utils.ts └── formatters.ts ├── schema ├── events.ts ├── meetings.ts └── schedule.ts ├── drizzle.config.ts ├── public └── assets │ ├── public.svg │ ├── events.svg │ ├── schedule.svg │ ├── meeting.svg │ └── planning.svg ├── package.json └── server ├── actions ├── meetings.ts ├── events.ts └── schedule.ts └── google └── googleCalendar.ts /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programming-Fluency/Calendra-Course/HEAD/app/favicon.ico -------------------------------------------------------------------------------- /postcss.config.mjs: -------------------------------------------------------------------------------- 1 | const config = { 2 | plugins: ["@tailwindcss/postcss"], 3 | }; 4 | 5 | export default config; 6 | -------------------------------------------------------------------------------- /next.config.ts: -------------------------------------------------------------------------------- 1 | import type { NextConfig } from "next"; 2 | 3 | const nextConfig: NextConfig = { 4 | /* config options here */ 5 | }; 6 | 7 | export default nextConfig; 8 | -------------------------------------------------------------------------------- /drizzle/migrations/meta/_journal.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "7", 3 | "dialect": "postgresql", 4 | "entries": [ 5 | { 6 | "idx": 0, 7 | "version": "7", 8 | "when": 1746659219873, 9 | "tag": "0000_careful_mesmero", 10 | "breakpoints": true 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY= 2 | CLERK_SECRET_KEY= 3 | NEXT_PUBLIC_CLERK_SIGN_IN_URL=/login 4 | NEXT_PUBLIC_CLERK_SIGN_UP_URL=/register 5 | NEXT_PUBLIC_CLERK_SIGN_IN_FORCE_REDIRECT_URL= /events 6 | NEXT_PUBLIC_CLERK_SIGN_UP_FORCE_REDIRECT_URL=/events 7 | DATABASE_URL= 8 | GOOGLE_OAUTH_CLIENT_ID= 9 | GOOGLE_OAUTH_CLIENT_SECRET= 10 | GOOGLE_OAUTH_REDIRECT_URL= -------------------------------------------------------------------------------- /components/Loading.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | import {Mosaic} from "react-loading-indicators" 3 | 4 | export default function Loading() { 5 | return ( 6 |
28 | Join millions of professionals who easily book meetings with the #1 scheduling tool 29 |
30 | 31 | {/* Illustration below the text */} 32 |This is how people will see your public profile
69 |94 | Time to meet!🧑🤝🧑 95 |
96 |153 | {body} 154 |
155 | ) 156 | } 157 | 158 | export { 159 | useFormField, 160 | Form, 161 | FormItem, 162 | FormLabel, 163 | FormControl, 164 | FormDescription, 165 | FormMessage, 166 | FormField, 167 | } 168 | -------------------------------------------------------------------------------- /components/ui/alert-dialog.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog" 5 | 6 | import { cn } from "@/lib/utils" 7 | import { buttonVariants } from "@/components/ui/button" 8 | 9 | function AlertDialog({ 10 | ...props 11 | }: React.ComponentProps