diff --git a/apps/dashboard/src/lib/components/Course/components/NewsFeed/NewFeedModal.svelte b/apps/dashboard/src/lib/components/Course/components/NewsFeed/NewFeedModal.svelte index f336d704..5d4ff977 100644 --- a/apps/dashboard/src/lib/components/Course/components/NewsFeed/NewFeedModal.svelte +++ b/apps/dashboard/src/lib/components/Course/components/NewsFeed/NewFeedModal.svelte @@ -20,68 +20,65 @@ export let editFeed: Feed; let newPost = ''; + let isLoading = false; let createdFeed; const onPost = async () => { if (!newPost) return; - - // Edit state - if (edit) { - onEdit(editFeed.id, newPost); - - snackbar.success('Feed edited successfully'); - - edit = false; - newPost = ''; - $isNewFeedModal.open = false; - - return; - } - - // Create state + isLoading = true; try { - const { - response: { data } - } = await createNewFeed({ - content: newPost, - author_id: author.id, - course_id: courseId, - reaction: { - smile: [], - thumbsup: [], - thumbsdown: [], - clap: [] - } - }); + if (edit) { + onEdit(editFeed.id, newPost); + snackbar.success('Feed edited successfully'); - if (!data) return; + edit = false; + newPost = ''; + $isNewFeedModal.open = false; + } else { + const { + response: { data } + } = await createNewFeed({ + content: newPost, + author_id: author.id, + course_id: courseId, + reaction: { + smile: [], + thumbsup: [], + thumbsdown: [], + clap: [] + } + }); - createdFeed = data[0]; + if (!data) return; + + createdFeed = data[0]; + + if (!createdFeed) return; + + onSave({ + id: createdFeed.id, + content: newPost, + author: { + profile: { ...author } + }, + created_at: createdFeed.created_at, + comment: [], + reaction: createdFeed.reaction, + isPinned: false + }); + + snackbar.success('New feed added successfully'); + triggerSendEmail(NOTIFICATION_NAME.NEWSFEED, { + authorId: createdFeed.author_id, + feedId: createdFeed.id + }); + resetEditor(); + } } catch (error) { - return snackbar.error('An error occurred while creating feed'); + snackbar.error('An error occurred while ' + (edit ? 'editing feed' : 'creating feed')); + } finally { + isLoading = false; } - - if (!createdFeed) return; - - onSave({ - id: createdFeed.id, - content: newPost, - author: { - profile: { ...author } - }, - created_at: createdFeed.created_at, - comment: [], - reaction: createdFeed.reaction, - isPinned: false - }); - - snackbar.success('New feed added successfully'); - triggerSendEmail(NOTIFICATION_NAME.NEWSFEED, { - authorId: createdFeed.author_id, - feedId: createdFeed.id - }); - - resetEditor(); }; const resetEditor = () => { @@ -110,12 +107,8 @@ />
- ($isNewFeedModal.open = false)} - /> - + +
diff --git a/apps/dashboard/src/lib/components/Course/components/NewsFeed/NewsFeedLoader.svelte b/apps/dashboard/src/lib/components/Course/components/NewsFeed/NewsFeedLoader.svelte new file mode 100644 index 00000000..119d2e9e --- /dev/null +++ b/apps/dashboard/src/lib/components/Course/components/NewsFeed/NewsFeedLoader.svelte @@ -0,0 +1,11 @@ + + +
+
+ + +
+ +
diff --git a/apps/dashboard/src/lib/components/Course/components/NewsFeed/store.ts b/apps/dashboard/src/lib/components/Course/components/NewsFeed/store.ts index 61789445..5a840c1a 100644 --- a/apps/dashboard/src/lib/components/Course/components/NewsFeed/store.ts +++ b/apps/dashboard/src/lib/components/Course/components/NewsFeed/store.ts @@ -1,5 +1,8 @@ +import type { Feed } from '$lib/utils/types/feed'; import { writable } from 'svelte/store'; export const isNewFeedModal = writable({ open: false }); + +export const newsFeed = writable([]); diff --git a/apps/dashboard/src/routes/courses/[id]/+page.svelte b/apps/dashboard/src/routes/courses/[id]/+page.svelte index be5344f8..357bc622 100644 --- a/apps/dashboard/src/routes/courses/[id]/+page.svelte +++ b/apps/dashboard/src/routes/courses/[id]/+page.svelte @@ -20,6 +20,7 @@ toggleFeedIsPinned, fetchNewsFeedReaction } from '$lib/utils/services/newsfeed'; + import { newsFeed } from '$lib/components/Course/components/NewsFeed/store'; import Box from '$lib/components/Box/index.svelte'; import { supabase } from '$lib/utils/functions/supabase'; import { snackbar } from '$lib/components/Snackbar/store'; @@ -28,11 +29,12 @@ NOTIFICATION_NAME, triggerSendEmail } from '$lib/utils/services/notification/notification'; - + import NewsFeedLoader from '$lib/components/Course/components/NewsFeed/NewsFeedLoader.svelte'; export let data; let createdComment; let edit = false; + let isLoading = false; let editFeed: Feed; let author = { id: '', @@ -40,14 +42,14 @@ fullname: '', avatar_url: '' }; - let newsFeed: Feed[] = []; + let query = new URLSearchParams($page.url.search); let feedId = query.get('feedId') || ''; const onEdit = (id: string, content: string) => { handleEditFeed(id, content); - newsFeed = newsFeed.map((feed) => { + $newsFeed = $newsFeed.map((feed) => { if (feed.id === id) { return { ...feed, content: content }; } @@ -58,7 +60,7 @@ const deleteComment = (id: string) => { deleteNewsFeedComment(id); - newsFeed = newsFeed.flatMap((feed) => ({ + $newsFeed = $newsFeed.flatMap((feed) => ({ ...feed, comment: feed.comment.filter((comment) => comment.id !== id) })); @@ -71,7 +73,7 @@ if (!data) return; - const reactedFeed = data || newsFeed.find((feed) => feed.id === feedId); + const reactedFeed = data || $newsFeed.find((feed) => feed.id === feedId); let reactedAuthorIds: string[] = reactedFeed.reaction[reactionType]; @@ -99,7 +101,7 @@ return snackbar.error('An error occurred while reacting to news feed'); } - newsFeed = newsFeed.map((feed) => { + $newsFeed = $newsFeed.map((feed) => { if (feed.id === feedId) { feed.reaction = reactedFeed.reaction; } @@ -129,7 +131,7 @@ comment }); - newsFeed = newsFeed.map((feed) => { + $newsFeed = $newsFeed.map((feed) => { if (feed.id === feedId) { const newComment = { id: createdComment.id, @@ -160,7 +162,7 @@ return snackbar.error('Failed to toggle pinned feed'); } - newsFeed = newsFeed.map((feed) => { + $newsFeed = $newsFeed.map((feed) => { if (feed.id === feedId) { snackbar.success(`${newIsPinned ? 'Pinned' : 'Unpinned'} Successfully`); @@ -175,28 +177,31 @@ const deleteFeed = (id: string) => { deleteNewsFeed(id); - const deletedFeed = newsFeed.filter((feed) => feed.id !== id); + const deletedFeed = $newsFeed.filter((feed) => feed.id !== id); snackbar.success('Feed deleted successfully'); - newsFeed = deletedFeed; + $newsFeed = deletedFeed; }; const initNewsFeed = async (courseId: string) => { if (!courseId) return; - - const { data, error } = await fetchNewsFeeds(courseId); - - if (error) { - snackbar.error('Failed to fetch news feeds'); - return; + try { + isLoading = true; + const { data, error } = await fetchNewsFeeds(courseId); + if (error) { + snackbar.error('Failed to fetch news feeds'); + } + if (data) { + $newsFeed = data.map((feedItem) => ({ + ...feedItem, + isPinned: feedItem.is_pinned + })); + } + } catch (error) { + snackbar.error('An error occured while fetching feed'); + } finally { + isLoading = false; } - - if (!data) return; - - newsFeed = data.map((feedItem) => ({ - ...feedItem, - isPinned: feedItem.is_pinned - })); }; function setAuthor(groups, profileId) { @@ -214,7 +219,7 @@ $: setAuthor($group, $profile.id); - $: newsFeed = newsFeed.sort((a, b) => Number(b.isPinned) - Number(a.isPinned)); + $: $newsFeed = $newsFeed.sort((a, b) => Number(b.isPinned) - Number(a.isPinned)); @@ -234,13 +239,18 @@ bind:edit bind:editFeed onSave={(newFeed) => { - newsFeed = [newFeed, ...newsFeed]; + $newsFeed = [newFeed, ...$newsFeed]; }} {onEdit} /> - - {#if !newsFeed.length} + {#if isLoading} +
+ + + +
+ {:else if !$newsFeed.length}
Lesson @@ -251,7 +261,7 @@
{:else} - {#each newsFeed as feed} + {#each $newsFeed as feed} {#if feed.isPinned}