Skip to content

Commit

Permalink
feat: implement schedule meeting
Browse files Browse the repository at this point in the history
  • Loading branch information
ladunjexa committed Apr 29, 2024
1 parent ca0a7ea commit 0e9d9b6
Show file tree
Hide file tree
Showing 7 changed files with 136 additions and 3 deletions.
4 changes: 2 additions & 2 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true,
"source.addMissingImports": true
"source.fixAll.eslint": "explicit",
"source.addMissingImports": "explicit"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
Expand Down
1 change: 1 addition & 0 deletions app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import React from "react";
import type { Metadata } from "next";
import { Inter } from "next/font/google";
import "@stream-io/video-react-sdk/dist/css/styles.css";
import "react-datepicker/dist/react-datepicker.css";
import "./globals.css";
import { ClerkProvider } from "@clerk/nextjs";
import { Toaster } from "@/components/ui/toaster";
Expand Down
2 changes: 1 addition & 1 deletion components/meeting-modal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ type MeetingModalProps = {
isOpen: boolean;
onClose: () => void;
title: string;
className: string;
className?: string;
children?: React.ReactNode;
buttonText?: string;
handleClick?: () => void;
Expand Down
55 changes: 55 additions & 0 deletions components/meeting-type-list.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import MeetingModal from "./meeting-modal";
import { useUser } from "@clerk/nextjs";
import { Call, useStreamVideoClient } from "@stream-io/video-react-sdk";
import { useToast } from "./ui/use-toast";
import { Textarea } from "@/components/ui/textarea";
import ReactDatePicker from "react-datepicker";

type Props = {};

Expand Down Expand Up @@ -70,6 +72,8 @@ const MeetingTypeList = (props: Props) => {
}
};

const meetingLink = `${process.env.NEXT_PUBLIC_BASE_URL}/meeting/${callDetails?.id}`;

return (
<section className="grid grid-cols-1 gap-5 md:grid-cols-2 xl:grid-cols-4">
<HomeCard
Expand Down Expand Up @@ -101,6 +105,57 @@ const MeetingTypeList = (props: Props) => {
className="bg-yellow-1"
/>

{!callDetails ? (
<MeetingModal
isOpen={meetingState === "isScheduleMeeting"}
onClose={() => setMeetingState(undefined)}
title="Create a Meeting"
handleClick={createMeeting}
>
<div className="flex flex-col gap-2.5">
<label className="text-base font-normal leading-[22px] text-sky-2">
Add a description
</label>
<Textarea
className="border-none bg-dark-3 focus-visible:ring-0 focus-visible:ring-offset-0"
onChange={e => {
setValues({ ...values, description: e.target.value });
}}
/>
</div>
<div className="flex w-full flex-col gap-2.5">
<label className="text-base font-normal leading-[22px] text-sky-2">
Select a date and time
</label>
<ReactDatePicker
selected={values.dateTime}
onChange={date => {
setValues({ ...values, dateTime: date! });
}}
showTimeSelect
timeFormat="HH:mm"
timeIntervals={15}
timeCaption="time"
dateFormat="MMMM d, yyyy h:mm aa"
className="w-full rounded bg-dark-3 p-2 focus:outline-none"
/>
</div>
</MeetingModal>
) : (
<MeetingModal
isOpen={meetingState === "isScheduleMeeting"}
onClose={() => setMeetingState(undefined)}
title="Meeting Created"
className="text-center"
handleClick={() => {
navigator.clipboard.writeText(meetingLink);
toast({ title: "Linked copied" });
}}
image="/icons/checked.svg"
buttonIcon="/icons/copy.svg"
buttonText="Copy Meeting Link"
/>
)}
<MeetingModal
isOpen={meetingState === "isInstantMeeting"}
onClose={() => setMeetingState(undefined)}
Expand Down
24 changes: 24 additions & 0 deletions components/ui/textarea.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import * as React from "react"

import { cn } from "@/lib/utils"

export interface TextareaProps
extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}

const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
({ className, ...props }, ref) => {
return (
<textarea
className={cn(
"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
className
)}
ref={ref}
{...props}
/>
)
}
)
Textarea.displayName = "Textarea"

export { Textarea }
51 changes: 51 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,15 @@
"next": "14.2.3",
"prettier": "^3.2.5",
"react": "^18",
"react-datepicker": "^6.9.0",
"react-dom": "^18",
"tailwind-merge": "^2.3.0",
"tailwindcss-animate": "^1.0.7"
},
"devDependencies": {
"@types/node": "^20",
"@types/react": "^18",
"@types/react-datepicker": "^6.2.0",
"@types/react-dom": "^18",
"eslint": "^8",
"eslint-config-next": "14.2.3",
Expand Down

0 comments on commit 0e9d9b6

Please # to comment.