Skip to content

Commit 72773d0

Browse files
committed
Update Recoil states and add network change event listeners
1 parent 1d86417 commit 72773d0

File tree

7 files changed

+55
-15
lines changed

7 files changed

+55
-15
lines changed

src/App.tsx

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import { Box, Button, Spinner, useToast } from '@chakra-ui/react'
33
import { getAccessToken, saveAuthCode, handleInitialLogin, handleLoadFrom, handleLogin, handleLogout } from "./helpers/auth";
44
import { loadContextmenu } from "./helpers/windowhelper";
55
import TaskPage from "./components/TaskPage";
6-
import { useRecoilState, useRecoilValue } from "recoil";
7-
import { attemptLoginState, attemptLogoutState, authLoadingState, loggedInSelector, messageState } from "./config/states";
6+
import { useRecoilRefresher_UNSTABLE, useRecoilState, useRecoilValue, useSetRecoilState } from "recoil";
7+
import { attemptLoginState, attemptLogoutState, authLoadingState, isOnlineSelector, loggedInSelector, messageState } from "./config/states";
88
import Header from "./components/ui/Header";
99
import { listen_for_auth_code } from "./helpers/eventlistner";
1010

@@ -17,13 +17,16 @@ function App() {
1717
const [attemptedLogin, setAttemptedLogin] = useRecoilState<boolean>(attemptLoginState);
1818
const [attemptedLogout, setAttemptedLogout] = useRecoilState<boolean>(attemptLogoutState);
1919
const [toastMessage, setToastMessage] = useRecoilState(messageState)
20+
const setIsOnline = useSetRecoilState(isOnlineSelector)
21+
const refreshIsOnline = () => setIsOnline(() => navigator.onLine)
2022

2123
// error message toast
2224
const toast = useToast()
2325

2426

2527
useEffect(() => {
2628
if (toastMessage) {
29+
toast.closeAll()
2730
toast({
2831
title: toastMessage.title,
2932
description: toastMessage.body,
@@ -98,6 +101,27 @@ function App() {
98101
}, [])
99102

100103

104+
// updating the isonline value every 5 mins
105+
window.addEventListener('online', () => {
106+
setToastMessage({
107+
title: "Network Changed",
108+
body: "Internet restored",
109+
type : "success",
110+
})
111+
refreshIsOnline()
112+
})
113+
114+
window.addEventListener('offline', () => {
115+
setToastMessage({
116+
title: "Network Changed",
117+
body: "No internet",
118+
type : "error",
119+
})
120+
refreshIsOnline()
121+
})
122+
123+
124+
101125

102126

103127

src/components/TaskPage.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { useState , useEffect} from "react";
22
import { Tabs, TabPanels, Box, Spinner} from '@chakra-ui/react'
33
import { taskCategory, task } from "../types/taskapi";
44
import { useRecoilState, useRecoilValue, useSetRecoilState } from "recoil";
5-
import { accessTokenSelector, activeCategoryTasksState, activeTaskCategoryState, taskObjectState, taskCategoriesListState, messageState } from "../config/states";
5+
import { accessTokenSelector, activeCategoryTasksState, activeTaskCategoryState, taskObjectState, taskCategoriesListState, messageState, isOnlineSelector } from "../config/states";
66
import { Task } from "../helpers/task";
77
import TaskList from "./ui/TaskList";
88
import AddTaskForm from "./ui/AddTaskForm";
@@ -22,6 +22,7 @@ export default function TaskPage() {
2222
const setActiveCategoryTasks = useSetRecoilState<task[]>(activeCategoryTasksState)
2323
const [loading, setloading] = useState(true)
2424
const [toastMessage, setToastMessage] = useRecoilState(messageState)
25+
const isOnline = useRecoilValue(isOnlineSelector)
2526

2627
useEffect(() => {
2728
console.log('before task object', Taskobject, access_token)
@@ -50,13 +51,14 @@ export default function TaskPage() {
5051
}, [Taskobject])
5152

5253
useEffect(() => {
54+
console.log('a active task or online changed', navigator.onLine)
5355
setloading(true)
5456
if (activeTaskCategory < 0) return;
5557
Taskobject.getTasksByCategoryPosition(activeTaskCategory).then((data) => {
5658
setActiveCategoryTasks(data)
5759
setloading(false)
5860
})
59-
}, [activeTaskCategory])
61+
}, [activeTaskCategory, isOnline])
6062

6163

6264
return (

src/components/ui/AddTaskForm.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ const AddTaskForm = () => {
5858
setActiveCategoryTasks(data)
5959
}).finally(() => {
6060
console.log('done adding')
61+
onClose()
6162
})
6263
}).catch((err) => {
6364
console.log('error adding task', err)

src/components/ui/TaskItem.tsx

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { DeleteIcon } from "@chakra-ui/icons";
2-
import { Box, Checkbox, Flex, IconButton } from "@chakra-ui/react";
2+
import { Box, Checkbox, Flex, IconButton, Spinner } from "@chakra-ui/react";
33
import { task, taskCategory } from "../../types/taskapi";
44
import { useState } from "react";
55
import { useRecoilValue, useSetRecoilState } from "recoil";
@@ -13,6 +13,7 @@ export default function TaskItem({ task }: { task: task }) {
1313
const activeTaskCategory = useRecoilValue<number>(activeTaskCategorySelector)
1414
const setActiveCategoryTasks = useSetRecoilState(activeCategoryTasksState)
1515
const setToastMessage = useSetRecoilState(messageState)
16+
const [deleteIsClicked, setDeleteIsClicked] = useState(false)
1617

1718

1819
const handleTaskCheck = (task: task) => {
@@ -31,6 +32,7 @@ export default function TaskItem({ task }: { task: task }) {
3132
}
3233

3334
const handleTaskDelete = (task: task) => {
35+
setDeleteIsClicked(true)
3436
Taskobject.deleteTask(task, taskCategoryList[activeTaskCategory].id).then((d) => {
3537
if(!d) return console.log('task deleted')
3638
Taskobject.getTasksByCategoryPosition(activeTaskCategory).then(() => {
@@ -40,7 +42,10 @@ export default function TaskItem({ task }: { task: task }) {
4042
})
4143
})
4244
})
43-
}).finally(() => { Taskobject.clearPositionCache(activeTaskCategory) })
45+
}).finally(() => {
46+
Taskobject.clearPositionCache(activeTaskCategory)
47+
setDeleteIsClicked(false)
48+
})
4449
}
4550

4651
return (
@@ -52,17 +57,15 @@ export default function TaskItem({ task }: { task: task }) {
5257
</Box>
5358
</Checkbox>
5459
<Box w="10%" as="span">
55-
{isHovered && (
56-
<IconButton
60+
{deleteIsClicked ? <Spinner size={'sm'} /> : isHovered && (<IconButton
5761
size='xs'
5862
variant='outline'
5963
ml="2"
6064
aria-label="Delete task"
6165
icon={<DeleteIcon />}
62-
6366
onClick={() => handleTaskDelete(task)}
64-
/>
65-
)}
67+
/>)
68+
}
6669
</Box>
6770
</Flex>
6871
</Box>

src/config/states.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,16 @@ const authLoadingState = atom<boolean>({
5858
default: false,
5959
});
6060

61+
const isOnlineState = atom<boolean>({
62+
key: 'isOnlineStae',
63+
default : navigator.onLine
64+
})
65+
66+
const isOnlineSelector = selector({
67+
key: 'isOnlineSelector',
68+
get: () => navigator.onLine,
69+
set : ({set}) => set(isOnlineState, navigator.onLine)
70+
})
6171

6272
const authLoadingSelector = selector({
6373
key: 'authLoadingSelector',
@@ -176,5 +186,7 @@ export {
176186
messageState,
177187
messageSelector,
178188
authLoadingState,
179-
authLoadingSelector
189+
authLoadingSelector,
190+
isOnlineState,
191+
isOnlineSelector,
180192
};

src/helpers/auth.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,6 @@ export async function saveAccessToken(accessToken: string|AccessToken) {
161161

162162
export async function getAccessTokenFromStorage() {
163163
try {
164-
// if file does not exist, return null
165-
if(! await exists(STORAGE_PATHS.access_token, { dir: DEFAULT_DIRECTORY })) throw new Error("File does not exist");
166164
let accessToken = await get_access_token();
167165
console.log('new access token found')
168166
// check if the access token is expired

src/helpers/task.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ export class Task {
194194
if (!tasks) tasks = []
195195
this.tasksCategoryList.set(tasks.map((taskCategory) => {
196196
// if category with same id exists, merge them
197-
const existingCategory = this.tasksCategoryList.get()?.find((category) => category.id === taskCategory.id);
197+
const existingCategory = this.tasksCategoryList.get()?.find((category) => category?.id === taskCategory?.id);
198198
if (existingCategory) {
199199
taskCategory.tasks = [...existingCategory.tasks || [], ...taskCategory.tasks || []];
200200
}

0 commit comments

Comments
 (0)