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}

@@ -251,7 +261,7 @@
{:else}
- {#each newsFeed as feed}
+ {#each $newsFeed as feed}
{#if feed.isPinned}