diff --git a/src/content/features/add-friends-fast-delete.js b/src/content/features/add-friends-fast-delete.js new file mode 100644 index 00000000..548085ef --- /dev/null +++ b/src/content/features/add-friends-fast-delete.js @@ -0,0 +1,54 @@ +/** @jsx h */ +import { h } from 'dom-chef' +import select from 'select-dom' + +import { deleteUser, getPlayer } from '../helpers/faceit-api' +import { getPlayerProfileNickname } from '../helpers/player-profile' + +function handleDeleteUser(playerElement, userGuid, playerGuid) { + deleteUser(userGuid, playerGuid).then(() => { + playerElement.setAttribute('hidden', true) + }) +} + +export default async parentElement => { + const isUserProfile = select('div.page-title__edit-button', parentElement) + + if (isUserProfile === null) { + return + } + + const nickname = getPlayerProfileNickname() + const { guid } = await getPlayer(nickname) + + const friendList = select.all( + 'div.profile-friends > div > section > div > div > div', + parentElement + ) + + friendList.forEach(friendElement => { + const friendNameElement = select('a', friendElement) + + const playerRequest = getPlayer(friendNameElement.innerText) + playerRequest.then(player => { + const isAlreadyDeletable = select('span.fast-delete', friendElement) + if (isAlreadyDeletable) { + return + } + + friendElement.children[0].append( + handleDeleteUser(friendElement, guid, player.guid)} + aria-label="Delete" + > + x + + ) + }) + }) +} diff --git a/src/content/helpers/faceit-api.js b/src/content/helpers/faceit-api.js index 3d8bc12d..6dc7ae50 100644 --- a/src/content/helpers/faceit-api.js +++ b/src/content/helpers/faceit-api.js @@ -7,14 +7,26 @@ import { mapTotalStatsMemoized, mapAverageStatsMemoized } from './stats' const BASE_URL = 'https://api.faceit.com' export const CACHE_TIME = 600000 -async function fetchApi(path) { +/** + * FetchApi - Used to fetch Faceit API + * @param {string} path - Path of the request. Required + * @param {string} method - Method of the request (eg: POST). Default to GET. + */ +async function fetchApi(path, method) { if (typeof path !== 'string') { throw new TypeError(`Expected \`path\` to be a string, got ${typeof path}`) } + if (typeof method !== 'string') { + method = 'GET' + } + try { const token = localStorage.getItem('token') - const options = { headers: {} } + const options = { + headers: {}, + method + } if (token) { options.headers.Authorization = `Bearer ${token}` @@ -60,6 +72,9 @@ const fetchApiMemoized = pMemoize(fetchApi, { export const getUser = userId => fetchApiMemoized(`/core/v1/users/${userId}`) +export const deleteUser = (userId, friendId) => + fetchApiMemoized(`/core/v1/users/${userId}/friends/${friendId}`, 'DELETE') + export const getPlayer = nickname => fetchApiMemoized(`/core/v1/nicknames/${nickname}`) diff --git a/src/content/helpers/pages.js b/src/content/helpers/pages.js index f4171e1c..54b941aa 100644 --- a/src/content/helpers/pages.js +++ b/src/content/helpers/pages.js @@ -9,3 +9,6 @@ export const isPlayerProfileStats = path => export const isPlayerProfile = path => /players\/.*$/.test(path || getCurrentPath()) + +export const isPlayerFriendList = path => + /players\/.*friends$/.test(path || getCurrentPath()) diff --git a/src/content/index.js b/src/content/index.js index 3ba1f92e..c785dd93 100755 --- a/src/content/index.js +++ b/src/content/index.js @@ -39,6 +39,7 @@ import addMatchRoomEloSelfResult from './features/add-match-room-elo-self-result import applyMatchRoomFocusMode from './features/apply-match-room-focus-mode' import addMatchRoomPlayerLinks from './features/add-match-room-player-links' import addPlayerProfileLinks from './features/add-player-profile-links' +import addFriendFastDelete from './features/add-friends-fast-delete' let checkedBan = false @@ -164,6 +165,10 @@ function observeBody() { addPlayerProfileBadge(mainContentElement) addPlayerProfileLinks(mainContentElement) + if (pages.isPlayerFriendList()) { + addFriendFastDelete(mainContentElement) + } + if (pages.isPlayerProfileStats()) { runFeatureIf( 'playerProfileLevelProgress',