diff --git a/.gitignore b/.gitignore index 1054c3d..5acfeb2 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ node_modules yarn.lock templates/.* assets/*.css -/mastodon \ No newline at end of file +/mastodon +mastodon.log \ No newline at end of file diff --git a/bin/run-mastodon.js b/bin/run-mastodon.js index 499ac17..450b3bf 100644 --- a/bin/run-mastodon.js +++ b/bin/run-mastodon.js @@ -60,13 +60,10 @@ async function runMastodon () { await exec(cmd, {cwd: mastodonDir}) } const promise = spawn('foreman', ['start'], {cwd: mastodonDir}) + const log = fs.createWriteStream('mastodon.log', {flags: 'a'}) childProc = promise.childProcess - childProc.stdout.on('data', function (data) { - console.log(data.toString('utf8').replace(/\n$/, '')) - }) - childProc.stderr.on('data', function (data) { - console.error(data.toString('utf8').replace(/\n$/, '')) - }) + childProc.stdout.pipe(log) + childProc.stderr.pipe(log) await waitForMastodonToStart() } diff --git a/routes/_actions/favorite.js b/routes/_actions/favorite.js index e5346cf..8683914 100644 --- a/routes/_actions/favorite.js +++ b/routes/_actions/favorite.js @@ -3,20 +3,28 @@ import { store } from '../_store/store' import { database } from '../_database/database' import { toast } from '../_utils/toast' -export async function setFavorited(statusId, favorited) { +export async function setFavorited (statusId, favorited) { + if (!store.get('online')) { + toast.say('You cannot favorite or unfavorite while offline.') + return + } let instanceName = store.get('currentInstance') let accessToken = store.get('accessToken') try { - let status = await (favorited + let result = await (favorited ? favoriteStatus(instanceName, accessToken, statusId) : unfavoriteStatus(instanceName, accessToken, statusId)) - await database.insertStatus(instanceName, status) + if (result.error) { + throw new Error(result.error) + } + await database.setStatusFavorited(instanceName, statusId, favorited) 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.') + console.error(e) + toast.say('Failed to favorite or unfavorite. ' + (e.message || '')) } -} \ No newline at end of file +} diff --git a/routes/_api/blockedAndMuted.js b/routes/_api/blockedAndMuted.js index 52936a5..f9b9d02 100644 --- a/routes/_api/blockedAndMuted.js +++ b/routes/_api/blockedAndMuted.js @@ -1,18 +1,14 @@ import { getWithTimeout, paramsString } from '../_utils/ajax' -import { basename } from './utils' +import { auth, basename } from './utils' export async function getBlockedAccounts (instanceName, accessToken, limit = 80) { let url = `${basename(instanceName)}/api/v1/blocks` url += '?' + paramsString({ limit }) - return getWithTimeout(url, { - 'Authorization': `Bearer ${accessToken}` - }) + return getWithTimeout(url, auth(accessToken)) } export async function getMutedAccounts (instanceName, accessToken, limit = 80) { let url = `${basename(instanceName)}/api/v1/mutes` url += '?' + paramsString({ limit }) - return getWithTimeout(url, { - 'Authorization': `Bearer ${accessToken}` - }) + return getWithTimeout(url, auth(accessToken)) } diff --git a/routes/_api/favorite.js b/routes/_api/favorite.js index 463b0c6..8aade27 100644 --- a/routes/_api/favorite.js +++ b/routes/_api/favorite.js @@ -1,16 +1,12 @@ import { post } from '../_utils/ajax' -import { basename } from './utils' +import { basename, auth } from './utils' -export async function favoriteStatus(instanceName, accessToken, statusId) { +export async function favoriteStatus (instanceName, accessToken, statusId) { let url = `${basename(instanceName)}/api/v1/statuses/${statusId}/favourite` - return post(url, null, { - 'Authorization': `Bearer ${accessToken}` - }) + return post(url, null, auth(accessToken)) } -export async function unfavoriteStatus(instanceName, accessToken, statusId) { +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 + return post(url, null, auth(accessToken)) +} diff --git a/routes/_api/lists.js b/routes/_api/lists.js index bdc5817..0674024 100644 --- a/routes/_api/lists.js +++ b/routes/_api/lists.js @@ -1,9 +1,7 @@ import { getWithTimeout } from '../_utils/ajax' -import { basename } from './utils' +import { auth, basename } from './utils' export function getLists (instanceName, accessToken) { let url = `${basename(instanceName)}/api/v1/lists` - return getWithTimeout(url, { - 'Authorization': `Bearer ${accessToken}` - }) + return getWithTimeout(url, auth(accessToken)) } diff --git a/routes/_api/pinnedStatuses.js b/routes/_api/pinnedStatuses.js index 35a06ae..c1f17af 100644 --- a/routes/_api/pinnedStatuses.js +++ b/routes/_api/pinnedStatuses.js @@ -1,5 +1,5 @@ import { getWithTimeout, paramsString } from '../_utils/ajax' -import { basename } from './utils' +import { auth, basename } from './utils' export async function getPinnedStatuses (instanceName, accessToken, accountId) { let url = `${basename(instanceName)}/api/v1/accounts/${accountId}/statuses` @@ -7,7 +7,5 @@ export async function getPinnedStatuses (instanceName, accessToken, accountId) { limit: 40, pinned: true }) - return getWithTimeout(url, { - 'Authorization': `Bearer ${accessToken}` - }) + return getWithTimeout(url, auth(accessToken)) } diff --git a/routes/_api/reblogsAndFavs.js b/routes/_api/reblogsAndFavs.js index 90730e7..451da79 100644 --- a/routes/_api/reblogsAndFavs.js +++ b/routes/_api/reblogsAndFavs.js @@ -1,18 +1,14 @@ import { getWithTimeout, paramsString } from '../_utils/ajax' -import { basename } from './utils' +import { auth, 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 getWithTimeout(url, { - 'Authorization': `Bearer ${accessToken}` - }) + return getWithTimeout(url, auth(accessToken)) } export async function getFavorites (instanceName, accessToken, statusId, limit = 80) { let url = `${basename(instanceName)}/api/v1/statuses/${statusId}/favourited_by` url += '?' + paramsString({ limit }) - return getWithTimeout(url, { - 'Authorization': `Bearer ${accessToken}` - }) + return getWithTimeout(url, auth(accessToken)) } diff --git a/routes/_api/search.js b/routes/_api/search.js index 89dc85b..1163773 100644 --- a/routes/_api/search.js +++ b/routes/_api/search.js @@ -1,12 +1,10 @@ import { getWithTimeout, paramsString } from '../_utils/ajax' -import { basename } from './utils' +import { auth, basename } from './utils' export function search (instanceName, accessToken, query) { let url = `${basename(instanceName)}/api/v1/search?` + paramsString({ q: query, resolve: true }) - return getWithTimeout(url, { - 'Authorization': `Bearer ${accessToken}` - }) + return getWithTimeout(url, auth(accessToken)) } diff --git a/routes/_api/timelines.js b/routes/_api/timelines.js index f3da59c..c0a5532 100644 --- a/routes/_api/timelines.js +++ b/routes/_api/timelines.js @@ -1,5 +1,5 @@ import { getWithTimeout, paramsString } from '../_utils/ajax' -import { basename } from './utils' +import { auth, basename } from './utils' function getTimelineUrlPath (timeline) { switch (timeline) { @@ -57,14 +57,12 @@ 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([ - getWithTimeout(url, {'Authorization': `Bearer ${accessToken}`}), - getWithTimeout(statusUrl, {'Authorization': `Bearer ${accessToken}`}) + getWithTimeout(url, auth(accessToken)), + getWithTimeout(statusUrl, auth(accessToken)) ]).then(res => { return [].concat(res[0].ancestors).concat([res[1]]).concat(res[0].descendants) }) } - return getWithTimeout(url, { - 'Authorization': `Bearer ${accessToken}` - }) + return getWithTimeout(url, auth(accessToken)) } diff --git a/routes/_api/user.js b/routes/_api/user.js index 713c7c0..c3078ec 100644 --- a/routes/_api/user.js +++ b/routes/_api/user.js @@ -1,25 +1,19 @@ import { getWithTimeout, paramsString } from '../_utils/ajax' -import { basename } from './utils' +import { auth, basename } from './utils' export function getVerifyCredentials (instanceName, accessToken) { let url = `${basename(instanceName)}/api/v1/accounts/verify_credentials` - return getWithTimeout(url, { - 'Authorization': `Bearer ${accessToken}` - }) + return getWithTimeout(url, auth(accessToken)) } export function getAccount (instanceName, accessToken, accountId) { let url = `${basename(instanceName)}/api/v1/accounts/${accountId}` - return getWithTimeout(url, { - 'Authorization': `Bearer ${accessToken}` - }) + return getWithTimeout(url, auth(accessToken)) } export async function getRelationship (instanceName, accessToken, accountId) { let url = `${basename(instanceName)}/api/v1/accounts/relationships` url += '?' + paramsString({id: accountId}) - let res = await getWithTimeout(url, { - 'Authorization': `Bearer ${accessToken}` - }) + let res = await getWithTimeout(url, auth(accessToken)) return res[0] } diff --git a/routes/_api/utils.js b/routes/_api/utils.js index 4f391a0..7c3ce6d 100644 --- a/routes/_api/utils.js +++ b/routes/_api/utils.js @@ -13,3 +13,9 @@ export function basename (instanceName) { } return `https://${instanceName}` } + +export function auth (accessToken) { + return { + 'Authorization': `Bearer ${accessToken}` + } +} diff --git a/routes/_components/IconButton.html b/routes/_components/IconButton.html index 948a00e..7489389 100644 --- a/routes/_components/IconButton.html +++ b/routes/_components/IconButton.html @@ -2,8 +2,10 @@