diff --git a/backend/src/main/java/com/barmjz/productivityapp/Folder/Folder.java b/backend/src/main/java/com/barmjz/productivityapp/Folder/Folder.java index 39d43c8..82346e5 100644 --- a/backend/src/main/java/com/barmjz/productivityapp/Folder/Folder.java +++ b/backend/src/main/java/com/barmjz/productivityapp/Folder/Folder.java @@ -45,7 +45,11 @@ public class Folder { private Date CreatedDate; private Date modifiedDate; - @ManyToOne(fetch = FetchType.LAZY, optional = false) + @ManyToOne( + optional = false, + cascade = CascadeType.ALL + ) + @OnDelete(action = OnDeleteAction.CASCADE) @JoinColumn( name = "user_id", referencedColumnName = "id" diff --git a/backend/src/main/java/com/barmjz/productivityapp/Note/NoteController.java b/backend/src/main/java/com/barmjz/productivityapp/Note/NoteController.java index f5fd095..956671c 100644 --- a/backend/src/main/java/com/barmjz/productivityapp/Note/NoteController.java +++ b/backend/src/main/java/com/barmjz/productivityapp/Note/NoteController.java @@ -1,7 +1,6 @@ package com.barmjz.productivityapp.Note; -import com.fasterxml.jackson.databind.node.ObjectNode; import lombok.AllArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -27,13 +26,13 @@ public ResponseEntity createNote(@RequestParam("folderId") Long folderId, } @PutMapping("/modify") - public ResponseEntity modifyNote(@RequestParam("noteId") Long noteId, @RequestBody ObjectNode objectNode) { + public ResponseEntity modifyNote(@RequestParam("folderId") Long folderId, @RequestBody String modifiedNote) { try { - String title = objectNode.get("title").asText(); - String content = objectNode.get("content").asText(); - return ResponseEntity.status(HttpStatus.OK).body(noteManager.modifyNote(noteId, title, content)); + System.out.println(modifiedNote); +// return ResponseEntity.status(HttpStatus.OK).body(noteManager.modifyNote(modifiedNote, folderId)); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null); } catch (Exception exception) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Fuck"); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null); } } diff --git a/backend/src/main/java/com/barmjz/productivityapp/Note/NoteManager.java b/backend/src/main/java/com/barmjz/productivityapp/Note/NoteManager.java index 323c108..61851d0 100644 --- a/backend/src/main/java/com/barmjz/productivityapp/Note/NoteManager.java +++ b/backend/src/main/java/com/barmjz/productivityapp/Note/NoteManager.java @@ -39,18 +39,24 @@ public Note createNote(Long folderId, String noteTitle){ return newNote; } - public String modifyNote(Long noteId, String title, String content){ - if(noteId == null || !noteRepo.existsById(noteId)) + public Note modifyNote(Note modifiedNote, Long folderId){ + if(modifiedNote == null || modifiedNote.getId() == null) + throw new NullPointerException("note is null"); + if(!noteRepo.existsById(modifiedNote.getId())) throw new NoSuchElementException("note not found"); - Note existedNote = noteRepo.getReferenceById(noteId); - if( (noteRepo.existsByTitleAndFolder_Id(title,existedNote.getFolder().getId())) && - (!noteRepo.findByTitleAndFolder_Id(title,existedNote.getFolder().getId()).getId().equals(existedNote.getId()))) - throw new IllegalStateException("note new title already exist"); - existedNote.setTitle(title); - existedNote.setContent(content); +// if(!noteRepo.findByTitleAndFolder_Id(modifiedNote.getTitle(),folderId) +// .getId().equals(modifiedNote.getId())) +// throw new IllegalStateException("note title already exist"); + Note existedNote = noteRepo.getReferenceById(modifiedNote.getId()); + // need more efficient way + existedNote.setTitle(modifiedNote.getTitle()); + existedNote.setContent(modifiedNote.getContent()); existedNote.setModifiedDate(new Date()); + existedNote.setStarred(modifiedNote.isStarred()); + existedNote.setColor(modifiedNote.getColor()); + existedNote.setFontSize(modifiedNote.getFontSize()); noteRepo.save(existedNote); - return "note modified"; + return existedNote; } public List getFolderNotes(Long folderId){ @@ -74,8 +80,8 @@ public List getUserStarredNotes(Long userId){ public Note moveNote(Long newFolderId, Long noteId){ if(noteId == null || newFolderId == null || !folderRepo.existsFolderById(newFolderId) || !noteRepo.existsById(noteId)) throw new NoSuchElementException("not found"); - Note note = noteRepo.findById(noteId).get(); - note.setFolder(folderRepo.findById(newFolderId).get()); + Note note = noteRepo.getReferenceById(noteId); + note.setFolder(folderRepo.getReferenceById(newFolderId)); noteRepo.save(note); return note; } diff --git a/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/category/CategoryController.java b/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/category/CategoryController.java index 67677fd..a48d754 100644 --- a/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/category/CategoryController.java +++ b/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/category/CategoryController.java @@ -6,6 +6,7 @@ @AllArgsConstructor @RestController @RequestMapping("/api/category") +@CrossOrigin public class CategoryController { private final CategoryService categoryService; diff --git a/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/category/CategoryRepo.java b/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/category/CategoryRepo.java index 5f07541..83005e6 100644 --- a/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/category/CategoryRepo.java +++ b/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/category/CategoryRepo.java @@ -4,6 +4,7 @@ import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Optional; @@ -18,8 +19,9 @@ public interface CategoryRepo extends JpaRepository { Optional> getCategoryByUserId(long userId); - @Modifying - @Query("UPDATE Category SET category_name = ?1 WHERE id = ?2") + @Modifying(clearAutomatically = true) + @Transactional + @Query("UPDATE Category c SET c.category_name = ?1 WHERE c.id = ?2") void renameCategory(String categoryName, long id); } diff --git a/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/task/CategoryPair.java b/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/task/CategoryPair.java index 89e8e87..7fd6fb2 100644 --- a/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/task/CategoryPair.java +++ b/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/task/CategoryPair.java @@ -11,6 +11,7 @@ @Setter @AllArgsConstructor public class CategoryPair { - Category category; + long id; + String name; List tasks; } diff --git a/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/task/OneTimeTaskRepo.java b/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/task/OneTimeTaskRepo.java index 7c12758..e58ec9f 100644 --- a/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/task/OneTimeTaskRepo.java +++ b/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/task/OneTimeTaskRepo.java @@ -1,10 +1,12 @@ package com.barmjz.productivityapp.todo_task_category.task; import com.barmjz.productivityapp.todo_task_category.category.Category; import com.barmjz.productivityapp.user.User; +import jakarta.persistence.NamedStoredProcedureQuery; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.List; @@ -20,15 +22,18 @@ public interface OneTimeTaskRepo extends JpaRepository { Optional> getTop10ByUserIdAndCompletionDateNotNullOrderByCompletionDateDesc(Long userId); - + @Transactional @Modifying(clearAutomatically = true) @Query("UPDATE OneTimeTask t SET t.completionDate = ?2 WHERE t.id = ?1") void markTaskAsDone(Long taskId, Date currentDate); + @Transactional + @Modifying(clearAutomatically = true) @Query("UPDATE OneTimeTask t SET t.completionDate = null WHERE t.id = ?1") void unMarkTaskAsDone(Long taskId); + @Transactional @Modifying(clearAutomatically = true) @Query("UPDATE OneTimeTask t SET t.todo = ?2 WHERE t.id = ?1") void changeTodoFlag(Long taskId, boolean bool); diff --git a/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/task/Task.java b/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/task/Task.java index 1c76cb6..4a5937b 100644 --- a/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/task/Task.java +++ b/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/task/Task.java @@ -20,7 +20,6 @@ public class Task extends AbstractTask { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) - @JsonIgnore private Date creationDate; @ManyToOne(fetch = FetchType.LAZY) @@ -29,7 +28,6 @@ public class Task extends AbstractTask { @ManyToOne(fetch = FetchType.LAZY, optional = false) @JoinColumn(name = "userId", referencedColumnName = "id") - @JsonIgnore private User user; } \ No newline at end of file diff --git a/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/task/TaskController.java b/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/task/TaskController.java index 0fcb76e..8097879 100644 --- a/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/task/TaskController.java +++ b/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/task/TaskController.java @@ -9,6 +9,7 @@ @AllArgsConstructor @RestController @RequestMapping("/api/task") +@CrossOrigin public class TaskController { private final TaskService taskService; @@ -46,7 +47,7 @@ public ResponseEntity deleteTask(@PathVariable Long taskId) { } @PostMapping("/") - public ResponseEntity createTask(@RequestBody Task task, @RequestParam String taskType) { + public ResponseEntity createTask(@RequestBody Object task, @RequestParam String taskType) { try { return ResponseEntity.ok(taskService.createTask(task, taskType)); } catch (Exception e) { diff --git a/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/task/TaskService.java b/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/task/TaskService.java index 32c5240..e196282 100644 --- a/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/task/TaskService.java +++ b/backend/src/main/java/com/barmjz/productivityapp/todo_task_category/task/TaskService.java @@ -64,14 +64,16 @@ public void deleteTask(Long taskId){ repeatedTaskRepo.deleteById(taskId); } - public Task createTask(Task task, String taskType){ + public Task createTask(Object task, String taskType){ Task newTask; if (taskType.equals("onetime")) { + OneTimeTask parsedOnetimeTask = (OneTimeTask) task; oneTimeTaskRepo.save((OneTimeTask) task); - newTask = oneTimeTaskRepo.getByCreationDate(task.getCreationDate()).orElse(null); + newTask = oneTimeTaskRepo.getByCreationDate(parsedOnetimeTask.getCreationDate()).orElse(null); } else { repeatedTaskRepo.save((RepeatedTask) task); - newTask = repeatedTaskRepo.getByCreationDate(task.getCreationDate()).orElse(null); + RepeatedTask parsedOnetimeTask = (RepeatedTask) task; + newTask = repeatedTaskRepo.getByCreationDate(parsedOnetimeTask.getCreationDate()).orElse(null); } return newTask; } @@ -79,7 +81,7 @@ public Task createTask(Task task, String taskType){ public Task tickTask(Long taskId, Long date, String taskType){ Task newTask; Date currentDate = new Date(date); - User user = userRepo.getUserByEmail(userAuthentication.getName()).orElse(null); + User user = userRepo.getUserByEmail(SecurityContextHolder.getContext().getAuthentication().getName()).orElse(null); if (taskType.equals("onetime")) { oneTimeTaskRepo.markTaskAsDone(taskId, currentDate); newTask = oneTimeTaskRepo.findById(taskId).get(); @@ -122,7 +124,7 @@ public Task untickTask(Long taskId, Long date){ } public List getCompletedTasks(){ - User user = userRepo.getUserByEmail(userAuthentication.getName()).orElse(null); + User user = userRepo.getUserByEmail(SecurityContextHolder.getContext().getAuthentication().getName()).orElse(null); List completedOneTimeTasks = oneTimeTaskRepo.getCompletedTasks(user).orElse(null); assert completedOneTimeTasks != null; return new ArrayList<>(completedOneTimeTasks); @@ -130,7 +132,7 @@ public List getCompletedTasks(){ public List getCategorizedTasks(){ - String user = userAuthentication.getName(); + String user = SecurityContextHolder.getContext().getAuthentication().getName(); List categoryTaskPairs = new ArrayList<>(); List categories = categoryRepo .getCategoryByUserId( @@ -146,7 +148,7 @@ public List getCategorizedTasks(){ categoryTasks.addAll(repeatedTaskRepo .getAllByCategory(category) .get()); - categoryTaskPairs.add(new CategoryPair(category, categoryTasks)); + categoryTaskPairs.add(new CategoryPair(category.getId(), category.getCategory_name(), categoryTasks)); } return categoryTaskPairs; } diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 9ba29f8..c6b8478 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -7,4 +7,4 @@ spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect rsa.private-key=classpath:certs/private.pem -rsa.public-key=classpath:certs/public.pem +rsa.public-key=classpath:certs/public.pem \ No newline at end of file diff --git a/backend/src/test/java/com/barmjz/productivityapp/Folder/GetUserFolderTest.java b/backend/src/test/java/com/barmjz/productivityapp/Folder/GetUserFolderTest.java index 2731245..de7235b 100644 --- a/backend/src/test/java/com/barmjz/productivityapp/Folder/GetUserFolderTest.java +++ b/backend/src/test/java/com/barmjz/productivityapp/Folder/GetUserFolderTest.java @@ -71,7 +71,6 @@ void getExistedUserFolders(){ @Test void getNonExistedUserFolders(){ - userRepo.save(user1); folderRepo.save(folder1); folderRepo.save(folder2); assertThatThrownBy(() -> folderManager.getUserFolders(user1.getId()+3)) diff --git a/backend/src/test/java/com/barmjz/productivityapp/Note/CreateNoteTest.java b/backend/src/test/java/com/barmjz/productivityapp/Note/CreateNoteTest.java index 6ce8fc8..6f65174 100644 --- a/backend/src/test/java/com/barmjz/productivityapp/Note/CreateNoteTest.java +++ b/backend/src/test/java/com/barmjz/productivityapp/Note/CreateNoteTest.java @@ -3,7 +3,6 @@ import com.barmjz.productivityapp.Folder.Folder; import com.barmjz.productivityapp.Folder.FolderRepo; import com.barmjz.productivityapp.user.User; -import com.barmjz.productivityapp.user.UserRepo; import lombok.Data; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -20,11 +19,9 @@ @DataJpaTest class CreateNoteTest { - @Autowired UserRepo userRepo; @Autowired FolderRepo folderRepo; @Autowired NoteRepo noteRepo; NoteManager noteManager; - User user; Folder folder; Note note1; Note note2; @@ -36,16 +33,14 @@ void setUp() { folderRepo.deleteAll(); noteRepo.deleteAll(); date = new Date(); - user = User.builder() - .email("user1@gmail.com") - .password("pass") - .firstName("userFirst") - .lastName("userLast") - .build(); - userRepo.save(user); folder = Folder.builder() .name("folder") - .user(user) + .user(User.builder() + .email("user1@gmail.com") + .password("pass") + .firstName("userFirst") + .lastName("userLast") + .build()) .CreatedDate(date) .modifiedDate(date) .build(); diff --git a/backend/src/test/java/com/barmjz/productivityapp/Note/GetNoteTest.java b/backend/src/test/java/com/barmjz/productivityapp/Note/GetNoteTest.java index ec04ebe..6fec96a 100644 --- a/backend/src/test/java/com/barmjz/productivityapp/Note/GetNoteTest.java +++ b/backend/src/test/java/com/barmjz/productivityapp/Note/GetNoteTest.java @@ -102,7 +102,7 @@ void getStarredNotes(){ note2 = noteManager.createNote(folder2.getId(),"note2"); note2.setContent("content2"); noteManager.alterStar(note2.getId()); - noteManager.modifyNote(note2.getId(), note2.getTitle(), note2.getContent()); + noteManager.modifyNote(note2, note2.getFolder().getId()); assertThat(note2.isStarred()).isTrue(); assertThat(noteRepo.findById(note2.getId()).get().getContent()).isEqualTo("content2"); List starredNotes = new ArrayList<>(); diff --git a/backend/src/test/java/com/barmjz/productivityapp/Note/ModifyNoteTest.java b/backend/src/test/java/com/barmjz/productivityapp/Note/ModifyNoteTest.java index 6beed93..b331f66 100644 --- a/backend/src/test/java/com/barmjz/productivityapp/Note/ModifyNoteTest.java +++ b/backend/src/test/java/com/barmjz/productivityapp/Note/ModifyNoteTest.java @@ -3,7 +3,6 @@ import com.barmjz.productivityapp.Folder.Folder; import com.barmjz.productivityapp.Folder.FolderRepo; import com.barmjz.productivityapp.user.User; -import com.barmjz.productivityapp.user.UserRepo; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -19,8 +18,8 @@ @DataJpaTest class ModifyNoteTest { - @Autowired UserRepo userRepo; - @Autowired FolderRepo folderRepo; + @Autowired + FolderRepo folderRepo; @Autowired NoteRepo noteRepo; NoteManager noteManager; Folder folder; @@ -34,16 +33,14 @@ void setUp() { folderRepo.deleteAll(); noteRepo.deleteAll(); date = new Date(); - User user = User.builder() - .email("user1@gmail.com") - .password("pass") - .firstName("userFirst") - .lastName("userLast") - .build(); - userRepo.save(user); folder = Folder.builder() .name("folder") - .user(user) + .user(User.builder() + .email("user1@gmail.com") + .password("pass") + .firstName("userFirst") + .lastName("userLast") + .build()) .CreatedDate(date) .modifiedDate(date) .build(); @@ -61,16 +58,19 @@ void modifyNote(){ .folder(folder) .createdDate(date) .modifiedDate(date) + .fontSize(8) .build(); - noteManager.modifyNote(note2.getId(), note2.getTitle(), note2.getContent()); + noteManager.modifyNote(note2, folder.getId()); assertThat(noteRepo.findById(note1.getId()).get().getContent()).isEqualTo("note 1 content"); + assertThat(noteRepo.findById(note1.getId()).get().getFontSize()).isEqualTo(8); +// assertThat(noteRepo.findById(note1.getId()).get()).isEqualTo(note2); } @Test void invalidModifiedNote(){ - assertThatThrownBy(() -> noteManager.modifyNote(null, "new title", "new content")) - .isInstanceOf(NoSuchElementException.class) - .hasMessageContaining("note not found"); + assertThatThrownBy(() -> noteManager.modifyNote(null, folder.getId())) + .isInstanceOf(NullPointerException.class) + .hasMessageContaining("note is null"); } @Test @@ -85,8 +85,9 @@ void modifyNonExistedNote(){ .folder(folder) .createdDate(date) .modifiedDate(date) + .fontSize(8) .build(); - assertThatThrownBy(() -> noteManager.modifyNote(note2.getId(),note2.getTitle(), note2.getContent())) + assertThatThrownBy(() -> noteManager.modifyNote(note2,folder.getId())) .isInstanceOf(NoSuchElementException.class) .hasMessageContaining("note not found"); } diff --git a/frontend/api/notes.api.js b/frontend/api/notes.api.js index 4b5b041..d0d402b 100644 --- a/frontend/api/notes.api.js +++ b/frontend/api/notes.api.js @@ -105,24 +105,21 @@ export const getFolders = async (token) => { return response; } - export const editNote = async (noteId, title, content, token) => { - const url = `${BACKEND_URL}/note/modify?noteId=${noteId}`; + export const editNote = async (note, folderId, token) => { + const url = `${BACKEND_URL}/note/modify?folderId=${folderId}`; - const stringBody = { - title: `${title}`, - content: `${content}` - } + console.log("Note", note) const response = await fetch(url, { method: "PUT", headers: { "Content-type": "application/json", Authorization: `Bearer ${token}` }, - body: JSON.stringify(stringBody), + body: note, }).catch((error) => { throw new Error("Problem connecting with the server!"); }); if (response.status !== 200) { - const message = "I don't Know Yet"; + const message = "Folder has the same name as this"; throw new Error(message); } diff --git a/frontend/api/task.api.js b/frontend/api/task.api.js index 73be775..ae41232 100644 --- a/frontend/api/task.api.js +++ b/frontend/api/task.api.js @@ -1,12 +1,120 @@ -const fetchTask = (id, token) => {}; -const updateTask = (id, updates, token) => {}; -const deleteTask = (id, token) => {}; -const createTask = (task, token) => {}; -const tickTask = (id, token) => {}; -const untickTask = (id, token) => {}; - -const fetchTasks = (token) => {}; -const fetchCompletedTasks = (token) => {}; +import { async } from "q"; +import { BACKEND_URL } from "./const"; + + +const fetchTask = async (id, token) => { + const url = `${BACKEND_URL}/api/task/${id}`; + + const response = await fetch(url, { + method: "GET", + headers: { Authorization: `Bearer ${token}` }, + }); + + if (response.status !== 200) { + throw new Error(response.status); + } + return response.json(); +}; +const updateTask = async (id, updates, token) => { + const url = `${BACKEND_URL}/api/task/${id}`; + + const response = await fetch(url, { + method: "PUT", + headers: { + Authorization: `Bearer ${token}`, + "Content-type": "application/json" }, + body: JSON.stringify(updates), + }); + + if (response.status !== 200) { + throw new Error(response.status); + } + return response.json(); +}; +const deleteTask = async (id, token) => { + const url = `${BACKEND_URL}/api/task/${id}`; + + const response = await fetch(url, { + method: "DELETE", + headers: { Authorization: `Bearer ${token}` }, + }); + + if (response.status !== 200) { + throw new Error(response.status); + } + return response.text(); + +}; +const createTask = async (task, token) => { + const url = `${BACKEND_URL}/api/task/taskType=${task}`; + + const response = await fetch(url, { + method: "POST", + headers: { + Authorization: `Bearer ${token}`, + "Content-type": "application/json" }, + body: JSON.stringify(task), + }); + + if (response.status !== 200) { + throw new Error(response.status); + } + return response.json(); +}; +const tickTask = async (id, token, date, taskType) => { + const url = `${BACKEND_URL}/api/task/${id}/tick?date=${date}&taskType=${taskType}`; + + const response = await fetch(url, { + method: "PUT", + headers: { Authorization: `Bearer ${token}` }, + }); + + if (response.status !== 200) { + throw new Error(response.status); + } + return response.json(); + +}; +const untickTask = async (id, token, date) => { + const url = `${BACKEND_URL}/api/task/${id}/untick?date=${date}`; + + const response = await fetch(url, { + method: "PUT", + headers: { Authorization: `Bearer ${token}` }, + }); + + if (response.status !== 200) { + throw new Error(response.status); + } + return response.json(); +}; + +const fetchTasks = async (token) => { + const url = `${BACKEND_URL}/api/task/`; + + const response = await fetch(url, { + method: "GET", + headers: { Authorization: `Bearer ${token}` }, + }); + + if (response.status !== 200) { + throw new Error(response.status); + } + return response.json(); +}; +const fetchCompletedTasks = async (token) => { + const url = `${BACKEND_URL}/api/task/completed`; + + const response = await fetch(url, { + method: "GET", + headers: { Authorization: `Bearer ${token}` }, + }); + + if (response.status !== 200) { + throw new Error(response.status); + } + return response.json(); +}; export const TASK_API = { fetchTask, diff --git a/frontend/babel.config.js b/frontend/babel.config.js index 99860ab..2900afe 100644 --- a/frontend/babel.config.js +++ b/frontend/babel.config.js @@ -1,10 +1,6 @@ -module.exports = function (api) { +module.exports = function(api) { api.cache(true); return { - presets: ["babel-preset-expo"], - plugins: [ - "@babel/plugin-proposal-export-namespace-from", - "react-native-reanimated/plugin", - ], + presets: ['babel-preset-expo'], }; }; diff --git a/frontend/components/CompletedList.js b/frontend/components/CompletedList.js new file mode 100644 index 0000000..9472766 --- /dev/null +++ b/frontend/components/CompletedList.js @@ -0,0 +1,77 @@ +import React, { useEffect, useState, useCallback } from "react"; +import { Heading, HStack, Switch, VStack, Text, ScrollView } from "native-base"; +import CompletedTask from "./CompletedTask"; + +import { TODO_API } from "../api/todo.api"; +import { TASK_API } from "../api/task.api"; + +const CompletedList = (props) => { + const [data, setData] = useState(DUMMY_COMPLETED); + + const fetchCompletedTasks = async () => { + //TODO + }; + + useEffect(() => { + fetchCompletedTasks() + }, []); + + const removeTask = (taskId) => { + setData((data) => data.filter((task) => task.id !== taskId)); + TASK_API.deleteTask(taskId); + }; + + const untickTask = (taskId) => { + setData((data) => data.filter((task) => task.id !== taskId)); + TASK_API.untickTask(taskId); + }; + + return ( + + + Completed + + + + {data.map((item) => ( + + ))} + + + + ); +}; + +export default CompletedList; + +const DUMMY_COMPLETED = [ + { id: 1, label: "Random task", type: "repeated" }, + { id: 2, label: "Study algorithms", type: "repeated", category: "College" }, + { id: 3, label: "Simple task", type: "onetime" }, + { + id: 4, + label: "SWE Sheet", + type: "onetime", + dueDate: "2 days, 23 hours, 59 mins left", + category: "College", + }, + { + id: 5, + label: "Pay internet bills", + type: "onetime", + dueDate: "4 days, 5 hours", + }, + { + id: 6, + label: "REALLY Looooooooooooooooooooooooooooooooooong task", + type: "repeated", + category: + "CollegeCollegeCollegeCollegeCollegeCollegeCollegeCollegeCollegeCollegeCollegeCollege", + }, +]; diff --git a/frontend/components/CompletedTask.js b/frontend/components/CompletedTask.js new file mode 100644 index 0000000..29ce76e --- /dev/null +++ b/frontend/components/CompletedTask.js @@ -0,0 +1,69 @@ +import { + Text, + HStack, + Checkbox, + VStack, + CloseIcon, + IconButton, + Pressable, + } from "native-base"; + import React, { useState } from "react"; + import SingleLineText from "../UI/SingleLineText"; + import Tag from "../UI/Tag"; + + const CompletedTask = (props) => { + const { data, showCategory, onTaskRemoval, onTaskDecompletion } = props; + + const [isDone, setIsDone] = useState(false); + const decompleteTask = () => { + setIsDone(current => !current); + onTaskDecompletion(data.id); + }; + + + const removeTaskHandler = () => { + onTaskRemoval(data.id); + }; + + const viewTaskDetails = (taskId) => { + // TODO + }; + + return ( + + + + + + + {data.label} + + + + + {showCategory && data.category && Category: {data.category}} + + } + colorScheme="red" + onPress={removeTaskHandler} + /> + + ); + }; + + export default CompletedTask; + \ No newline at end of file diff --git a/frontend/components/login-component/LoginScreen.js b/frontend/components/login-component/LoginScreen.js index 5419c8e..253f2b9 100644 --- a/frontend/components/login-component/LoginScreen.js +++ b/frontend/components/login-component/LoginScreen.js @@ -31,6 +31,8 @@ export const Login = ({ navigation }) => { const response = await requestToken({ email, password }); const token = await response.text(); auth.login(token); + console.log(token) + navigation.navigate("Notes"); } catch (error) { toast.show({ title: error.message, diff --git a/frontend/components/notes-component/Note.js b/frontend/components/notes-component/Note.js index caff463..a85eefa 100644 --- a/frontend/components/notes-component/Note.js +++ b/frontend/components/notes-component/Note.js @@ -1,4 +1,7 @@ import React, { useContext, useState } from "react"; +import { MaterialIcons } from '@expo/vector-icons'; +import { Entypo } from '@expo/vector-icons'; +import { AntDesign } from '@expo/vector-icons'; import { respLgFont,respLgContHeight,respMdFont,respSmFont,respMiniFont } from "./CurrentFolderContainer"; diff --git a/frontend/components/task/Task.js b/frontend/components/task/Task.js index f4ece8e..e2dba29 100644 --- a/frontend/components/task/Task.js +++ b/frontend/components/task/Task.js @@ -20,6 +20,7 @@ const Task = (props) => { onTaskCompletion(data.id); }; + const removeTaskHandler = () => { onTaskRemoval(data.id); }; diff --git a/frontend/components/todo-component/TodoScreen.js b/frontend/components/todo-component/TodoScreen.js index f4e3e0c..30b5761 100644 --- a/frontend/components/todo-component/TodoScreen.js +++ b/frontend/components/todo-component/TodoScreen.js @@ -1,14 +1,35 @@ +import { Box, VStack,Hidden } from "native-base"; import React from "react"; -import { Box } from "native-base"; -import { NavigationButton } from "../../UI/NavigationButton"; import TodoList from "./TodoList"; +import CompletedList from "./../CompletedList"; +import { useState } from "react"; + const TodoScreen = () => { + const [showCompleted,setShowCompleted] = useState(true) + return ( - - - - + + + + + { + showCompleted && + + } + + + + { + showCompleted && + + } + + ); };