summaryrefslogtreecommitdiff
path: root/public/js
diff options
context:
space:
mode:
authorTyler Murphy <tylermurphy534@gmail.com>2023-02-14 19:28:10 -0500
committerTyler Murphy <tylermurphy534@gmail.com>2023-02-14 19:28:10 -0500
commitf02524b59288d68e78a108e9c9e2ca4c7f662f07 (patch)
treedb0a7ad310a92442274d862c7fc5d9994d99eaa5 /public/js
parentfix seo (diff)
downloadxssbook-f02524b59288d68e78a108e9c9e2ca4c7f662f07.tar.gz
xssbook-f02524b59288d68e78a108e9c9e2ca4c7f662f07.tar.bz2
xssbook-f02524b59288d68e78a108e9c9e2ca4c7f662f07.zip
friends
Diffstat (limited to 'public/js')
-rw-r--r--public/js/api.js12
-rw-r--r--public/js/people.js15
-rw-r--r--public/js/profile.js139
3 files changed, 127 insertions, 39 deletions
diff --git a/public/js/api.js b/public/js/api.js
index 176ae59..5a55460 100644
--- a/public/js/api.js
+++ b/public/js/api.js
@@ -79,6 +79,18 @@ export const loadself = async () => {
return await request("/users/self", {})
}
+export const follow = async (state, user_id) => {
+ return await request('/users/follow', {state, user_id}, 'PUT')
+}
+
+export const follow_status = async (user_id) => {
+ return await request('/users/follow', {user_id})
+}
+
+export const friends = async (user_id) => {
+ return await request('/users/friends', {user_id})
+}
+
export const postcomment = async (post_id, content) => {
return await request('/posts/comment', {post_id, content}, 'PATCH')
}
diff --git a/public/js/people.js b/public/js/people.js
index 0a97e93..99890d9 100644
--- a/public/js/people.js
+++ b/public/js/people.js
@@ -34,22 +34,7 @@ const data = {
}
async function load() {
- let request = await loadself()
- if (request.status === 429) {
- let new_body =
- body({},
- ...header(false, true)
- )
-
- document.body.replaceWith(new_body)
- throw new Error("Rate limited");
- }
-
-
- const self = request.json
-
- header(false, true, self.user_id)
const users = (await loaduserspage(page)).json
if (users.length === 0) {
diff --git a/public/js/profile.js b/public/js/profile.js
index dd5216d..4e4f44f 100644
--- a/public/js/profile.js
+++ b/public/js/profile.js
@@ -1,31 +1,55 @@
import { div, pfp, banner, parse, button, body, a, span, crawl, parseDate, parseMonth } from './main.js'
-import { loadself, loadusers, loadusersposts, updateavatar, updatebanner, logout } from './api.js'
-import { parsePost, header } from './components.js'
+import { loadself, loadusers, loadusersposts, updateavatar, updatebanner, logout, follow, follow_status, friends } from './api.js'
+import { parsePost, parseUser, header } from './components.js'
-function swap(value) {
- let postsb = document.getElementById("profilepostbutton");
- let aboutb = document.getElementById("profileaboutbutton");
- let posts = document.getElementById("posts");
- let about = document.getElementById("about");
- let load = document.getElementsByClassName("loadp")[0];
+function swap(tab) {
+ let post_button = document.querySelector("#profilepostbutton");
+ let about_button = document.querySelector("#profileaboutbutton");
+ let friends_button = document.querySelector("#profilefriendsbutton");
- if (value) {
+ let posts_section = document.querySelector("#posts");
+ let about_section = document.querySelector("#about");
+ let friends_section = document.querySelector("#friends");
+
+ let load = document.querySelector(".loadp");
+
+ if (tab === 0) {
- postsb.classList.add("selected")
- aboutb.classList.remove("selected")
- about.classList.add("hidden")
- posts.classList.remove("hidden")
+ post_button.classList.add("selected")
+ about_button.classList.remove("selected")
+ friends_button.classList.remove("selected")
+
+ posts_section.classList.remove("hidden")
+ about_section.classList.add("hidden")
+ friends_section.classList.add("hidden")
if (load) {
load.classList.remove("hidden")
}
- } else {
+ } else if (tab === 1) {
- postsb.classList.remove("selected")
- aboutb.classList.add("selected")
- about.classList.remove("hidden")
- posts.classList.add("hidden")
+ post_button.classList.remove("selected")
+ about_button.classList.add("selected")
+ friends_button.classList.remove("selected")
+
+ posts_section.classList.add("hidden")
+ about_section.classList.remove("hidden")
+ friends_section.classList.add("hidden")
+
+ if (load) {
+ load.classList.add("hidden")
+ }
+
+ } else if (tab === 2) {
+
+ post_button.classList.remove("selected")
+ about_button.classList.remove("selected")
+ friends_button.classList.add("selected")
+
+ posts_section.classList.add("hidden")
+ about_section.classList.add("hidden")
+ friends_section.classList.remove("hidden")
if (load) {
load.classList.add("hidden")
@@ -67,9 +91,37 @@ function changeimage(fn) {
input.click();
}
-function render() {
+function status_text(status) {
+ switch (status) {
+ case 1:
+ return 'Following ✓'
+ case 2:
+ return 'Follow Back'
+ case 3:
+ return 'Friends ✓'
+ default:
+ return 'Follow'
+ }
+}
+
+async function render() {
- let new_body =
+ let status;
+ if (!isself) {
+ let response = await follow_status(data.user.user_id)
+ if (response.status == 200) {
+ status = parseInt(response.msg)
+ } else {
+ status = 0;
+ }
+ }
+
+ let friends_arr = (await friends(data.user.user_id)).json
+ if (friends_arr == undefined) {
+ friends_arr = []
+ }
+
+ let new_body =
body({},
...header(false, false, data.self.user_id),
div({id: 'top'},
@@ -91,16 +143,53 @@ function render() {
span({class: 'gtext'},
parse('Joined ' + parseDate(new Date(data.user.date)))
)
+ ),
+ !isself ?
+ div({class: 'right'},
+ div({class: `follow ${status == 3 ? 'friend' : ''}`, onclick: async (event) => {
+ let button = event.target
+ if (button.tagName == 'SPAN') {
+ button = button.parentElement
+ }
+
+ let response
+ if (status % 2 == 0) {
+ response = await follow(true, data.user.user_id);
+ } else {
+ response = await follow(false, data.user.user_id);
+ }
+
+ if (response.status == 200) {
+ status = parseInt(response.msg)
+ } else {
+ return
+ }
+
+ button.firstChild.innerHTML = status_text(status)
+ if (status == 3) {
+ button.classList.add('friend')
+ } else {
+ button.classList.remove('friend')
+ }
+ }},
+ span({class: 'gtext'},
+ parse(status_text(status))
+ )
+ )
)
+ : parse('')
),
div({class: 'fullline', style: 'width: 80em; margin-bottom: 0; z-index: 0;'}),
div({class: 'profilebuttons'},
- button({id: 'profilepostbutton', class: 'selected', onclick: () => swap(true)},
+ button({id: 'profilepostbutton', class: 'selected', onclick: () => swap(0)},
parse('Posts')
),
- button({id: 'profileaboutbutton', onclick: () => swap(false)},
+ button({id: 'profileaboutbutton', onclick: () => swap(1)},
parse('About')
),
+ button({id: 'profilefriendsbutton', onclick: () => swap(2)},
+ parse('Friends')
+ ),
div({style: 'flex: 20'}),
isself ? button({class: 'logout', onclick: async () => {
const response = await logout()
@@ -154,6 +243,9 @@ function render() {
)
)
),
+ div({id: 'friends', class: 'hidden'},
+ ...friends_arr.map(u => parseUser(u))
+ ),
div({id: 'popup', class: 'hidden'},
div({class: 'createpost'},
div({class: 'close', onclick: () => document.getElementById('popup').classList.add('hidden')}),
@@ -207,7 +299,6 @@ async function load(id) {
if (el) {
el.remove()
}
- return []
} else {
page++
}
@@ -269,7 +360,7 @@ async function init() {
const posts = await load(id)
data.posts.push(... posts)
-
+
data.user = data.users[id]
render()