Skip to content

Commit 2f2d354

Browse files
Remove dev flag from the "/groups" endpoint and add a loader on delete (#922)
* removed feature flag * feat: loader on deleting groups * test: added test for loader
1 parent 2b39df5 commit 2f2d354

File tree

6 files changed

+99
-30
lines changed

6 files changed

+99
-30
lines changed

__tests__/groups/group.test.js

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ describe('Discord Groups Page', () => {
313313

314314
test('Should display delete button for super users', async () => {
315315
setSuperUserPermission();
316-
await page.goto(`${LOCAL_TEST_PAGE_URL}/groups?dev=true`);
316+
await page.goto(`${LOCAL_TEST_PAGE_URL}/groups`);
317317
await page.waitForNetworkIdle();
318318
await page.waitForTimeout(1000);
319319

@@ -325,15 +325,6 @@ describe('Discord Groups Page', () => {
325325

326326
test('Should not display delete button when user is normal user', async () => {
327327
resetUserPermission();
328-
await page.goto(`${LOCAL_TEST_PAGE_URL}/groups?dev=true`);
329-
await page.waitForNetworkIdle();
330-
331-
const deleteButtons = await page.$$('.delete-group');
332-
expect(deleteButtons.length).toBe(0);
333-
});
334-
335-
test('Should not display delete button when dev=false', async () => {
336-
setSuperUserPermission();
337328
await page.goto(`${LOCAL_TEST_PAGE_URL}/groups`);
338329
await page.waitForNetworkIdle();
339330

@@ -343,7 +334,7 @@ describe('Discord Groups Page', () => {
343334

344335
test('Should display delete confirmation modal on click of delete button', async () => {
345336
setSuperUserPermission();
346-
await page.goto(`${LOCAL_TEST_PAGE_URL}/groups?dev=true`);
337+
await page.goto(`${LOCAL_TEST_PAGE_URL}/groups`);
347338
await page.waitForNetworkIdle();
348339
await page.waitForTimeout(1000);
349340

@@ -359,7 +350,7 @@ describe('Discord Groups Page', () => {
359350

360351
test('Should close delete confirmation modal when cancel button is clicked', async () => {
361352
setSuperUserPermission();
362-
await page.goto(`${LOCAL_TEST_PAGE_URL}/groups?dev=true`);
353+
await page.goto(`${LOCAL_TEST_PAGE_URL}/groups`);
363354
await page.waitForNetworkIdle();
364355
await page.waitForTimeout(1000);
365356

@@ -372,4 +363,25 @@ describe('Discord Groups Page', () => {
372363
const modalClosed = await page.$('.delete-confirmation-modal');
373364
expect(modalClosed).toBeFalsy();
374365
});
366+
367+
test('Should render loader when deleting a group', async () => {
368+
setSuperUserPermission();
369+
await page.goto(`${LOCAL_TEST_PAGE_URL}/groups`);
370+
await page.waitForNetworkIdle();
371+
await page.waitForTimeout(1000);
372+
373+
const deleteButton = await page.$('.delete-group');
374+
await deleteButton.click();
375+
376+
const confirmButton = await page.waitForSelector('#confirm-delete');
377+
confirmButton.click();
378+
379+
const loader = await page.waitForSelector('.loader');
380+
expect(loader).toBeTruthy();
381+
382+
await page.waitForTimeout(1000);
383+
384+
const loaderAfter = await page.$('.loader');
385+
expect(loaderAfter).toBeFalsy();
386+
});
375387
});

groups/createElements.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ const createCard = (
5656
.querySelector('.delete-group')
5757
.addEventListener('click', (e) => {
5858
e.stopPropagation();
59-
onDelete(rawGroup.id, rawGroup.roleId);
59+
onDelete(rawGroup.id);
6060
});
6161
}
6262

groups/render.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,27 @@ const removeLoadingCards = () => {
8787
loadingCards.forEach((card) => mainContainer.removeChild(card));
8888
};
8989

90+
const renderLoader = () => {
91+
const loaderContainer = document.querySelector('.loader');
92+
93+
if (!loaderContainer) {
94+
const loaderContainer = document.createElement('div');
95+
loaderContainer.className = 'loader';
96+
loaderContainer.innerHTML = `
97+
<div class="loader-spin"></div>
98+
`;
99+
100+
document.body.appendChild(loaderContainer);
101+
}
102+
};
103+
104+
const removeLoader = () => {
105+
const loader = document.querySelector('.loader');
106+
if (loader) {
107+
document.body.removeChild(loader);
108+
}
109+
};
110+
90111
const renderGroupById = ({
91112
group,
92113
cardOnClick = () => {},
@@ -148,4 +169,6 @@ export {
148169
renderNoGroupFound,
149170
renderDeleteConfirmationModal,
150171
removeDeleteConfirmationModal,
172+
renderLoader,
173+
removeLoader,
151174
};

groups/script.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import {
1313
renderNotAuthenticatedPage,
1414
renderDeleteConfirmationModal,
1515
removeDeleteConfirmationModal,
16+
renderLoader,
17+
removeLoader,
1618
} from './render.js';
1719

1820
import {
@@ -32,7 +34,6 @@ const QUERY_PARAM_KEY = {
3234
DEV_FEATURE_FLAG: 'dev',
3335
GROUP_SEARCH: 'name',
3436
};
35-
const isDev = getParamValueFromURL(QUERY_PARAM_KEY.DEV_FEATURE_FLAG) === 'true';
3637

3738
const handler = {
3839
set: (obj, prop, value) => {
@@ -287,23 +288,23 @@ function renderAllGroups({ cardOnClick }) {
287288
renderGroupById({
288289
group: group,
289290
cardOnClick: () => cardOnClick(id),
290-
onDelete: isDev ? showDeleteModal : undefined,
291-
isSuperUser: dataStore.isSuperUser && isDev,
291+
onDelete: showDeleteModal,
292+
isSuperUser: dataStore.isSuperUser,
292293
});
293294
}
294295
});
295296
}
296297
}
297298

298-
function showDeleteModal(groupId, roleId) {
299-
if (!isDev) return;
299+
function showDeleteModal(groupId) {
300300
renderDeleteConfirmationModal({
301301
onClose: () => {
302302
removeDeleteConfirmationModal();
303303
},
304304
onConfirm: async () => {
305+
renderLoader();
305306
try {
306-
await deleteDiscordGroupRole(groupId, roleId);
307+
await deleteDiscordGroupRole(groupId);
307308
showToaster('Group deleted successfully');
308309

309310
updateGroup(groupId, { isDeleted: true });
@@ -318,6 +319,7 @@ function showDeleteModal(groupId, roleId) {
318319
showToaster(error.message || 'Failed to delete group');
319320
} finally {
320321
removeDeleteConfirmationModal();
322+
removeLoader();
321323
}
322324
},
323325
});

groups/style.css

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -699,3 +699,39 @@ For Delete Confirmation Modal
699699
.button--danger:hover {
700700
background-color: #c82333;
701701
}
702+
703+
/*
704+
For Spin Loader
705+
*/
706+
707+
.loader {
708+
position: fixed;
709+
top: 0;
710+
left: 0;
711+
width: 100%;
712+
height: 100%;
713+
background-color: rgba(255, 255, 255, 0.8);
714+
display: flex;
715+
flex-direction: column;
716+
justify-content: center;
717+
align-items: center;
718+
z-index: 1000;
719+
}
720+
721+
.loader-spin {
722+
border: 8px solid #f3f3f3;
723+
border-top: 8px solid #345bdb;
724+
border-radius: 50%;
725+
width: 50px;
726+
height: 50px;
727+
animation: spin 1s linear infinite;
728+
}
729+
730+
@keyframes spin {
731+
0% {
732+
transform: rotate(0deg);
733+
}
734+
100% {
735+
transform: rotate(360deg);
736+
}
737+
}

groups/utils.js

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -116,19 +116,15 @@ async function removeRoleFromMember(roleId, discordId) {
116116
}
117117
}
118118

119-
async function deleteDiscordGroupRole(groupId, roleId) {
119+
async function deleteDiscordGroupRole(groupId) {
120120
try {
121-
const res = await fetch(
122-
`${BASE_URL}/discord-actions/groups/${groupId}?dev=true`,
123-
{
124-
method: 'DELETE',
125-
credentials: 'include',
126-
headers: {
127-
'Content-type': 'application/json',
128-
},
129-
body: JSON.stringify({ roleid: roleId }),
121+
const res = await fetch(`${BASE_URL}/discord-actions/groups/${groupId}`, {
122+
method: 'DELETE',
123+
credentials: 'include',
124+
headers: {
125+
'Content-type': 'application/json',
130126
},
131-
);
127+
});
132128

133129
if (!res.ok) {
134130
const errorResponse = await res.json();

0 commit comments

Comments
 (0)