diff --git a/routes/_actions/favorite.js b/routes/_actions/favorite.js new file mode 100644 index 0000000..e5346cf --- /dev/null +++ b/routes/_actions/favorite.js @@ -0,0 +1,22 @@ +import { favoriteStatus, unfavoriteStatus } from '../_api/favorite' +import { store } from '../_store/store' +import { database } from '../_database/database' +import { toast } from '../_utils/toast' + +export async function setFavorited(statusId, favorited) { + let instanceName = store.get('currentInstance') + let accessToken = store.get('accessToken') + try { + let status = await (favorited + ? favoriteStatus(instanceName, accessToken, statusId) + : unfavoriteStatus(instanceName, accessToken, statusId)) + await database.insertStatus(instanceName, status) + let statusModifications = store.get('statusModifications') + let currentStatusModifications = statusModifications[instanceName] = + (statusModifications[instanceName] || {favorites: {}, reblogs: {}}) + currentStatusModifications.favorites[statusId] = favorited + store.set({statusModifications: statusModifications}) + } catch (e) { + toast.say('Failed to favorite/unfavorite. Please try again.') + } +} \ No newline at end of file diff --git a/routes/_api/blockedAndMuted.js b/routes/_api/blockedAndMuted.js index 2c99520..52936a5 100644 --- a/routes/_api/blockedAndMuted.js +++ b/routes/_api/blockedAndMuted.js @@ -1,10 +1,10 @@ -import { get, paramsString } from '../_utils/ajax' +import { getWithTimeout, paramsString } from '../_utils/ajax' import { basename } from './utils' export async function getBlockedAccounts (instanceName, accessToken, limit = 80) { let url = `${basename(instanceName)}/api/v1/blocks` url += '?' + paramsString({ limit }) - return get(url, { + return getWithTimeout(url, { 'Authorization': `Bearer ${accessToken}` }) } @@ -12,7 +12,7 @@ export async function getBlockedAccounts (instanceName, accessToken, limit = 80) export async function getMutedAccounts (instanceName, accessToken, limit = 80) { let url = `${basename(instanceName)}/api/v1/mutes` url += '?' + paramsString({ limit }) - return get(url, { + return getWithTimeout(url, { 'Authorization': `Bearer ${accessToken}` }) } diff --git a/routes/_api/favorite.js b/routes/_api/favorite.js new file mode 100644 index 0000000..463b0c6 --- /dev/null +++ b/routes/_api/favorite.js @@ -0,0 +1,16 @@ +import { post } from '../_utils/ajax' +import { basename } from './utils' + +export async function favoriteStatus(instanceName, accessToken, statusId) { + let url = `${basename(instanceName)}/api/v1/statuses/${statusId}/favourite` + return post(url, null, { + 'Authorization': `Bearer ${accessToken}` + }) +} + +export async function unfavoriteStatus(instanceName, accessToken, statusId) { + let url = `${basename(instanceName)}/api/v1/statuses/${statusId}/unfavourite` + return post(url, null, { + 'Authorization': `Bearer ${accessToken}` + }) +} \ No newline at end of file diff --git a/routes/_api/instance.js b/routes/_api/instance.js index 785bd95..e87d76a 100644 --- a/routes/_api/instance.js +++ b/routes/_api/instance.js @@ -1,7 +1,7 @@ -import { get } from '../_utils/ajax' +import { getWithTimeout } from '../_utils/ajax' import { basename } from './utils' export function getInstanceInfo (instanceName) { let url = `${basename(instanceName)}/api/v1/instance` - return get(url) + return getWithTimeout(url) } diff --git a/routes/_api/lists.js b/routes/_api/lists.js index 8bc0d47..bdc5817 100644 --- a/routes/_api/lists.js +++ b/routes/_api/lists.js @@ -1,9 +1,9 @@ -import { get } from '../_utils/ajax' +import { getWithTimeout } from '../_utils/ajax' import { basename } from './utils' export function getLists (instanceName, accessToken) { let url = `${basename(instanceName)}/api/v1/lists` - return get(url, { + return getWithTimeout(url, { 'Authorization': `Bearer ${accessToken}` }) } diff --git a/routes/_api/oauth.js b/routes/_api/oauth.js index 3c8f91e..ece24f1 100644 --- a/routes/_api/oauth.js +++ b/routes/_api/oauth.js @@ -1,4 +1,4 @@ -import { post, paramsString } from '../_utils/ajax' +import { postWithTimeout, paramsString } from '../_utils/ajax' import { basename } from './utils' const WEBSITE = 'https://pinafore.social' @@ -7,7 +7,7 @@ const CLIENT_NAME = 'Pinafore' export function registerApplication (instanceName, redirectUri) { const url = `${basename(instanceName)}/api/v1/apps` - return post(url, { + return postWithTimeout(url, { client_name: CLIENT_NAME, redirect_uris: redirectUri, scopes: SCOPES, @@ -27,7 +27,7 @@ export function generateAuthLink (instanceName, clientId, redirectUri) { export function getAccessTokenFromAuthCode (instanceName, clientId, clientSecret, code, redirectUri) { let url = `${basename(instanceName)}/oauth/token` - return post(url, { + return postWithTimeout(url, { client_id: clientId, client_secret: clientSecret, redirect_uri: redirectUri, diff --git a/routes/_api/pinnedStatuses.js b/routes/_api/pinnedStatuses.js index 58e15a9..35a06ae 100644 --- a/routes/_api/pinnedStatuses.js +++ b/routes/_api/pinnedStatuses.js @@ -1,4 +1,4 @@ -import { get, paramsString } from '../_utils/ajax' +import { getWithTimeout, paramsString } from '../_utils/ajax' import { basename } from './utils' export async function getPinnedStatuses (instanceName, accessToken, accountId) { @@ -7,7 +7,7 @@ export async function getPinnedStatuses (instanceName, accessToken, accountId) { limit: 40, pinned: true }) - return get(url, { + return getWithTimeout(url, { 'Authorization': `Bearer ${accessToken}` }) } diff --git a/routes/_api/reblogsAndFavs.js b/routes/_api/reblogsAndFavs.js index 0b67b8a..90730e7 100644 --- a/routes/_api/reblogsAndFavs.js +++ b/routes/_api/reblogsAndFavs.js @@ -1,10 +1,10 @@ -import { get, paramsString } from '../_utils/ajax' +import { getWithTimeout, paramsString } from '../_utils/ajax' import { basename } from './utils' export async function getReblogs (instanceName, accessToken, statusId, limit = 80) { let url = `${basename(instanceName)}/api/v1/statuses/${statusId}/reblogged_by` url += '?' + paramsString({ limit }) - return get(url, { + return getWithTimeout(url, { 'Authorization': `Bearer ${accessToken}` }) } @@ -12,7 +12,7 @@ export async function getReblogs (instanceName, accessToken, statusId, limit = 8 export async function getFavorites (instanceName, accessToken, statusId, limit = 80) { let url = `${basename(instanceName)}/api/v1/statuses/${statusId}/favourited_by` url += '?' + paramsString({ limit }) - return get(url, { + return getWithTimeout(url, { 'Authorization': `Bearer ${accessToken}` }) } diff --git a/routes/_api/search.js b/routes/_api/search.js index f92f524..89dc85b 100644 --- a/routes/_api/search.js +++ b/routes/_api/search.js @@ -1,4 +1,4 @@ -import { get, paramsString } from '../_utils/ajax' +import { getWithTimeout, paramsString } from '../_utils/ajax' import { basename } from './utils' export function search (instanceName, accessToken, query) { @@ -6,7 +6,7 @@ export function search (instanceName, accessToken, query) { q: query, resolve: true }) - return get(url, { + return getWithTimeout(url, { 'Authorization': `Bearer ${accessToken}` }) } diff --git a/routes/_api/timelines.js b/routes/_api/timelines.js index 94f4f97..f3da59c 100644 --- a/routes/_api/timelines.js +++ b/routes/_api/timelines.js @@ -1,4 +1,4 @@ -import { get, paramsString } from '../_utils/ajax' +import { getWithTimeout, paramsString } from '../_utils/ajax' import { basename } from './utils' function getTimelineUrlPath (timeline) { @@ -57,14 +57,14 @@ export function getTimeline (instanceName, accessToken, timeline, maxId, since) // special case - this is a list of descendents and ancestors let statusUrl = `${basename(instanceName)}/api/v1/statuses/${timeline.split('/').slice(-1)[0]}}` return Promise.all([ - get(url, {'Authorization': `Bearer ${accessToken}`}), - get(statusUrl, {'Authorization': `Bearer ${accessToken}`}) + getWithTimeout(url, {'Authorization': `Bearer ${accessToken}`}), + getWithTimeout(statusUrl, {'Authorization': `Bearer ${accessToken}`}) ]).then(res => { return [].concat(res[0].ancestors).concat([res[1]]).concat(res[0].descendants) }) } - return get(url, { + return getWithTimeout(url, { 'Authorization': `Bearer ${accessToken}` }) } diff --git a/routes/_api/user.js b/routes/_api/user.js index 10c28d0..713c7c0 100644 --- a/routes/_api/user.js +++ b/routes/_api/user.js @@ -1,16 +1,16 @@ -import { get, paramsString } from '../_utils/ajax' +import { getWithTimeout, paramsString } from '../_utils/ajax' import { basename } from './utils' export function getVerifyCredentials (instanceName, accessToken) { let url = `${basename(instanceName)}/api/v1/accounts/verify_credentials` - return get(url, { + return getWithTimeout(url, { 'Authorization': `Bearer ${accessToken}` }) } export function getAccount (instanceName, accessToken, accountId) { let url = `${basename(instanceName)}/api/v1/accounts/${accountId}` - return get(url, { + return getWithTimeout(url, { 'Authorization': `Bearer ${accessToken}` }) } @@ -18,7 +18,7 @@ export function getAccount (instanceName, accessToken, accountId) { export async function getRelationship (instanceName, accessToken, accountId) { let url = `${basename(instanceName)}/api/v1/accounts/relationships` url += '?' + paramsString({id: accountId}) - let res = await get(url, { + let res = await getWithTimeout(url, { 'Authorization': `Bearer ${accessToken}` }) return res[0] diff --git a/routes/_components/status/StatusToolbar.html b/routes/_components/status/StatusToolbar.html index 56d0fa4..bcd54f6 100644 --- a/routes/_components/status/StatusToolbar.html +++ b/routes/_components/status/StatusToolbar.html @@ -13,7 +13,7 @@