diff --git a/app/src/containers/Profile.vue b/app/src/containers/Profile.vue index e19fc1d3d..b3925e80b 100644 --- a/app/src/containers/Profile.vue +++ b/app/src/containers/Profile.vue @@ -19,24 +19,20 @@ @{{ profile.username }} {{ profile.bio }} - + + + + {{ isFriend ? "Remove friend" : "Hello" }} + + + View full profile - - - - - - - View full profile - - - diff --git a/app/src/router/index.ts b/app/src/router/index.ts index 9f5355330..8fcbcc18c 100644 --- a/app/src/router/index.ts +++ b/app/src/router/index.ts @@ -27,6 +27,11 @@ const routes: Array = [ name: "home", component: () => import(`@/views/profile/ProfileView.vue`), }, + { + path: "dm", + name: "dm", + component: () => import(`@/views/dm/DmView.vue`), + }, { path: "communities/:communityId", name: "community", diff --git a/app/src/store/types/userprofile.ts b/app/src/store/types/userprofile.ts index 6a2d83f4e..8bba28e48 100644 --- a/app/src/store/types/userprofile.ts +++ b/app/src/store/types/userprofile.ts @@ -3,6 +3,7 @@ import type { AgentStatus } from "@perspect3vism/ad4m"; import { Profile } from "utils/types"; export interface UserState { + friends: string[]; agent: AgentStatus; profile: Profile | null; agentProfileProxyPerspectiveId?: string; diff --git a/app/src/store/user/actions/addFriend.ts b/app/src/store/user/actions/addFriend.ts new file mode 100644 index 000000000..fd3ac9226 --- /dev/null +++ b/app/src/store/user/actions/addFriend.ts @@ -0,0 +1,29 @@ +import { useAppStore } from "@/store/app"; +import { useDataStore } from "../../data"; +import { addFriend } from "utils/api/friends"; +import { useUserStore } from ".."; + +export interface Payload { + did: string; +} + +export default async (payload: Payload): Promise => { + const dataStore = useDataStore(); + const appStore = useAppStore(); + const userStore = useUserStore(); + + try { + await addFriend(payload.did); + + const newFriends = userStore.friends.includes(payload.did) + ? userStore.friends + : [...userStore.friends, payload.did]; + + userStore.setFriends(newFriends); + } catch (e) { + appStore.showDangerToast({ + message: e.message, + }); + throw new Error(e); + } +}; diff --git a/app/src/store/user/actions/getFriends.ts b/app/src/store/user/actions/getFriends.ts new file mode 100644 index 000000000..5037c9185 --- /dev/null +++ b/app/src/store/user/actions/getFriends.ts @@ -0,0 +1,19 @@ +import { useAppStore } from "@/store/app"; +import { useDataStore } from "../../data"; +import { getFriends } from "utils/api/friends"; +import { useUserStore } from ".."; + +export default async (): Promise => { + const userStore = useUserStore(); + const appStore = useAppStore(); + + try { + const friends = await getFriends(); + userStore.setFriends(friends); + } catch (e) { + appStore.showDangerToast({ + message: e.message, + }); + throw new Error(e); + } +}; diff --git a/app/src/store/user/actions/index.ts b/app/src/store/user/actions/index.ts index d8c0bcb47..1abcbac88 100644 --- a/app/src/store/user/actions/index.ts +++ b/app/src/store/user/actions/index.ts @@ -1,8 +1,14 @@ import logIn from "./logIn"; import updateProfile from "./updateProfile"; import createUser from "./createUser"; +import addFriend from "../actions/addFriend"; +import getFriends from "../actions/getFriends"; +import removeFriend from "./removeFriend"; export default { + addFriend, + getFriends, + removeFriend, logIn, createUser, updateProfile, diff --git a/app/src/store/user/actions/removeFriend.ts b/app/src/store/user/actions/removeFriend.ts new file mode 100644 index 000000000..d70dcf2ff --- /dev/null +++ b/app/src/store/user/actions/removeFriend.ts @@ -0,0 +1,29 @@ +import { useAppStore } from "@/store/app"; +import { useDataStore } from "../../data"; +import { removeFriend } from "utils/api/friends"; +import { useUserStore } from ".."; + +export interface Payload { + did: string; +} + +export default async (payload: Payload): Promise => { + const dataStore = useDataStore(); + const userStore = useUserStore(); + const appStore = useAppStore(); + + try { + await removeFriend(payload.did); + + const filteredFriends = userStore.friends.filter( + (did) => did !== payload.did + ); + + userStore.setFriends(filteredFriends); + } catch (e) { + appStore.showDangerToast({ + message: e.message, + }); + throw new Error(e); + } +}; diff --git a/app/src/store/user/index.ts b/app/src/store/user/index.ts index f70d51755..c28a10c6e 100644 --- a/app/src/store/user/index.ts +++ b/app/src/store/user/index.ts @@ -8,12 +8,13 @@ export const useUserStore = defineStore("user", { state(): UserState { return { profile: null, + friends: [], agent: { isInitialized: false, isUnlocked: false, did: "", didDocument: "", - } + }, }; }, getters, diff --git a/app/src/store/user/mutations/index.ts b/app/src/store/user/mutations/index.ts index f20cad7ae..de62a7bba 100644 --- a/app/src/store/user/mutations/index.ts +++ b/app/src/store/user/mutations/index.ts @@ -16,5 +16,10 @@ export default { setUserProfile(payload: Profile): void { const store = useUserStore(); store.profile = payload; - } + }, + + setFriends(payload: string[]) { + const store = useUserStore(); + store.friends = payload; + }, }; diff --git a/app/src/views/dm/DmView.vue b/app/src/views/dm/DmView.vue new file mode 100644 index 000000000..e218ac8ed --- /dev/null +++ b/app/src/views/dm/DmView.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/app/src/views/main/main-sidebar/CommunitiesList.vue b/app/src/views/main/main-sidebar/CommunitiesList.vue index 696bf5c7a..c683d5c09 100644 --- a/app/src/views/main/main-sidebar/CommunitiesList.vue +++ b/app/src/views/main/main-sidebar/CommunitiesList.vue @@ -1,5 +1,13 @@