diff --git a/routes/_actions/favorite.js b/routes/_actions/favorite.js
new file mode 100644
index 00000000..e5346cf8
--- /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 2c995206..52936a50 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 00000000..463b0c62
--- /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 785bd954..e87d76a7 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 8bc0d473..bdc58176 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 3c8f91e7..ece24f1d 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 58e15a94..35a06ae7 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 0b67b8af..90730e7d 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 f92f524e..89dc85b9 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 94f4f97f..f3da59cc 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 10c28d01..713c7c09 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 56d0fa4a..bcd54f60 100644
--- a/routes/_components/status/StatusToolbar.html
+++ b/routes/_components/status/StatusToolbar.html
@@ -13,7 +13,7 @@