Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prod #7

Merged
merged 2 commits into from
Nov 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
157 changes: 100 additions & 57 deletions app/dashboard/components/AddTodo.tsx
Original file line number Diff line number Diff line change
@@ -1,65 +1,108 @@
"use client"
"use client";

import { useAppSelector } from "@/app/store";
import { XMarkIcon } from "@heroicons/react/24/outline";
import { useState } from "react";

const apiUrl = process.env.NEXT_PUBLIC_API_URL;

const AddTodo = (
{ flag, setFlag, addTodoFlag, setAddTodoFlag
}: { flag: boolean, setFlag: any, addTodoFlag: boolean, setAddTodoFlag: any }) => {
const user = useAppSelector((state) => state.auth.user)
const token = useAppSelector((state) => state.auth.token)
const [values, setValues] = useState({ title: "", desc: "", isComplete: false });
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const { name, value } = e.target
setValues({ ...values, [name]: value })
}
const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
setValues({ title: "", desc: "", isComplete: false })
try {
const res = await fetch(`${apiUrl}/users/${user?.id}/todos`, {
method: "POST",
headers: { "Content-Type": "application/json", "Authorization": "Bearer " + token },
body: JSON.stringify(values),
mode: 'cors',
})
const data = await res.json()
console.log(data);
setFlag(!flag)
} catch (error) {
console.error(error);
}
const AddTodo = ({
flag,
setFlag,
addTodoFlag,
setAddTodoFlag,
}: {
flag: boolean;
setFlag: any;
addTodoFlag: boolean;
setAddTodoFlag: any;
}) => {
const apiUrl = process.env.NEXT_PUBLIC_API_URL;
const user = useAppSelector((state) => state.auth.user);
const token = useAppSelector((state) => state.auth.token);
const [values, setValues] = useState({
title: "",
desc: "",
isComplete: false,
});
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const { name, value } = e.target;
setValues({ ...values, [name]: value });
};
const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
setValues({ title: "", desc: "", isComplete: false });
try {
const res = await fetch(`${apiUrl}/users/${user?.id}/todos`, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + token,
},
body: JSON.stringify(values),
mode: "cors",
});
const data = await res.json();
console.log(data);
setFlag(!flag);
} catch (error) {
console.error(error);
}
return (
<div className="rounded-md p-3 m-3 space-y-4 md:space-y-6 sm:p-8 mt-[calc(10vh-0.5rem)] dark:bg-gray-800 dark:border-gray-700">

<form className="relative" onSubmit={handleSubmit}>
<button type="button" onClick={() => setAddTodoFlag(!addTodoFlag)} className="absolute -top-6 -right-4 text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm w-8 h-8 ms-auto inline-flex justify-center items-center dark:hover:bg-gray-600 dark:hover:text-white" >
<XMarkIcon className="w-6 h-6">
</XMarkIcon>
<span className="sr-only">Close modal</span>
</button>
<div className="pb-3">
<label htmlFor="title" className="block mb-1 text-sm font-medium text-gray-900 dark:text-white">
Title
</label>
<input onChange={handleChange} value={values.title} type="text" name="title" id="title" className="bg-gray-50 border border-gray-300 text-gray-900 sm:text-sm rounded-lg focus:ring-indigo-600 focus:border-indigo-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" placeholder="title" required />
</div>
<div className="pb-4">
<label htmlFor="desc" className="block mb-1 text-sm font-medium text-gray-900 dark:text-white">
Description
</label>
<input onChange={handleChange} value={values.desc} type="text" name="desc" id="desc" placeholder="description" className="bg-gray-50 border border-gray-300 text-gray-900 sm:text-sm rounded-lg focus:ring-indigo-600 focus:border-indigo-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" required />
</div>
<button type="submit" className="w-full text-white bg-indigo-600 hover:bg-indigo-700 focus:ring-4 focus:outline-none focus:ring-indigo-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-indigo-600 dark:hover:bg-indigo-700 dark:focus:ring-indigo-800">
Submit
</button>
</form>
};
return (
<div className="rounded-md p-3 m-3 space-y-4 md:space-y-6 sm:p-8 mt-[calc(10vh-0.5rem)] dark:bg-gray-800 dark:border-gray-700">
<form className="relative" onSubmit={handleSubmit}>
<button
type="button"
onClick={() => setAddTodoFlag(!addTodoFlag)}
className="absolute -top-6 -right-4 text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm w-8 h-8 ms-auto inline-flex justify-center items-center dark:hover:bg-gray-600 dark:hover:text-white"
>
<XMarkIcon className="w-6 h-6"></XMarkIcon>
<span className="sr-only">Close modal</span>
</button>
<div className="pb-3">
<label
htmlFor="title"
className="block mb-1 text-sm font-medium text-gray-900 dark:text-white"
>
Title
</label>
<input
onChange={handleChange}
value={values.title}
type="text"
name="title"
id="title"
className="bg-gray-50 border border-gray-300 text-gray-900 sm:text-sm rounded-lg focus:ring-indigo-600 focus:border-indigo-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
placeholder="title"
required
/>
</div>
<div className="pb-4">
<label
htmlFor="desc"
className="block mb-1 text-sm font-medium text-gray-900 dark:text-white"
>
Description
</label>
<input
onChange={handleChange}
value={values.desc}
type="text"
name="desc"
id="desc"
placeholder="description"
className="bg-gray-50 border border-gray-300 text-gray-900 sm:text-sm rounded-lg focus:ring-indigo-600 focus:border-indigo-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
required
/>
</div>
)
}
<button
type="submit"
className="w-full text-white bg-indigo-600 hover:bg-indigo-700 focus:ring-4 focus:outline-none focus:ring-indigo-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-indigo-600 dark:hover:bg-indigo-700 dark:focus:ring-indigo-800"
>
Submit
</button>
</form>
</div>
);
};

export default AddTodo
export default AddTodo;
3 changes: 1 addition & 2 deletions app/dashboard/components/TodoContainer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@ import AddTodo from "./AddTodo";
import { Todo } from "@/app/models/todo";
import { PlusCircleIcon } from "@heroicons/react/24/solid";

const apiUrl = process.env.NEXT_PUBLIC_API_URL;

const TodoContainer = () => {
const apiUrl = process.env.NEXT_PUBLIC_API_URL;
const isAuth = useAppSelector((state) => state.auth.isAuth);
const router = useRouter();
const user = useAppSelector((state) => state.auth.user);
Expand Down
Loading
Loading