npm eslint --fix .

This commit is contained in:
Henry Jameson 2019-07-05 10:02:14 +03:00
parent 6bea363b9d
commit 2c2b84d31d
56 changed files with 294 additions and 295 deletions

View File

@ -24,8 +24,8 @@ export default (store) => {
path: '/', path: '/',
redirect: _to => { redirect: _to => {
return (store.state.users.currentUser return (store.state.users.currentUser
? store.state.instance.redirectRootLogin ? store.state.instance.redirectRootLogin
: store.state.instance.redirectRootNoLogin) || '/main/all' : store.state.instance.redirectRootNoLogin) || '/main/all'
} }
}, },
{ name: 'public-external-timeline', path: '/main/all', component: PublicAndExternalTimeline }, { name: 'public-external-timeline', path: '/main/all', component: PublicAndExternalTimeline },

View File

@ -51,7 +51,7 @@ const Attachment = {
} }
}, },
methods: { methods: {
linkClicked ({target}) { linkClicked ({ target }) {
if (target.tagName === 'A') { if (target.tagName === 'A') {
window.open(target.href, '_blank') window.open(target.href, '_blank')
} }

View File

@ -2,11 +2,11 @@ const debounceMilliseconds = 500
export default { export default {
props: { props: {
query: { // function to query results and return a promise query: { // function to query results and return a promise
type: Function, type: Function,
required: true required: true
}, },
filter: { // function to filter results in real time filter: { // function to filter results in real time
type: Function type: Function
}, },
placeholder: { placeholder: {

View File

@ -16,7 +16,7 @@ const chatPanel = {
}, },
methods: { methods: {
submit (message) { submit (message) {
this.$store.state.chat.channel.push('new_msg', {text: message}, 10000) this.$store.state.chat.channel.push('new_msg', { text: message }, 10000)
this.currentMessage = '' this.currentMessage = ''
}, },
togglePanel () { togglePanel () {

View File

@ -86,7 +86,7 @@ const conversation = {
}, },
replies () { replies () {
let i = 1 let i = 1
return reduce(this.conversation, (result, {id, in_reply_to_status_id}) => { return reduce(this.conversation, (result, { id, in_reply_to_status_id }) => {
/* eslint-disable camelcase */ /* eslint-disable camelcase */
const irid = in_reply_to_status_id const irid = in_reply_to_status_id
/* eslint-enable camelcase */ /* eslint-enable camelcase */
@ -119,15 +119,15 @@ const conversation = {
methods: { methods: {
fetchConversation () { fetchConversation () {
if (this.status) { if (this.status) {
this.$store.state.api.backendInteractor.fetchConversation({id: this.status.id}) this.$store.state.api.backendInteractor.fetchConversation({ id: this.status.id })
.then(({ancestors, descendants}) => { .then(({ ancestors, descendants }) => {
this.$store.dispatch('addNewStatuses', { statuses: ancestors }) this.$store.dispatch('addNewStatuses', { statuses: ancestors })
this.$store.dispatch('addNewStatuses', { statuses: descendants }) this.$store.dispatch('addNewStatuses', { statuses: descendants })
}) })
.then(() => this.setHighlight(this.statusId)) .then(() => this.setHighlight(this.statusId))
} else { } else {
const id = this.$route.params.id const id = this.$route.params.id
this.$store.state.api.backendInteractor.fetchStatus({id}) this.$store.state.api.backendInteractor.fetchStatus({ id })
.then((status) => this.$store.dispatch('addNewStatuses', { statuses: [status] })) .then((status) => this.$store.dispatch('addNewStatuses', { statuses: [status] }))
.then(() => this.fetchConversation()) .then(() => this.fetchConversation())
} }

View File

@ -53,7 +53,7 @@ const EmojiInput = {
required: true, required: true,
type: String type: String
} }
}, },
data () { data () {
return { return {
input: undefined, input: undefined,

View File

@ -11,9 +11,9 @@ const FavoriteButton = {
methods: { methods: {
favorite () { favorite () {
if (!this.status.favorited) { if (!this.status.favorited) {
this.$store.dispatch('favorite', {id: this.status.id}) this.$store.dispatch('favorite', { id: this.status.id })
} else { } else {
this.$store.dispatch('unfavorite', {id: this.status.id}) this.$store.dispatch('unfavorite', { id: this.status.id })
} }
this.animated = true this.animated = true
setTimeout(() => { setTimeout(() => {

View File

@ -58,7 +58,7 @@ const LoginForm = {
).then((result) => { ).then((result) => {
if (result.error) { if (result.error) {
if (result.error === 'mfa_required') { if (result.error === 'mfa_required') {
this.requireMFA({app: app, settings: result}) this.requireMFA({ app: app, settings: result })
} else { } else {
this.error = result.error this.error = result.error
this.focusOnPasswordInput() this.focusOnPasswordInput()
@ -66,7 +66,7 @@ const LoginForm = {
return return
} }
this.login(result).then(() => { this.login(result).then(() => {
this.$router.push({name: 'friends'}) this.$router.push({ name: 'friends' })
}) })
}) })
}) })

View File

@ -16,7 +16,7 @@ const mediaUpload = {
if (file.size > store.state.instance.uploadlimit) { if (file.size > store.state.instance.uploadlimit) {
const filesize = fileSizeFormatService.fileSizeFormat(file.size) const filesize = fileSizeFormatService.fileSizeFormat(file.size)
const allowedsize = fileSizeFormatService.fileSizeFormat(store.state.instance.uploadlimit) const allowedsize = fileSizeFormatService.fileSizeFormat(store.state.instance.uploadlimit)
self.$emit('upload-failed', 'file_too_big', {filesize: filesize.num, filesizeunit: filesize.unit, allowedsize: allowedsize.num, allowedsizeunit: allowedsize.unit}) self.$emit('upload-failed', 'file_too_big', { filesize: filesize.num, filesizeunit: filesize.unit, allowedsize: allowedsize.num, allowedsizeunit: allowedsize.unit })
return return
} }
const formData = new FormData() const formData = new FormData()
@ -36,7 +36,7 @@ const mediaUpload = {
}, },
fileDrop (e) { fileDrop (e) {
if (e.dataTransfer.files.length > 0) { if (e.dataTransfer.files.length > 0) {
e.preventDefault() // allow dropping text like before e.preventDefault() // allow dropping text like before
this.uploadFile(e.dataTransfer.files[0]) this.uploadFile(e.dataTransfer.files[0])
} }
}, },
@ -54,7 +54,7 @@ const mediaUpload = {
this.uploadReady = true this.uploadReady = true
}) })
}, },
change ({target}) { change ({ target }) {
for (var i = 0; i < target.files.length; i++) { for (var i = 0; i < target.files.length; i++) {
let file = target.files[i] let file = target.files[i]
this.uploadFile(file) this.uploadFile(file)

View File

@ -33,7 +33,7 @@ export default {
} }
this.login(result).then(() => { this.login(result).then(() => {
this.$router.push({name: 'friends'}) this.$router.push({ name: 'friends' })
}) })
}) })
} }

View File

@ -32,7 +32,7 @@ export default {
} }
this.login(result).then(() => { this.login(result).then(() => {
this.$router.push({name: 'friends'}) this.$router.push({ name: 'friends' })
}) })
}) })
} }

View File

@ -96,12 +96,12 @@ const MobilePostStatusModal = {
this.hidden = false this.hidden = false
} }
this.oldScrollPos = window.scrollY this.oldScrollPos = window.scrollY
}, 100, {leading: true, trailing: false}), }, 100, { leading: true, trailing: false }),
handleScrollEnd: debounce(function () { handleScrollEnd: debounce(function () {
this.hidden = false this.hidden = false
this.oldScrollPos = window.scrollY this.oldScrollPos = window.scrollY
}, 100, {leading: false, trailing: true}) }, 100, { leading: false, trailing: true })
} }
} }

View File

@ -52,12 +52,12 @@ const ModerationTools = {
if (this.tagsSet.has(tag)) { if (this.tagsSet.has(tag)) {
store.state.api.backendInteractor.untagUser(this.user, tag).then(response => { store.state.api.backendInteractor.untagUser(this.user, tag).then(response => {
if (!response.ok) { return } if (!response.ok) { return }
store.commit('untagUser', {user: this.user, tag}) store.commit('untagUser', { user: this.user, tag })
}) })
} else { } else {
store.state.api.backendInteractor.tagUser(this.user, tag).then(response => { store.state.api.backendInteractor.tagUser(this.user, tag).then(response => {
if (!response.ok) { return } if (!response.ok) { return }
store.commit('tagUser', {user: this.user, tag}) store.commit('tagUser', { user: this.user, tag })
}) })
} }
}, },
@ -66,12 +66,12 @@ const ModerationTools = {
if (this.user.rights[right]) { if (this.user.rights[right]) {
store.state.api.backendInteractor.deleteRight(this.user, right).then(response => { store.state.api.backendInteractor.deleteRight(this.user, right).then(response => {
if (!response.ok) { return } if (!response.ok) { return }
store.commit('updateRight', {user: this.user, right: right, value: false}) store.commit('updateRight', { user: this.user, right: right, value: false })
}) })
} else { } else {
store.state.api.backendInteractor.addRight(this.user, right).then(response => { store.state.api.backendInteractor.addRight(this.user, right).then(response => {
if (!response.ok) { return } if (!response.ok) { return }
store.commit('updateRight', {user: this.user, right: right, value: true}) store.commit('updateRight', { user: this.user, right: right, value: true })
}) })
} }
}, },
@ -80,7 +80,7 @@ const ModerationTools = {
const status = !!this.user.deactivated const status = !!this.user.deactivated
store.state.api.backendInteractor.setActivationStatus(this.user, status).then(response => { store.state.api.backendInteractor.setActivationStatus(this.user, status).then(response => {
if (!response.ok) { return } if (!response.ok) { return }
store.commit('updateActivationStatus', {user: this.user, status: status}) store.commit('updateActivationStatus', { user: this.user, status: status })
}) })
}, },
deleteUserDialog (show) { deleteUserDialog (show) {
@ -89,7 +89,7 @@ const ModerationTools = {
deleteUser () { deleteUser () {
const store = this.$store const store = this.$store
const user = this.user const user = this.user
const {id, name} = user const { id, name } = user
store.state.api.backendInteractor.deleteUser(user) store.state.api.backendInteractor.deleteUser(user)
.then(e => { .then(e => {
this.$store.dispatch('markStatusesAsDeleted', status => user.id === status.user.id) this.$store.dispatch('markStatusesAsDeleted', status => user.id === status.user.id)

View File

@ -28,7 +28,7 @@ const registration = {
}, },
created () { created () {
if ((!this.registrationOpen && !this.token) || this.signedIn) { if ((!this.registrationOpen && !this.token) || this.signedIn) {
this.$router.push({name: 'root'}) this.$router.push({ name: 'root' })
} }
this.setCaptcha() this.setCaptcha()
@ -61,7 +61,7 @@ const registration = {
if (!this.$v.$invalid) { if (!this.$v.$invalid) {
try { try {
await this.signUp(this.user) await this.signUp(this.user)
this.$router.push({name: 'friends'}) this.$router.push({ name: 'friends' })
} catch (error) { } catch (error) {
console.warn('Registration failed: ' + error) console.warn('Registration failed: ' + error)
} }

View File

@ -11,9 +11,9 @@ const RetweetButton = {
methods: { methods: {
retweet () { retweet () {
if (!this.status.repeated) { if (!this.status.repeated) {
this.$store.dispatch('retweet', {id: this.status.id}) this.$store.dispatch('retweet', { id: this.status.id })
} else { } else {
this.$store.dispatch('unretweet', {id: this.status.id}) this.$store.dispatch('unretweet', { id: this.status.id })
} }
this.animated = true this.animated = true
setTimeout(() => { setTimeout(() => {

View File

@ -29,10 +29,10 @@ const ScopeSelector = {
}, },
css () { css () {
return { return {
public: {selected: this.currentScope === 'public'}, public: { selected: this.currentScope === 'public' },
unlisted: {selected: this.currentScope === 'unlisted'}, unlisted: { selected: this.currentScope === 'unlisted' },
private: {selected: this.currentScope === 'private'}, private: { selected: this.currentScope === 'private' },
direct: {selected: this.currentScope === 'direct'} direct: { selected: this.currentScope === 'direct' }
} }
} }
}, },

View File

@ -10,6 +10,12 @@ export default Vue.component('tab-switcher', {
active: this.$slots.default.findIndex(_ => _.tag) active: this.$slots.default.findIndex(_ => _.tag)
} }
}, },
beforeUpdate () {
const currentSlot = this.$slots.default[this.active]
if (!currentSlot.tag) {
this.active = this.$slots.default.findIndex(_ => _.tag)
}
},
methods: { methods: {
activateTab (index, dataset) { activateTab (index, dataset) {
return () => { return () => {
@ -20,34 +26,28 @@ export default Vue.component('tab-switcher', {
} }
} }
}, },
beforeUpdate () {
const currentSlot = this.$slots.default[this.active]
if (!currentSlot.tag) {
this.active = this.$slots.default.findIndex(_ => _.tag)
}
},
render (h) { render (h) {
const tabs = this.$slots.default const tabs = this.$slots.default
.map((slot, index) => { .map((slot, index) => {
if (!slot.tag) return if (!slot.tag) return
const classesTab = ['tab'] const classesTab = ['tab']
const classesWrapper = ['tab-wrapper'] const classesWrapper = ['tab-wrapper']
if (index === this.active) { if (index === this.active) {
classesTab.push('active') classesTab.push('active')
classesWrapper.push('active') classesWrapper.push('active')
} }
return ( return (
<div class={ classesWrapper.join(' ')}> <div class={ classesWrapper.join(' ')}>
<button <button
disabled={slot.data.attrs.disabled} disabled={slot.data.attrs.disabled}
onClick={this.activateTab(index)} onClick={this.activateTab(index)}
class={classesTab.join(' ')}> class={classesTab.join(' ')}>
{slot.data.attrs.label}</button> {slot.data.attrs.label}</button>
</div> </div>
) )
}) })
const contents = this.$slots.default.map((slot, index) => { const contents = this.$slots.default.map((slot, index) => {
if (!slot.tag) return if (!slot.tag) return

View File

@ -139,7 +139,7 @@ const Timeline = {
if (top < 15 && if (top < 15 &&
!this.paused && !this.paused &&
!(this.unfocused && this.$store.state.config.pauseOnUnfocused) !(this.unfocused && this.$store.state.config.pauseOnUnfocused)
) { ) {
this.showNewStatuses() this.showNewStatuses()
} else { } else {
this.paused = true this.paused = true

View File

@ -23,15 +23,15 @@ export default {
computed: { computed: {
classes () { classes () {
return [{ return [{
'user-card-rounded-t': this.rounded === 'top', // set border-top-left-radius and border-top-right-radius 'user-card-rounded-t': this.rounded === 'top', // set border-top-left-radius and border-top-right-radius
'user-card-rounded': this.rounded === true, // set border-radius for all sides 'user-card-rounded': this.rounded === true, // set border-radius for all sides
'user-card-bordered': this.bordered === true // set border for all sides 'user-card-bordered': this.bordered === true // set border for all sides
}] }]
}, },
style () { style () {
const color = this.$store.state.config.customTheme.colors const color = this.$store.state.config.customTheme.colors
? this.$store.state.config.customTheme.colors.bg // v2 ? this.$store.state.config.customTheme.colors.bg // v2
: this.$store.state.config.colors.bg // v1 : this.$store.state.config.colors.bg // v1
if (color) { if (color) {
const rgb = (typeof color === 'string') ? hex2rgb(color) : color const rgb = (typeof color === 'string') ? hex2rgb(color) : color
@ -110,7 +110,7 @@ export default {
followUser () { followUser () {
const store = this.$store const store = this.$store
this.followRequestInProgress = true this.followRequestInProgress = true
requestFollow(this.user, store).then(({sent}) => { requestFollow(this.user, store).then(({ sent }) => {
this.followRequestInProgress = false this.followRequestInProgress = false
this.followRequestSent = sent this.followRequestSent = sent
}) })
@ -141,7 +141,7 @@ export default {
store.commit('setProfileView', { v }) store.commit('setProfileView', { v })
} }
}, },
linkClicked ({target}) { linkClicked ({ target }) {
if (target.tagName === 'SPAN') { if (target.tagName === 'SPAN') {
target = target.parentNode target = target.parentNode
} }

View File

@ -107,7 +107,7 @@ const Mfa = {
this.setupState.setupOTPState = 'confirm' this.setupState.setupOTPState = 'confirm'
}) })
}, },
doConfirmOTP () { // handler confirm enable OTP doConfirmOTP () { // handler confirm enable OTP
this.error = null this.error = null
this.backendInteractor.mfaConfirmOTP({ this.backendInteractor.mfaConfirmOTP({
token: this.otpConfirmToken, token: this.otpConfirmToken,

View File

@ -99,7 +99,7 @@ const UserSettings = {
return suggestor({ emoji: [ return suggestor({ emoji: [
...this.$store.state.instance.emoji, ...this.$store.state.instance.emoji,
...this.$store.state.instance.customEmoji ...this.$store.state.instance.customEmoji
]}) ] })
}, },
pleromaBackend () { pleromaBackend () {
return this.$store.state.instance.pleromaBackend return this.$store.state.instance.pleromaBackend
@ -144,10 +144,10 @@ const UserSettings = {
hide_followers: this.hideFollowers, hide_followers: this.hideFollowers,
show_role: this.showRole show_role: this.showRole
/* eslint-enable camelcase */ /* eslint-enable camelcase */
}}).then((user) => { } }).then((user) => {
this.$store.commit('addNewUsers', [user]) this.$store.commit('addNewUsers', [user])
this.$store.commit('setCurrentUser', user) this.$store.commit('setCurrentUser', user)
}) })
}, },
updateNotificationSettings () { updateNotificationSettings () {
this.$store.state.api.backendInteractor this.$store.state.api.backendInteractor
@ -162,12 +162,12 @@ const UserSettings = {
if (file.size > this.$store.state.instance[slot + 'limit']) { if (file.size > this.$store.state.instance[slot + 'limit']) {
const filesize = fileSizeFormatService.fileSizeFormat(file.size) const filesize = fileSizeFormatService.fileSizeFormat(file.size)
const allowedsize = fileSizeFormatService.fileSizeFormat(this.$store.state.instance[slot + 'limit']) const allowedsize = fileSizeFormatService.fileSizeFormat(this.$store.state.instance[slot + 'limit'])
this[slot + 'UploadError'] = this.$t('upload.error.base') + ' ' + this.$t('upload.error.file_too_big', {filesize: filesize.num, filesizeunit: filesize.unit, allowedsize: allowedsize.num, allowedsizeunit: allowedsize.unit}) this[slot + 'UploadError'] = this.$t('upload.error.base') + ' ' + this.$t('upload.error.file_too_big', { filesize: filesize.num, filesizeunit: filesize.unit, allowedsize: allowedsize.num, allowedsizeunit: allowedsize.unit })
return return
} }
// eslint-disable-next-line no-undef // eslint-disable-next-line no-undef
const reader = new FileReader() const reader = new FileReader()
reader.onload = ({target}) => { reader.onload = ({ target }) => {
const img = target.result const img = target.result
this[slot + 'Preview'] = img this[slot + 'Preview'] = img
this[slot] = file this[slot] = file
@ -203,7 +203,7 @@ const UserSettings = {
if (!this.bannerPreview) { return } if (!this.bannerPreview) { return }
this.bannerUploading = true this.bannerUploading = true
this.$store.state.api.backendInteractor.updateBanner({banner: this.banner}) this.$store.state.api.backendInteractor.updateBanner({ banner: this.banner })
.then((user) => { .then((user) => {
this.$store.commit('addNewUsers', [user]) this.$store.commit('addNewUsers', [user])
this.$store.commit('setCurrentUser', user) this.$store.commit('setCurrentUser', user)
@ -269,11 +269,11 @@ const UserSettings = {
this.deletingAccount = true this.deletingAccount = true
}, },
deleteAccount () { deleteAccount () {
this.$store.state.api.backendInteractor.deleteAccount({password: this.deleteAccountConfirmPasswordInput}) this.$store.state.api.backendInteractor.deleteAccount({ password: this.deleteAccountConfirmPasswordInput })
.then((res) => { .then((res) => {
if (res.status === 'success') { if (res.status === 'success') {
this.$store.dispatch('logout') this.$store.dispatch('logout')
this.$router.push({name: 'root'}) this.$router.push({ name: 'root' })
} else { } else {
this.deleteAccountError = res.error this.deleteAccountError = res.error
} }
@ -322,7 +322,7 @@ const UserSettings = {
}) })
}, },
queryUserIds (query) { queryUserIds (query) {
return userSearchApi.search({query, store: this.$store}) return userSearchApi.search({ query, store: this.$store })
.then((users) => { .then((users) => {
this.$store.dispatch('addNewUsers', users) this.$store.dispatch('addNewUsers', users)
return map(users, 'id') return map(users, 'id')

View File

@ -37,7 +37,7 @@ const WhoToFollow = {
getWhoToFollow () { getWhoToFollow () {
const credentials = this.$store.state.users.currentUser.credentials const credentials = this.$store.state.users.currentUser.credentials
if (credentials) { if (credentials) {
apiService.suggestions({credentials: credentials}) apiService.suggestions({ credentials: credentials })
.then((reply) => { .then((reply) => {
this.showWhoToFollow(reply) this.showWhoToFollow(reply)
}) })

View File

@ -29,7 +29,7 @@ function getWhoToFollow (panel) {
panel.usersToFollow.forEach(toFollow => { panel.usersToFollow.forEach(toFollow => {
toFollow.name = 'Loading...' toFollow.name = 'Loading...'
}) })
apiService.suggestions({credentials: credentials}) apiService.suggestions({ credentials: credentials })
.then((reply) => { .then((reply) => {
showWhoToFollow(panel, reply) showWhoToFollow(panel, reply)
}) })

View File

@ -4,39 +4,16 @@ import { getComponentProps } from '../../services/component_utils/component_util
import './with_load_more.scss' import './with_load_more.scss'
const withLoadMore = ({ const withLoadMore = ({
fetch, // function to fetch entries and return a promise fetch, // function to fetch entries and return a promise
select, // function to select data from store select, // function to select data from store
destroy, // function called at "destroyed" lifecycle destroy, // function called at "destroyed" lifecycle
childPropName = 'entries', // name of the prop to be passed into the wrapped component childPropName = 'entries', // name of the prop to be passed into the wrapped component
additionalPropNames = [] // additional prop name list of the wrapper component additionalPropNames = [] // additional prop name list of the wrapper component
}) => (WrappedComponent) => { }) => (WrappedComponent) => {
const originalProps = Object.keys(getComponentProps(WrappedComponent)) const originalProps = Object.keys(getComponentProps(WrappedComponent))
const props = originalProps.filter(v => v !== childPropName).concat(additionalPropNames) const props = originalProps.filter(v => v !== childPropName).concat(additionalPropNames)
return Vue.component('withLoadMore', { return Vue.component('withLoadMore', {
render (createElement) {
const props = {
props: {
...this.$props,
[childPropName]: this.entries
},
on: this.$listeners,
scopedSlots: this.$scopedSlots
}
const children = Object.entries(this.$slots).map(([key, value]) => createElement('template', { slot: key }, value))
return (
<div class="with-load-more">
<WrappedComponent {...props}>
{children}
</WrappedComponent>
<div class="with-load-more-footer">
{this.error && <a onClick={this.fetchEntries} class="alert error">{this.$t('general.generic_error')}</a>}
{!this.error && this.loading && <i class="icon-spin3 animate-spin"/>}
{!this.error && !this.loading && !this.bottomedOut && <a onClick={this.fetchEntries}>{this.$t('general.more')}</a>}
</div>
</div>
)
},
props, props,
data () { data () {
return { return {
@ -87,6 +64,29 @@ const withLoadMore = ({
this.fetchEntries() this.fetchEntries()
} }
} }
},
render (createElement) {
const props = {
props: {
...this.$props,
[childPropName]: this.entries
},
on: this.$listeners,
scopedSlots: this.$scopedSlots
}
const children = Object.entries(this.$slots).map(([key, value]) => createElement('template', { slot: key }, value))
return (
<div class="with-load-more">
<WrappedComponent {...props}>
{children}
</WrappedComponent>
<div class="with-load-more-footer">
{this.error && <a onClick={this.fetchEntries} class="alert error">{this.$t('general.generic_error')}</a>}
{!this.error && this.loading && <i class="icon-spin3 animate-spin"/>}
{!this.error && !this.loading && !this.bottomedOut && <a onClick={this.fetchEntries}>{this.$t('general.more')}</a>}
</div>
</div>
)
} }
}) })
} }

View File

@ -4,10 +4,10 @@ import { getComponentProps } from '../../services/component_utils/component_util
import './with_subscription.scss' import './with_subscription.scss'
const withSubscription = ({ const withSubscription = ({
fetch, // function to fetch entries and return a promise fetch, // function to fetch entries and return a promise
select, // function to select data from store select, // function to select data from store
childPropName = 'content', // name of the prop to be passed into the wrapped component childPropName = 'content', // name of the prop to be passed into the wrapped component
additionalPropNames = [] // additional prop name list of the wrapper component additionalPropNames = [] // additional prop name list of the wrapper component
}) => (WrappedComponent) => { }) => (WrappedComponent) => {
const originalProps = Object.keys(getComponentProps(WrappedComponent)) const originalProps = Object.keys(getComponentProps(WrappedComponent))
const props = originalProps.filter(v => v !== childPropName).concat(additionalPropNames) const props = originalProps.filter(v => v !== childPropName).concat(additionalPropNames)
@ -15,37 +15,8 @@ const withSubscription = ({
return Vue.component('withSubscription', { return Vue.component('withSubscription', {
props: [ props: [
...props, ...props,
'refresh' // boolean saying to force-fetch data whenever created 'refresh' // boolean saying to force-fetch data whenever created
], ],
render (createElement) {
if (!this.error && !this.loading) {
const props = {
props: {
...this.$props,
[childPropName]: this.fetchedData
},
on: this.$listeners,
scopedSlots: this.$scopedSlots
}
const children = Object.entries(this.$slots).map(([key, value]) => createElement('template', { slot: key }, value))
return (
<div class="with-subscription">
<WrappedComponent {...props}>
{children}
</WrappedComponent>
</div>
)
} else {
return (
<div class="with-subscription-loading">
{this.error
? <a onClick={this.fetchData} class="alert error">{this.$t('general.generic_error')}</a>
: <i class="icon-spin3 animate-spin"/>
}
</div>
)
}
},
data () { data () {
return { return {
loading: false, loading: false,
@ -77,6 +48,35 @@ const withSubscription = ({
}) })
} }
} }
},
render (createElement) {
if (!this.error && !this.loading) {
const props = {
props: {
...this.$props,
[childPropName]: this.fetchedData
},
on: this.$listeners,
scopedSlots: this.$scopedSlots
}
const children = Object.entries(this.$slots).map(([key, value]) => createElement('template', { slot: key }, value))
return (
<div class="with-subscription">
<WrappedComponent {...props}>
{children}
</WrappedComponent>
</div>
)
} else {
return (
<div class="with-subscription-loading">
{this.error
? <a onClick={this.fetchData} class="alert error">{this.$t('general.generic_error')}</a>
: <i class="icon-spin3 animate-spin"/>
}
</div>
)
}
} }
}) })
} }

View File

@ -55,7 +55,7 @@ const mutations = {
requireToken (state) { requireToken (state) {
state.strategy = TOKEN_STRATEGY state.strategy = TOKEN_STRATEGY
}, },
requireMFA (state, {app, settings}) { requireMFA (state, { app, settings }) {
state.settings = settings state.settings = settings
state.app = app state.app = app
state.strategy = TOTP_STRATEGY // default strategy of MFA state.strategy = TOTP_STRATEGY // default strategy of MFA
@ -73,7 +73,7 @@ const mutations = {
// actions // actions
const actions = { const actions = {
async login ({state, dispatch, commit}, {access_token}) { async login ({ state, dispatch, commit }, { access_token }) {
commit('setToken', access_token, { root: true }) commit('setToken', access_token, { root: true })
await dispatch('loginUser', access_token, { root: true }) await dispatch('loginUser', access_token, { root: true })
resetState(state) resetState(state)

View File

@ -1,7 +1,7 @@
const chat = { const chat = {
state: { state: {
messages: [], messages: [],
channel: {state: ''}, channel: { state: '' },
socket: null socket: null
}, },
mutations: { mutations: {
@ -29,7 +29,7 @@ const chat = {
channel.on('new_msg', (msg) => { channel.on('new_msg', (msg) => {
store.commit('addMessage', msg) store.commit('addMessage', msg)
}) })
channel.on('messages', ({messages}) => { channel.on('messages', ({ messages }) => {
store.commit('setMessages', messages) store.commit('setMessages', messages)
}) })
channel.join() channel.join()

View File

@ -56,10 +56,10 @@ const config = {
}, },
actions: { actions: {
setHighlight ({ commit, dispatch }, { user, color, type }) { setHighlight ({ commit, dispatch }, { user, color, type }) {
commit('setHighlight', {user, color, type}) commit('setHighlight', { user, color, type })
}, },
setOption ({ commit, dispatch }, { name, value }) { setOption ({ commit, dispatch }, { name, value }) {
commit('setOption', {name, value}) commit('setOption', { name, value })
switch (name) { switch (name) {
case 'theme': case 'theme':
setPreset(value, commit) setPreset(value, commit)

View File

@ -9,4 +9,3 @@ export function humanizeErrors (errors) {
return [...errs, message] return [...errs, message]
}, []) }, [])
} }

View File

@ -74,7 +74,7 @@ const instance = {
}, },
actions: { actions: {
setInstanceOption ({ commit, dispatch }, { name, value }) { setInstanceOption ({ commit, dispatch }, { name, value }) {
commit('setInstanceOption', {name, value}) commit('setInstanceOption', { name, value })
switch (name) { switch (name) {
case 'name': case 'name':
dispatch('setPageTitle') dispatch('setPageTitle')

View File

@ -3,12 +3,12 @@ const oauthTokens = {
tokens: [] tokens: []
}, },
actions: { actions: {
fetchTokens ({rootState, commit}) { fetchTokens ({ rootState, commit }) {
rootState.api.backendInteractor.fetchOAuthTokens().then((tokens) => { rootState.api.backendInteractor.fetchOAuthTokens().then((tokens) => {
commit('swapTokens', tokens) commit('swapTokens', tokens)
}) })
}, },
revokeToken ({rootState, commit, state}, id) { revokeToken ({ rootState, commit, state }, id) {
rootState.api.backendInteractor.revokeOAuthToken(id).then((response) => { rootState.api.backendInteractor.revokeOAuthToken(id).then((response) => {
if (response.status === 201) { if (response.status === 201) {
commit('swapTokens', state.tokens.filter(token => token.id !== id)) commit('swapTokens', state.tokens.filter(token => token.id !== id))

View File

@ -80,13 +80,13 @@ const mergeOrAdd = (arr, obj, item) => {
merge(oldItem, omitBy(item, (v, k) => v === null || k === 'user')) merge(oldItem, omitBy(item, (v, k) => v === null || k === 'user'))
// Reactivity fix. // Reactivity fix.
oldItem.attachments.splice(oldItem.attachments.length) oldItem.attachments.splice(oldItem.attachments.length)
return {item: oldItem, new: false} return { item: oldItem, new: false }
} else { } else {
// This is a new item, prepare it // This is a new item, prepare it
prepareStatus(item) prepareStatus(item)
arr.push(item) arr.push(item)
set(obj, item.id, item) set(obj, item.id, item)
return {item, new: true} return { item, new: true }
} }
} }
@ -137,7 +137,7 @@ const removeStatusFromGlobalStorage = (state, status) => {
// TODO: Need to remove from allStatusesObject? // TODO: Need to remove from allStatusesObject?
// Remove possible notification // Remove possible notification
remove(state.notifications.data, ({action: {id}}) => id === status.id) remove(state.notifications.data, ({ action: { id } }) => id === status.id)
// Remove from conversation // Remove from conversation
const conversationId = status.statusnet_conversation_id const conversationId = status.statusnet_conversation_id
@ -270,7 +270,7 @@ const addNewStatuses = (state, { statuses, showImmediately = false, timeline, us
}, },
'deletion': (deletion) => { 'deletion': (deletion) => {
const uri = deletion.uri const uri = deletion.uri
const status = find(allStatuses, {uri}) const status = find(allStatuses, { uri })
if (!status) { if (!status) {
return return
} }

View File

@ -346,8 +346,8 @@ const users = {
const notificationsObject = store.rootState.statuses.notifications.idStore const notificationsObject = store.rootState.statuses.notifications.idStore
const relevantNotifications = Object.entries(notificationsObject) const relevantNotifications = Object.entries(notificationsObject)
.filter(([k, val]) => notificationIds.includes(k)) .filter(([k, val]) => notificationIds.includes(k))
.map(([k, val]) => val) .map(([k, val]) => val)
// Reconnect users to notifications // Reconnect users to notifications
each(relevantNotifications, (notification) => { each(relevantNotifications, (notification) => {
@ -459,11 +459,11 @@ const users = {
commit('endLogin') commit('endLogin')
resolve() resolve()
}) })
.catch((error) => { .catch((error) => {
console.log(error) console.log(error)
commit('endLogin') commit('endLogin')
reject('Failed to connect to server, try again') reject('Failed to connect to server, try again')
}) })
}) })
} }
} }

View File

@ -315,7 +315,7 @@ const exportFriends = ({ id, credentials }) => {
let more = true let more = true
while (more) { while (more) {
const maxId = friends.length > 0 ? last(friends).id : undefined const maxId = friends.length > 0 ? last(friends).id : undefined
const users = await fetchFriends({id, maxId, credentials}) const users = await fetchFriends({ id, maxId, credentials })
friends = concat(friends, users) friends = concat(friends, users)
if (users.length === 0) { if (users.length === 0) {
more = false more = false

View File

@ -59,7 +59,7 @@ const srgbToLinear = (srgb) => {
* @returns {Number} relative luminance * @returns {Number} relative luminance
*/ */
const relativeLuminance = (srgb) => { const relativeLuminance = (srgb) => {
const {r, g, b} = srgbToLinear(srgb) const { r, g, b } = srgbToLinear(srgb)
return 0.2126 * r + 0.7152 * g + 0.0722 * b return 0.2126 * r + 0.7152 * g + 0.0722 * b
} }

View File

@ -8,7 +8,7 @@ export const wordAtPosition = (str, pos) => {
const words = splitIntoWords(str) const words = splitIntoWords(str)
const wordsWithPosition = addPositionToWords(words) const wordsWithPosition = addPositionToWords(words)
return find(wordsWithPosition, ({start, end}) => start <= pos && end > pos) return find(wordsWithPosition, ({ start, end }) => start <= pos && end > pos)
} }
export const addPositionToWords = (words) => { export const addPositionToWords = (words) => {

View File

@ -9,7 +9,7 @@ const fileSizeFormat = (num) => {
exponent = Math.min(Math.floor(Math.log(num) / Math.log(1024)), units.length - 1) exponent = Math.min(Math.floor(Math.log(num) / Math.log(1024)), units.length - 1)
num = (num / Math.pow(1024, exponent)).toFixed(2) * 1 num = (num / Math.pow(1024, exponent)).toFixed(2) * 1
unit = units[exponent] unit = units[exponent]
return {num: num, unit: unit} return { num: num, unit: unit }
} }
const fileSizeFormatService = { const fileSizeFormatService = {
fileSizeFormat fileSizeFormat

View File

@ -8,7 +8,7 @@ const fetchAndUpdate = ({ store, credentials }) => {
.catch(() => {}) .catch(() => {})
} }
const startFetching = ({credentials, store}) => { const startFetching = ({ credentials, store }) => {
fetchAndUpdate({ credentials, store }) fetchAndUpdate({ credentials, store })
const boundFetchAndUpdate = () => fetchAndUpdate({ credentials, store }) const boundFetchAndUpdate = () => fetchAndUpdate({ credentials, store })
return setInterval(boundFetchAndUpdate, 10000) return setInterval(boundFetchAndUpdate, 10000)

View File

@ -1,4 +1,4 @@
const verifyOTPCode = ({app, instance, mfaToken, code}) => { const verifyOTPCode = ({ app, instance, mfaToken, code }) => {
const url = `${instance}/oauth/mfa/challenge` const url = `${instance}/oauth/mfa/challenge`
const form = new window.FormData() const form = new window.FormData()
@ -14,7 +14,7 @@ const verifyOTPCode = ({app, instance, mfaToken, code}) => {
}).then((data) => data.json()) }).then((data) => data.json())
} }
const verifyRecoveryCode = ({app, instance, mfaToken, code}) => { const verifyRecoveryCode = ({ app, instance, mfaToken, code }) => {
const url = `${instance}/oauth/mfa/challenge` const url = `${instance}/oauth/mfa/challenge`
const form = new window.FormData() const form = new window.FormData()

View File

@ -93,7 +93,7 @@ export const getClientToken = ({ clientId, clientSecret, instance }) => {
body: form body: form
}).then((data) => data.json()) }).then((data) => data.json())
} }
const verifyOTPCode = ({app, instance, mfaToken, code}) => { const verifyOTPCode = ({ app, instance, mfaToken, code }) => {
const url = `${instance}/oauth/mfa/challenge` const url = `${instance}/oauth/mfa/challenge`
const form = new window.FormData() const form = new window.FormData()
@ -109,7 +109,7 @@ const verifyOTPCode = ({app, instance, mfaToken, code}) => {
}).then((data) => data.json()) }).then((data) => data.json())
} }
const verifyRecoveryCode = ({app, instance, mfaToken, code}) => { const verifyRecoveryCode = ({ app, instance, mfaToken, code }) => {
const url = `${instance}/oauth/mfa/challenge` const url = `${instance}/oauth/mfa/challenge`
const form = new window.FormData() const form = new window.FormData()

View File

@ -1,7 +1,7 @@
import utils from './utils.js' import utils from './utils.js'
import { parseUser } from '../entity_normalizer/entity_normalizer.service.js' import { parseUser } from '../entity_normalizer/entity_normalizer.service.js'
const search = ({query, store}) => { const search = ({ query, store }) => {
return utils.request({ return utils.request({
store, store,
url: '/api/v1/accounts/search', url: '/api/v1/accounts/search',
@ -10,8 +10,8 @@ const search = ({query, store}) => {
resolve: true resolve: true
} }
}) })
.then((data) => data.json()) .then((data) => data.json())
.then((data) => data.map(parseUser)) .then((data) => data.map(parseUser))
} }
const UserSearch = { const UserSearch = {
search search

View File

@ -13,7 +13,7 @@ const headers = (store) => {
} }
} }
const request = ({method = 'GET', url, params, store}) => { const request = ({ method = 'GET', url, params, store }) => {
const instance = store.state.instance.server const instance = store.state.instance.server
let fullUrl = `${instance}${url}` let fullUrl = `${instance}${url}`

View File

@ -35,4 +35,4 @@ export const visibleNotificationsFromStore = (store, types) => {
} }
export const unseenNotificationsFromStore = store => export const unseenNotificationsFromStore = store =>
filter(visibleNotificationsFromStore(store), ({seen}) => !seen) filter(visibleNotificationsFromStore(store), ({ seen }) => !seen)

View File

@ -1,12 +1,12 @@
import apiService from '../api/api.service.js' import apiService from '../api/api.service.js'
const update = ({store, notifications, older}) => { const update = ({ store, notifications, older }) => {
store.dispatch('setNotificationsError', { value: false }) store.dispatch('setNotificationsError', { value: false })
store.dispatch('addNewNotifications', { notifications, older }) store.dispatch('addNewNotifications', { notifications, older })
} }
const fetchAndUpdate = ({store, credentials, older = false}) => { const fetchAndUpdate = ({ store, credentials, older = false }) => {
const args = { credentials } const args = { credentials }
const rootState = store.rootState || store.state const rootState = store.rootState || store.state
const timelineData = rootState.statuses.notifications const timelineData = rootState.statuses.notifications
@ -45,7 +45,7 @@ const fetchNotifications = ({ store, args, older }) => {
.catch(() => store.dispatch('setNotificationsError', { value: true })) .catch(() => store.dispatch('setNotificationsError', { value: true }))
} }
const startFetching = ({credentials, store}) => { const startFetching = ({ credentials, store }) => {
fetchAndUpdate({ credentials, store }) fetchAndUpdate({ credentials, store })
const boundFetchAndUpdate = () => fetchAndUpdate({ credentials, store }) const boundFetchAndUpdate = () => fetchAndUpdate({ credentials, store })
// Initially there's set flag to silence all desktop notifications so // Initially there's set flag to silence all desktop notifications so

View File

@ -13,7 +13,7 @@ const postStatus = ({ store, status, spoilerText, visibility, sensitive, poll, m
mediaIds, mediaIds,
inReplyToStatusId, inReplyToStatusId,
contentType, contentType,
poll}) poll })
.then((data) => { .then((data) => {
if (!data.error) { if (!data.error) {
store.dispatch('addNewStatuses', { store.dispatch('addNewStatuses', {

View File

@ -239,12 +239,12 @@ const generateColors = (input) => {
}) })
const htmlColors = Object.entries(colors) const htmlColors = Object.entries(colors)
.reduce((acc, [k, v]) => { .reduce((acc, [k, v]) => {
if (!v) return acc if (!v) return acc
acc.solid[k] = rgb2hex(v) acc.solid[k] = rgb2hex(v)
acc.complete[k] = typeof v.a === 'undefined' ? rgb2hex(v) : rgb2rgba(v) acc.complete[k] = typeof v.a === 'undefined' ? rgb2hex(v) : rgb2rgba(v)
return acc return acc
}, { complete: {}, solid: {} }) }, { complete: {}, solid: {} })
return { return {
rules: { rules: {
colors: Object.entries(htmlColors.complete) colors: Object.entries(htmlColors.complete)

View File

@ -2,7 +2,7 @@ import { camelCase } from 'lodash'
import apiService from '../api/api.service.js' import apiService from '../api/api.service.js'
const update = ({store, statuses, timeline, showImmediately, userId}) => { const update = ({ store, statuses, timeline, showImmediately, userId }) => {
const ccTimeline = camelCase(timeline) const ccTimeline = camelCase(timeline)
store.dispatch('setError', { value: false }) store.dispatch('setError', { value: false })
@ -15,7 +15,7 @@ const update = ({store, statuses, timeline, showImmediately, userId}) => {
}) })
} }
const fetchAndUpdate = ({store, credentials, timeline = 'friends', older = false, showImmediately = false, userId = false, tag = false, until}) => { const fetchAndUpdate = ({ store, credentials, timeline = 'friends', older = false, showImmediately = false, userId = false, tag = false, until }) => {
const args = { timeline, credentials } const args = { timeline, credentials }
const rootState = store.rootState || store.state const rootState = store.rootState || store.state
const timelineData = rootState.statuses.timelines[camelCase(timeline)] const timelineData = rootState.statuses.timelines[camelCase(timeline)]
@ -40,17 +40,17 @@ const fetchAndUpdate = ({store, credentials, timeline = 'friends', older = false
if (!older && statuses.length >= 20 && !timelineData.loading && numStatusesBeforeFetch > 0) { if (!older && statuses.length >= 20 && !timelineData.loading && numStatusesBeforeFetch > 0) {
store.dispatch('queueFlush', { timeline: timeline, id: timelineData.maxId }) store.dispatch('queueFlush', { timeline: timeline, id: timelineData.maxId })
} }
update({store, statuses, timeline, showImmediately, userId}) update({ store, statuses, timeline, showImmediately, userId })
return statuses return statuses
}, () => store.dispatch('setError', { value: true })) }, () => store.dispatch('setError', { value: true }))
} }
const startFetching = ({timeline = 'friends', credentials, store, userId = false, tag = false}) => { const startFetching = ({ timeline = 'friends', credentials, store, userId = false, tag = false }) => {
const rootState = store.rootState || store.state const rootState = store.rootState || store.state
const timelineData = rootState.statuses.timelines[camelCase(timeline)] const timelineData = rootState.statuses.timelines[camelCase(timeline)]
const showImmediately = timelineData.visibleStatuses.length === 0 const showImmediately = timelineData.visibleStatuses.length === 0
timelineData.userId = userId timelineData.userId = userId
fetchAndUpdate({timeline, credentials, store, showImmediately, userId, tag}) fetchAndUpdate({ timeline, credentials, store, showImmediately, userId, tag })
const boundFetchAndUpdate = () => fetchAndUpdate({ timeline, credentials, store, userId, tag }) const boundFetchAndUpdate = () => fetchAndUpdate({ timeline, credentials, store, userId, tag })
return setInterval(boundFetchAndUpdate, 10000) return setInterval(boundFetchAndUpdate, 10000)
} }

View File

@ -1,7 +1,7 @@
import { hex2rgb } from '../color_convert/color_convert.js' import { hex2rgb } from '../color_convert/color_convert.js'
const highlightStyle = (prefs) => { const highlightStyle = (prefs) => {
if (prefs === undefined) return if (prefs === undefined) return
const {color, type} = prefs const { color, type } = prefs
if (typeof color !== 'string') return if (typeof color !== 'string') return
const rgb = hex2rgb(color) const rgb = hex2rgb(color)
if (rgb == null) return if (rgb == null) return

View File

@ -3,43 +3,43 @@ var config = require('../../config')
// http://nightwatchjs.org/guide#settings-file // http://nightwatchjs.org/guide#settings-file
module.exports = { module.exports = {
"src_folders": ["test/e2e/specs"], 'src_folders': ['test/e2e/specs'],
"output_folder": "test/e2e/reports", 'output_folder': 'test/e2e/reports',
"custom_assertions_path": ["test/e2e/custom-assertions"], 'custom_assertions_path': ['test/e2e/custom-assertions'],
"selenium": { 'selenium': {
"start_process": true, 'start_process': true,
"server_path": "node_modules/selenium-server/lib/runner/selenium-server-standalone-2.53.1.jar", 'server_path': 'node_modules/selenium-server/lib/runner/selenium-server-standalone-2.53.1.jar',
"host": "127.0.0.1", 'host': '127.0.0.1',
"port": 4444, 'port': 4444,
"cli_args": { 'cli_args': {
"webdriver.chrome.driver": require('chromedriver').path 'webdriver.chrome.driver': require('chromedriver').path
} }
}, },
"test_settings": { 'test_settings': {
"default": { 'default': {
"selenium_port": 4444, 'selenium_port': 4444,
"selenium_host": "localhost", 'selenium_host': 'localhost',
"silent": true, 'silent': true,
"globals": { 'globals': {
"devServerURL": "http://localhost:" + (process.env.PORT || config.dev.port) 'devServerURL': 'http://localhost:' + (process.env.PORT || config.dev.port)
} }
}, },
"chrome": { 'chrome': {
"desiredCapabilities": { 'desiredCapabilities': {
"browserName": "chrome", 'browserName': 'chrome',
"javascriptEnabled": true, 'javascriptEnabled': true,
"acceptSslCerts": true 'acceptSslCerts': true
} }
}, },
"firefox": { 'firefox': {
"desiredCapabilities": { 'desiredCapabilities': {
"browserName": "firefox", 'browserName': 'firefox',
"javascriptEnabled": true, 'javascriptEnabled': true,
"acceptSslCerts": true 'acceptSslCerts': true
} }
} }
} }

View File

@ -60,7 +60,7 @@ module.exports = function (config) {
'FirefoxHeadless': { 'FirefoxHeadless': {
base: 'Firefox', base: 'Firefox',
flags: [ flags: [
'-headless', '-headless'
] ]
} }
}, },

View File

@ -1,10 +1,10 @@
import { defaultState, mutations, prepareStatus } from '../../../../src/modules/statuses.js' import { defaultState, mutations, prepareStatus } from '../../../../src/modules/statuses.js'
// eslint-disable-next-line camelcase // eslint-disable-next-line camelcase
const makeMockStatus = ({id, text, type = 'status'}) => { const makeMockStatus = ({ id, text, type = 'status' }) => {
return { return {
id, id,
user: {id: '0'}, user: { id: '0' },
name: 'status', name: 'status',
text: text || `Text number ${id}`, text: text || `Text number ${id}`,
fave_num: 0, fave_num: 0,
@ -17,7 +17,7 @@ const makeMockStatus = ({id, text, type = 'status'}) => {
describe('Statuses module', () => { describe('Statuses module', () => {
describe('prepareStatus', () => { describe('prepareStatus', () => {
it('sets deleted flag to false', () => { it('sets deleted flag to false', () => {
const aStatus = makeMockStatus({id: '1', text: 'Hello oniichan'}) const aStatus = makeMockStatus({ id: '1', text: 'Hello oniichan' })
expect(prepareStatus(aStatus).deleted).to.eq(false) expect(prepareStatus(aStatus).deleted).to.eq(false)
}) })
}) })
@ -25,7 +25,7 @@ describe('Statuses module', () => {
describe('addNewStatuses', () => { describe('addNewStatuses', () => {
it('adds the status to allStatuses and to the given timeline', () => { it('adds the status to allStatuses and to the given timeline', () => {
const state = defaultState() const state = defaultState()
const status = makeMockStatus({id: '1'}) const status = makeMockStatus({ id: '1' })
mutations.addNewStatuses(state, { statuses: [status], timeline: 'public' }) mutations.addNewStatuses(state, { statuses: [status], timeline: 'public' })
@ -37,7 +37,7 @@ describe('Statuses module', () => {
it('counts the status as new if it has not been seen on this timeline', () => { it('counts the status as new if it has not been seen on this timeline', () => {
const state = defaultState() const state = defaultState()
const status = makeMockStatus({id: '1'}) const status = makeMockStatus({ id: '1' })
mutations.addNewStatuses(state, { statuses: [status], timeline: 'public' }) mutations.addNewStatuses(state, { statuses: [status], timeline: 'public' })
mutations.addNewStatuses(state, { statuses: [status], timeline: 'friends' }) mutations.addNewStatuses(state, { statuses: [status], timeline: 'friends' })
@ -55,7 +55,7 @@ describe('Statuses module', () => {
it('add the statuses to allStatuses if no timeline is given', () => { it('add the statuses to allStatuses if no timeline is given', () => {
const state = defaultState() const state = defaultState()
const status = makeMockStatus({id: '1'}) const status = makeMockStatus({ id: '1' })
mutations.addNewStatuses(state, { statuses: [status] }) mutations.addNewStatuses(state, { statuses: [status] })
@ -67,7 +67,7 @@ describe('Statuses module', () => {
it('adds the status to allStatuses and to the given timeline, directly visible', () => { it('adds the status to allStatuses and to the given timeline, directly visible', () => {
const state = defaultState() const state = defaultState()
const status = makeMockStatus({id: '1'}) const status = makeMockStatus({ id: '1' })
mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' }) mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
@ -79,10 +79,10 @@ describe('Statuses module', () => {
it('removes statuses by tag on deletion', () => { it('removes statuses by tag on deletion', () => {
const state = defaultState() const state = defaultState()
const status = makeMockStatus({id: '1'}) const status = makeMockStatus({ id: '1' })
const otherStatus = makeMockStatus({id: '3'}) const otherStatus = makeMockStatus({ id: '3' })
status.uri = 'xxx' status.uri = 'xxx'
const deletion = makeMockStatus({id: '2', type: 'deletion'}) const deletion = makeMockStatus({ id: '2', type: 'deletion' })
deletion.text = 'Dolus deleted notice {{tag:gs.smuglo.li,2016-11-18:noticeId=1038007:objectType=note}}.' deletion.text = 'Dolus deleted notice {{tag:gs.smuglo.li,2016-11-18:noticeId=1038007:objectType=note}}.'
deletion.uri = 'xxx' deletion.uri = 'xxx'
@ -97,8 +97,8 @@ describe('Statuses module', () => {
it('does not update the maxId when the noIdUpdate flag is set', () => { it('does not update the maxId when the noIdUpdate flag is set', () => {
const state = defaultState() const state = defaultState()
const status = makeMockStatus({id: '1'}) const status = makeMockStatus({ id: '1' })
const secondStatus = makeMockStatus({id: '2'}) const secondStatus = makeMockStatus({ id: '2' })
mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' }) mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
expect(state.timelines.public.maxId).to.eql('1') expect(state.timelines.public.maxId).to.eql('1')
@ -111,10 +111,10 @@ describe('Statuses module', () => {
it('keeps a descending by id order in timeline.visibleStatuses and timeline.statuses', () => { it('keeps a descending by id order in timeline.visibleStatuses and timeline.statuses', () => {
const state = defaultState() const state = defaultState()
const nonVisibleStatus = makeMockStatus({id: '1'}) const nonVisibleStatus = makeMockStatus({ id: '1' })
const status = makeMockStatus({id: '3'}) const status = makeMockStatus({ id: '3' })
const statusTwo = makeMockStatus({id: '2'}) const statusTwo = makeMockStatus({ id: '2' })
const statusThree = makeMockStatus({id: '4'}) const statusThree = makeMockStatus({ id: '4' })
mutations.addNewStatuses(state, { statuses: [nonVisibleStatus], showImmediately: false, timeline: 'public' }) mutations.addNewStatuses(state, { statuses: [nonVisibleStatus], showImmediately: false, timeline: 'public' })
@ -131,9 +131,9 @@ describe('Statuses module', () => {
it('splits retweets from their status and links them', () => { it('splits retweets from their status and links them', () => {
const state = defaultState() const state = defaultState()
const status = makeMockStatus({id: '1'}) const status = makeMockStatus({ id: '1' })
const retweet = makeMockStatus({id: '2', type: 'retweet'}) const retweet = makeMockStatus({ id: '2', type: 'retweet' })
const modStatus = makeMockStatus({id: '1', text: 'something else'}) const modStatus = makeMockStatus({ id: '1', text: 'something else' })
retweet.retweeted_status = status retweet.retweeted_status = status
@ -156,8 +156,8 @@ describe('Statuses module', () => {
it('replaces existing statuses with the same id', () => { it('replaces existing statuses with the same id', () => {
const state = defaultState() const state = defaultState()
const status = makeMockStatus({id: '1'}) const status = makeMockStatus({ id: '1' })
const modStatus = makeMockStatus({id: '1', text: 'something else'}) const modStatus = makeMockStatus({ id: '1', text: 'something else' })
// Add original status // Add original status
mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' }) mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
@ -173,9 +173,9 @@ describe('Statuses module', () => {
it('replaces existing statuses with the same id, coming from a retweet', () => { it('replaces existing statuses with the same id, coming from a retweet', () => {
const state = defaultState() const state = defaultState()
const status = makeMockStatus({id: '1'}) const status = makeMockStatus({ id: '1' })
const modStatus = makeMockStatus({id: '1', text: 'something else'}) const modStatus = makeMockStatus({ id: '1', text: 'something else' })
const retweet = makeMockStatus({id: '2', type: 'retweet'}) const retweet = makeMockStatus({ id: '2', type: 'retweet' })
retweet.retweeted_status = modStatus retweet.retweeted_status = modStatus
// Add original status // Add original status
@ -194,7 +194,7 @@ describe('Statuses module', () => {
it('handles favorite actions', () => { it('handles favorite actions', () => {
const state = defaultState() const state = defaultState()
const status = makeMockStatus({id: '1'}) const status = makeMockStatus({ id: '1' })
const favorite = { const favorite = {
id: '2', id: '2',
@ -272,14 +272,14 @@ describe('Statuses module', () => {
it('removes a notification when the notice gets removed', () => { it('removes a notification when the notice gets removed', () => {
const user = { id: '1' } const user = { id: '1' }
const state = defaultState() const state = defaultState()
const status = makeMockStatus({id: '1'}) const status = makeMockStatus({ id: '1' })
const otherStatus = makeMockStatus({id: '3'}) const otherStatus = makeMockStatus({ id: '3' })
const mentionedStatus = makeMockStatus({id: '2'}) const mentionedStatus = makeMockStatus({ id: '2' })
mentionedStatus.attentions = [user] mentionedStatus.attentions = [user]
mentionedStatus.uri = 'xxx' mentionedStatus.uri = 'xxx'
otherStatus.attentions = [user] otherStatus.attentions = [user]
const deletion = makeMockStatus({id: '4', type: 'deletion'}) const deletion = makeMockStatus({ id: '4', type: 'deletion' })
deletion.text = 'Dolus deleted notice {{tag:gs.smuglo.li,2016-11-18:noticeId=1038007:objectType=note}}.' deletion.text = 'Dolus deleted notice {{tag:gs.smuglo.li,2016-11-18:noticeId=1038007:objectType=note}}.'
deletion.uri = 'xxx' deletion.uri = 'xxx'

View File

@ -24,11 +24,11 @@ describe('The users module', () => {
const user = { id: '1', name: 'Guy' } const user = { id: '1', name: 'Guy' }
mutations.addNewUsers(state, [user]) mutations.addNewUsers(state, [user])
mutations.setMuted(state, {user, muted: true}) mutations.setMuted(state, { user, muted: true })
expect(user.muted).to.eql(true) expect(user.muted).to.eql(true)
mutations.setMuted(state, {user, muted: false}) mutations.setMuted(state, { user, muted: false })
expect(user.muted).to.eql(false) expect(user.muted).to.eql(false)
}) })

View File

@ -37,4 +37,4 @@ describe('DateUtils', () => {
expect(DateUtils.relativeTimeShort(time)).to.eql({ num: 2, key: 'time.years_short' }) expect(DateUtils.relativeTimeShort(time)).to.eql({ num: 2, key: 'time.years_short' })
}) })
}) })
}) })

View File

@ -206,15 +206,15 @@ describe('API Entities normalizer', () => {
}) })
it('sets nsfw for statuses with the #nsfw tag', () => { it('sets nsfw for statuses with the #nsfw tag', () => {
const safe = makeMockStatusQvitter({id: '1', text: 'Hello oniichan'}) const safe = makeMockStatusQvitter({ id: '1', text: 'Hello oniichan' })
const nsfw = makeMockStatusQvitter({id: '1', text: 'Hello oniichan #nsfw'}) const nsfw = makeMockStatusQvitter({ id: '1', text: 'Hello oniichan #nsfw' })
expect(parseStatus(safe).nsfw).to.eq(false) expect(parseStatus(safe).nsfw).to.eq(false)
expect(parseStatus(nsfw).nsfw).to.eq(true) expect(parseStatus(nsfw).nsfw).to.eq(true)
}) })
it('leaves existing nsfw settings alone', () => { it('leaves existing nsfw settings alone', () => {
const nsfw = makeMockStatusQvitter({id: '1', text: 'Hello oniichan #nsfw', nsfw: false}) const nsfw = makeMockStatusQvitter({ id: '1', text: 'Hello oniichan #nsfw', nsfw: false })
expect(parseStatus(nsfw).nsfw).to.eq(false) expect(parseStatus(nsfw).nsfw).to.eq(false)
}) })
@ -323,9 +323,9 @@ describe('API Entities normalizer', () => {
describe('MastoAPI emoji adder', () => { describe('MastoAPI emoji adder', () => {
const emojis = makeMockEmojiMasto() const emojis = makeMockEmojiMasto()
const imageHtml = '<img src="https://example.com/image.png" alt="image" title="image" class="emoji" />' const imageHtml = '<img src="https://example.com/image.png" alt="image" title="image" class="emoji" />'
.replace(/"/g, '\'') .replace(/"/g, '\'')
const thinkHtml = '<img src="https://example.com/think.png" alt="thinking" title="thinking" class="emoji" />' const thinkHtml = '<img src="https://example.com/think.png" alt="thinking" title="thinking" class="emoji" />'
.replace(/"/g, '\'') .replace(/"/g, '\'')
it('correctly replaces shortcodes in supplied string', () => { it('correctly replaces shortcodes in supplied string', () => {
const result = addEmojis('This post has :image: emoji and :thinking: emoji', emojis) const result = addEmojis('This post has :image: emoji and :thinking: emoji', emojis)

View File

@ -1,34 +1,34 @@
import fileSizeFormatService from '../../../../../src/services/file_size_format/file_size_format.js' import fileSizeFormatService from '../../../../../src/services/file_size_format/file_size_format.js'
describe('fileSizeFormat', () => { describe('fileSizeFormat', () => {
it('Formats file size', () => { it('Formats file size', () => {
const values = [1, 1024, 1048576, 1073741824, 1099511627776] const values = [1, 1024, 1048576, 1073741824, 1099511627776]
const expected = [ const expected = [
{ {
num: 1, num: 1,
unit: 'B' unit: 'B'
}, },
{ {
num: 1, num: 1,
unit: 'KiB' unit: 'KiB'
}, },
{ {
num: 1, num: 1,
unit: 'MiB' unit: 'MiB'
}, },
{ {
num: 1, num: 1,
unit: 'GiB' unit: 'GiB'
}, },
{ {
num: 1, num: 1,
unit: 'TiB' unit: 'TiB'
} }
] ]
var res = [] var res = []
for (var value in values) { for (var value in values) {
res.push(fileSizeFormatService.fileSizeFormat(values[value])) res.push(fileSizeFormatService.fileSizeFormat(values[value]))
} }
expect(res).to.eql(expected) expect(res).to.eql(expected)
}) })
}) })

View File

@ -1,7 +1,7 @@
const example = '<div class="status-content">@<a href="https://sealion.club/user/4" class="h-card mention" title="dewoo">dwmatiz</a> <a href="https://social.heldscal.la/file/3deb764ada10ce64a61b7a070b75dac45f86d2d5bf213bf18873da71d8714d86.png" title="https://social.heldscal.la/file/3deb764ada10ce64a61b7a070b75dac45f86d2d5bf213bf18873da71d8714d86.png" class="attachment" id="attachment-159853" rel="nofollow external">https://social.heldscal.la/attachment/159853</a></div>'
import { removeAttachmentLinks } from '../../../../../src/services/status_parser/status_parser.js' import { removeAttachmentLinks } from '../../../../../src/services/status_parser/status_parser.js'
const example = '<div class="status-content">@<a href="https://sealion.club/user/4" class="h-card mention" title="dewoo">dwmatiz</a> <a href="https://social.heldscal.la/file/3deb764ada10ce64a61b7a070b75dac45f86d2d5bf213bf18873da71d8714d86.png" title="https://social.heldscal.la/file/3deb764ada10ce64a61b7a070b75dac45f86d2d5bf213bf18873da71d8714d86.png" class="attachment" id="attachment-159853" rel="nofollow external">https://social.heldscal.la/attachment/159853</a></div>'
describe('statusParser.removeAttachmentLinks', () => { describe('statusParser.removeAttachmentLinks', () => {
const exampleWithoutAttachmentLinks = '<div class="status-content">@<a href="https://sealion.club/user/4" class="h-card mention" title="dewoo">dwmatiz</a> </div>' const exampleWithoutAttachmentLinks = '<div class="status-content">@<a href="https://sealion.club/user/4" class="h-card mention" title="dewoo">dwmatiz</a> </div>'