aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/components/post_status_form/post_status_form.js3
-rw-r--r--src/components/post_status_form/post_status_form.vue1
-rw-r--r--src/components/user_card/user_card.vue12
-rw-r--r--src/i18n/cs.json15
-rw-r--r--src/modules/statuses.js1
-rw-r--r--test/unit/specs/modules/statuses.spec.js418
6 files changed, 244 insertions, 206 deletions
diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js
index 23a2c7e2..1f0df35a 100644
--- a/src/components/post_status_form/post_status_form.js
+++ b/src/components/post_status_form/post_status_form.js
@@ -222,6 +222,9 @@ const PostStatusForm = {
this.highlighted = 0
}
},
+ onKeydown (e) {
+ e.stopPropagation()
+ },
setCaret ({target: {selectionStart}}) {
this.caret = selectionStart
},
diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue
index 0ddde4ea..3d1df91b 100644
--- a/src/components/post_status_form/post_status_form.vue
+++ b/src/components/post_status_form/post_status_form.vue
@@ -20,6 +20,7 @@
ref="textarea"
@click="setCaret"
@keyup="setCaret" v-model="newStatus.status" :placeholder="$t('post_status.default')" rows="1" class="form-control"
+ @keydown="onKeydown"
@keydown.down="cycleForward"
@keydown.up="cycleBackward"
@keydown.shift.tab="cycleBackward"
diff --git a/src/components/user_card/user_card.vue b/src/components/user_card/user_card.vue
index cc2ce6b8..002cb48f 100644
--- a/src/components/user_card/user_card.vue
+++ b/src/components/user_card/user_card.vue
@@ -159,6 +159,18 @@
&-bio {
text-align: center;
+
+ img {
+ object-fit: contain;
+ vertical-align: middle;
+ max-width: 100%;
+ max-height: 400px;
+
+ .emoji {
+ width: 32px;
+ height: 32px;
+ }
+ }
}
// Modifiers
diff --git a/src/i18n/cs.json b/src/i18n/cs.json
index 6326032c..51e9d342 100644
--- a/src/i18n/cs.json
+++ b/src/i18n/cs.json
@@ -71,7 +71,9 @@
"account_not_locked_warning_link": "uzamčen",
"attachments_sensitive": "Označovat přílohy jako citlivé",
"content_type": {
- "plain_text": "Prostý text"
+ "plain_text": "Prostý text",
+ "text/html": "HTML",
+ "text/markdown": "Markdown"
},
"content_warning": "Předmět (volitelný)",
"default": "Právě jsem přistál v L.A.",
@@ -95,7 +97,7 @@
"new_captcha": "Kliknutím na obrázek získáte novou CAPTCHA",
"username_placeholder": "např. lain",
"fullname_placeholder": "např. Lain Iwakura",
- "bio_placeholder": "např.\nNazdar, jsem Lain\nJsem anime dívka a žiji v příměstském Japonsku. Možná mě znáte z Wired.",
+ "bio_placeholder": "např.\nNazdar, jsem Lain\nJsem anime dívka žijící v příměstském Japonsku. Možná mě znáte z Wired.",
"validations": {
"username_required": "nemůže být prázdné",
"fullname_required": "nemůže být prázdné",
@@ -204,7 +206,7 @@
"radii_help": "Nastavit zakulacení rohů rozhraní (v pixelech)",
"replies_in_timeline": "Odpovědi v časové ose",
"reply_link_preview": "Povolit náhledy odkazu pro odpověď při přejetí myši",
- "reply_visibility_all": "Zobrazit všechny odpovědiShow all replies",
+ "reply_visibility_all": "Zobrazit všechny odpovědi",
"reply_visibility_following": "Zobrazit pouze odpovědi směřované na mě nebo uživatele, které sleduji",
"reply_visibility_self": "Zobrazit pouze odpovědi směřované na mě",
"saving_err": "Chyba při ukládání nastavení",
@@ -221,7 +223,6 @@
"subject_line_mastodon": "Jako u Mastodonu: zkopírovat tak, jak je",
"subject_line_noop": "Nekopírovat",
"post_status_content_type": "Publikovat typ obsahu příspěvku",
- "status_content_type_plain": "Prostý text",
"stop_gifs": "Přehrávat GIFy při přejetí myši",
"streaming": "Povolit automatické streamování nových příspěvků při rolování nahoru",
"text": "Text",
@@ -339,7 +340,7 @@
"button": "Tlačítko",
"text": "Spousta dalšího {0} a {1}",
"mono": "obsahu",
- "input": "Just landed in L.A.",
+ "input": "Právě jsem přistál v L.A.",
"faint_link": "pomocný manuál",
"fine_print": "Přečtěte si náš {0} a nenaučte se nic užitečného!",
"header_faint": "Tohle je v pohodě",
@@ -361,7 +362,7 @@
"no_statuses": "Žádné příspěvky"
},
"status": {
- "reply_to": "Odpovědět uživateli",
+ "reply_to": "Odpověď uživateli",
"replies_list": "Odpovědi:"
},
@@ -413,7 +414,7 @@
"upload":{
"error": {
"base": "Nahrávání selhalo.",
- "file_too_big": "Soubor je úříliš velký [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]",
+ "file_too_big": "Soubor je příliš velký [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]",
"default": "Zkuste to znovu později"
},
"file_size_units": {
diff --git a/src/modules/statuses.js b/src/modules/statuses.js
index 7571b62a..6b512fa3 100644
--- a/src/modules/statuses.js
+++ b/src/modules/statuses.js
@@ -333,6 +333,7 @@ export const mutations = {
oldTimeline.newStatusCount = 0
oldTimeline.visibleStatuses = slice(oldTimeline.statuses, 0, 50)
oldTimeline.minVisibleId = last(oldTimeline.visibleStatuses).id
+ oldTimeline.minId = oldTimeline.minVisibleId
oldTimeline.visibleStatusesObject = {}
each(oldTimeline.visibleStatuses, (status) => { oldTimeline.visibleStatusesObject[status.id] = status })
},
diff --git a/test/unit/specs/modules/statuses.spec.js b/test/unit/specs/modules/statuses.spec.js
index 864b798d..0bbcb25a 100644
--- a/test/unit/specs/modules/statuses.spec.js
+++ b/test/unit/specs/modules/statuses.spec.js
@@ -14,238 +14,258 @@ const makeMockStatus = ({id, text, type = 'status'}) => {
}
}
-describe('Statuses.prepareStatus', () => {
- it('sets deleted flag to false', () => {
- const aStatus = makeMockStatus({id: '1', text: 'Hello oniichan'})
- expect(prepareStatus(aStatus).deleted).to.eq(false)
+describe('Statuses module', () => {
+ describe('prepareStatus', () => {
+ it('sets deleted flag to false', () => {
+ const aStatus = makeMockStatus({id: '1', text: 'Hello oniichan'})
+ expect(prepareStatus(aStatus).deleted).to.eq(false)
+ })
})
-})
-describe('The Statuses module', () => {
- it('adds the status to allStatuses and to the given timeline', () => {
- const state = defaultState()
- const status = makeMockStatus({id: '1'})
+ describe('addNewStatuses', () => {
+ it('adds the status to allStatuses and to the given timeline', () => {
+ const state = defaultState()
+ const status = makeMockStatus({id: '1'})
- mutations.addNewStatuses(state, { statuses: [status], timeline: 'public' })
+ mutations.addNewStatuses(state, { statuses: [status], timeline: 'public' })
- expect(state.allStatuses).to.eql([status])
- expect(state.timelines.public.statuses).to.eql([status])
- expect(state.timelines.public.visibleStatuses).to.eql([])
- expect(state.timelines.public.newStatusCount).to.equal(1)
- })
+ expect(state.allStatuses).to.eql([status])
+ expect(state.timelines.public.statuses).to.eql([status])
+ expect(state.timelines.public.visibleStatuses).to.eql([])
+ expect(state.timelines.public.newStatusCount).to.equal(1)
+ })
- it('counts the status as new if it has not been seen on this timeline', () => {
- const state = defaultState()
- const status = makeMockStatus({id: '1'})
+ it('counts the status as new if it has not been seen on this timeline', () => {
+ const state = defaultState()
+ const status = makeMockStatus({id: '1'})
- mutations.addNewStatuses(state, { statuses: [status], timeline: 'public' })
- mutations.addNewStatuses(state, { statuses: [status], timeline: 'friends' })
+ mutations.addNewStatuses(state, { statuses: [status], timeline: 'public' })
+ mutations.addNewStatuses(state, { statuses: [status], timeline: 'friends' })
- expect(state.allStatuses).to.eql([status])
- expect(state.timelines.public.statuses).to.eql([status])
- expect(state.timelines.public.visibleStatuses).to.eql([])
- expect(state.timelines.public.newStatusCount).to.equal(1)
+ expect(state.allStatuses).to.eql([status])
+ expect(state.timelines.public.statuses).to.eql([status])
+ expect(state.timelines.public.visibleStatuses).to.eql([])
+ expect(state.timelines.public.newStatusCount).to.equal(1)
- expect(state.allStatuses).to.eql([status])
- expect(state.timelines.friends.statuses).to.eql([status])
- expect(state.timelines.friends.visibleStatuses).to.eql([])
- expect(state.timelines.friends.newStatusCount).to.equal(1)
- })
+ expect(state.allStatuses).to.eql([status])
+ expect(state.timelines.friends.statuses).to.eql([status])
+ expect(state.timelines.friends.visibleStatuses).to.eql([])
+ expect(state.timelines.friends.newStatusCount).to.equal(1)
+ })
- it('add the statuses to allStatuses if no timeline is given', () => {
- const state = defaultState()
- const status = makeMockStatus({id: '1'})
+ it('add the statuses to allStatuses if no timeline is given', () => {
+ const state = defaultState()
+ const status = makeMockStatus({id: '1'})
- mutations.addNewStatuses(state, { statuses: [status] })
+ mutations.addNewStatuses(state, { statuses: [status] })
- expect(state.allStatuses).to.eql([status])
- expect(state.timelines.public.statuses).to.eql([])
- expect(state.timelines.public.visibleStatuses).to.eql([])
- expect(state.timelines.public.newStatusCount).to.equal(0)
- })
+ expect(state.allStatuses).to.eql([status])
+ expect(state.timelines.public.statuses).to.eql([])
+ expect(state.timelines.public.visibleStatuses).to.eql([])
+ expect(state.timelines.public.newStatusCount).to.equal(0)
+ })
- it('adds the status to allStatuses and to the given timeline, directly visible', () => {
- const state = defaultState()
- const status = makeMockStatus({id: '1'})
+ it('adds the status to allStatuses and to the given timeline, directly visible', () => {
+ const state = defaultState()
+ const status = makeMockStatus({id: '1'})
- mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
+ mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
- expect(state.allStatuses).to.eql([status])
- expect(state.timelines.public.statuses).to.eql([status])
- expect(state.timelines.public.visibleStatuses).to.eql([status])
- expect(state.timelines.public.newStatusCount).to.equal(0)
- })
+ expect(state.allStatuses).to.eql([status])
+ expect(state.timelines.public.statuses).to.eql([status])
+ expect(state.timelines.public.visibleStatuses).to.eql([status])
+ expect(state.timelines.public.newStatusCount).to.equal(0)
+ })
- it('removes statuses by tag on deletion', () => {
- const state = defaultState()
- const status = makeMockStatus({id: '1'})
- const otherStatus = makeMockStatus({id: '3'})
- status.uri = 'xxx'
- const deletion = makeMockStatus({id: '2', type: 'deletion'})
- deletion.text = 'Dolus deleted notice {{tag:gs.smuglo.li,2016-11-18:noticeId=1038007:objectType=note}}.'
- deletion.uri = 'xxx'
-
- mutations.addNewStatuses(state, { statuses: [status, otherStatus], showImmediately: true, timeline: 'public' })
- mutations.addNewStatuses(state, { statuses: [deletion], showImmediately: true, timeline: 'public' })
-
- expect(state.allStatuses).to.eql([otherStatus])
- expect(state.timelines.public.statuses).to.eql([otherStatus])
- expect(state.timelines.public.visibleStatuses).to.eql([otherStatus])
- expect(state.timelines.public.maxId).to.eql('3')
- })
+ it('removes statuses by tag on deletion', () => {
+ const state = defaultState()
+ const status = makeMockStatus({id: '1'})
+ const otherStatus = makeMockStatus({id: '3'})
+ status.uri = 'xxx'
+ const deletion = makeMockStatus({id: '2', type: 'deletion'})
+ deletion.text = 'Dolus deleted notice {{tag:gs.smuglo.li,2016-11-18:noticeId=1038007:objectType=note}}.'
+ deletion.uri = 'xxx'
- it('does not update the maxId when the noIdUpdate flag is set', () => {
- const state = defaultState()
- const status = makeMockStatus({id: '1'})
- const secondStatus = makeMockStatus({id: '2'})
+ mutations.addNewStatuses(state, { statuses: [status, otherStatus], showImmediately: true, timeline: 'public' })
+ mutations.addNewStatuses(state, { statuses: [deletion], showImmediately: true, timeline: 'public' })
- mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
- expect(state.timelines.public.maxId).to.eql('1')
+ expect(state.allStatuses).to.eql([otherStatus])
+ expect(state.timelines.public.statuses).to.eql([otherStatus])
+ expect(state.timelines.public.visibleStatuses).to.eql([otherStatus])
+ expect(state.timelines.public.maxId).to.eql('3')
+ })
- mutations.addNewStatuses(state, { statuses: [secondStatus], showImmediately: true, timeline: 'public', noIdUpdate: true })
- expect(state.timelines.public.statuses).to.eql([secondStatus, status])
- expect(state.timelines.public.visibleStatuses).to.eql([secondStatus, status])
- expect(state.timelines.public.maxId).to.eql('1')
- })
+ it('does not update the maxId when the noIdUpdate flag is set', () => {
+ const state = defaultState()
+ const status = makeMockStatus({id: '1'})
+ const secondStatus = makeMockStatus({id: '2'})
- it('keeps a descending by id order in timeline.visibleStatuses and timeline.statuses', () => {
- const state = defaultState()
- const nonVisibleStatus = makeMockStatus({id: '1'})
- const status = makeMockStatus({id: '3'})
- const statusTwo = makeMockStatus({id: '2'})
- const statusThree = makeMockStatus({id: '4'})
+ mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
+ expect(state.timelines.public.maxId).to.eql('1')
- mutations.addNewStatuses(state, { statuses: [nonVisibleStatus], showImmediately: false, timeline: 'public' })
+ mutations.addNewStatuses(state, { statuses: [secondStatus], showImmediately: true, timeline: 'public', noIdUpdate: true })
+ expect(state.timelines.public.statuses).to.eql([secondStatus, status])
+ expect(state.timelines.public.visibleStatuses).to.eql([secondStatus, status])
+ expect(state.timelines.public.maxId).to.eql('1')
+ })
- mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
- mutations.addNewStatuses(state, { statuses: [statusTwo], showImmediately: true, timeline: 'public' })
+ it('keeps a descending by id order in timeline.visibleStatuses and timeline.statuses', () => {
+ const state = defaultState()
+ const nonVisibleStatus = makeMockStatus({id: '1'})
+ const status = makeMockStatus({id: '3'})
+ const statusTwo = makeMockStatus({id: '2'})
+ const statusThree = makeMockStatus({id: '4'})
- expect(state.timelines.public.minVisibleId).to.equal('2')
+ mutations.addNewStatuses(state, { statuses: [nonVisibleStatus], showImmediately: false, timeline: 'public' })
- mutations.addNewStatuses(state, { statuses: [statusThree], showImmediately: true, timeline: 'public' })
+ mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
+ mutations.addNewStatuses(state, { statuses: [statusTwo], showImmediately: true, timeline: 'public' })
- expect(state.timelines.public.statuses).to.eql([statusThree, status, statusTwo, nonVisibleStatus])
- expect(state.timelines.public.visibleStatuses).to.eql([statusThree, status, statusTwo])
- })
+ expect(state.timelines.public.minVisibleId).to.equal('2')
- it('splits retweets from their status and links them', () => {
- const state = defaultState()
- const status = makeMockStatus({id: '1'})
- const retweet = makeMockStatus({id: '2', type: 'retweet'})
- const modStatus = makeMockStatus({id: '1', text: 'something else'})
-
- retweet.retweeted_status = status
-
- // It adds both statuses, but only the retweet to visible.
- mutations.addNewStatuses(state, { statuses: [retweet], timeline: 'public', showImmediately: true })
- expect(state.timelines.public.visibleStatuses).to.have.length(1)
- expect(state.timelines.public.statuses).to.have.length(1)
- expect(state.allStatuses).to.have.length(2)
- expect(state.allStatuses[0].id).to.equal('1')
- expect(state.allStatuses[1].id).to.equal('2')
-
- // It refers to the modified status.
- mutations.addNewStatuses(state, { statuses: [modStatus], timeline: 'public' })
- expect(state.allStatuses).to.have.length(2)
- expect(state.allStatuses[0].id).to.equal('1')
- expect(state.allStatuses[0].text).to.equal(modStatus.text)
- expect(state.allStatuses[1].id).to.equal('2')
- expect(retweet.retweeted_status.text).to.eql(modStatus.text)
- })
+ mutations.addNewStatuses(state, { statuses: [statusThree], showImmediately: true, timeline: 'public' })
- it('replaces existing statuses with the same id', () => {
- const state = defaultState()
- const status = makeMockStatus({id: '1'})
- const modStatus = makeMockStatus({id: '1', text: 'something else'})
-
- // Add original status
- mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
- expect(state.timelines.public.visibleStatuses).to.have.length(1)
- expect(state.allStatuses).to.have.length(1)
-
- // Add new version of status
- mutations.addNewStatuses(state, { statuses: [modStatus], showImmediately: true, timeline: 'public' })
- expect(state.timelines.public.visibleStatuses).to.have.length(1)
- expect(state.allStatuses).to.have.length(1)
- expect(state.allStatuses[0].text).to.eql(modStatus.text)
- })
+ expect(state.timelines.public.statuses).to.eql([statusThree, status, statusTwo, nonVisibleStatus])
+ expect(state.timelines.public.visibleStatuses).to.eql([statusThree, status, statusTwo])
+ })
- it('replaces existing statuses with the same id, coming from a retweet', () => {
- const state = defaultState()
- const status = makeMockStatus({id: '1'})
- const modStatus = makeMockStatus({id: '1', text: 'something else'})
- const retweet = makeMockStatus({id: '2', type: 'retweet'})
- retweet.retweeted_status = modStatus
-
- // Add original status
- mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
- expect(state.timelines.public.visibleStatuses).to.have.length(1)
- expect(state.allStatuses).to.have.length(1)
-
- // Add new version of status
- mutations.addNewStatuses(state, { statuses: [retweet], showImmediately: false, timeline: 'public' })
- expect(state.timelines.public.visibleStatuses).to.have.length(1)
- // Don't add the retweet itself if the tweet is visible
- expect(state.timelines.public.statuses).to.have.length(1)
- expect(state.allStatuses).to.have.length(2)
- expect(state.allStatuses[0].text).to.eql(modStatus.text)
+ it('splits retweets from their status and links them', () => {
+ const state = defaultState()
+ const status = makeMockStatus({id: '1'})
+ const retweet = makeMockStatus({id: '2', type: 'retweet'})
+ const modStatus = makeMockStatus({id: '1', text: 'something else'})
+
+ retweet.retweeted_status = status
+
+ // It adds both statuses, but only the retweet to visible.
+ mutations.addNewStatuses(state, { statuses: [retweet], timeline: 'public', showImmediately: true })
+ expect(state.timelines.public.visibleStatuses).to.have.length(1)
+ expect(state.timelines.public.statuses).to.have.length(1)
+ expect(state.allStatuses).to.have.length(2)
+ expect(state.allStatuses[0].id).to.equal('1')
+ expect(state.allStatuses[1].id).to.equal('2')
+
+ // It refers to the modified status.
+ mutations.addNewStatuses(state, { statuses: [modStatus], timeline: 'public' })
+ expect(state.allStatuses).to.have.length(2)
+ expect(state.allStatuses[0].id).to.equal('1')
+ expect(state.allStatuses[0].text).to.equal(modStatus.text)
+ expect(state.allStatuses[1].id).to.equal('2')
+ expect(retweet.retweeted_status.text).to.eql(modStatus.text)
+ })
+
+ it('replaces existing statuses with the same id', () => {
+ const state = defaultState()
+ const status = makeMockStatus({id: '1'})
+ const modStatus = makeMockStatus({id: '1', text: 'something else'})
+
+ // Add original status
+ mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
+ expect(state.timelines.public.visibleStatuses).to.have.length(1)
+ expect(state.allStatuses).to.have.length(1)
+
+ // Add new version of status
+ mutations.addNewStatuses(state, { statuses: [modStatus], showImmediately: true, timeline: 'public' })
+ expect(state.timelines.public.visibleStatuses).to.have.length(1)
+ expect(state.allStatuses).to.have.length(1)
+ expect(state.allStatuses[0].text).to.eql(modStatus.text)
+ })
+
+ it('replaces existing statuses with the same id, coming from a retweet', () => {
+ const state = defaultState()
+ const status = makeMockStatus({id: '1'})
+ const modStatus = makeMockStatus({id: '1', text: 'something else'})
+ const retweet = makeMockStatus({id: '2', type: 'retweet'})
+ retweet.retweeted_status = modStatus
+
+ // Add original status
+ mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
+ expect(state.timelines.public.visibleStatuses).to.have.length(1)
+ expect(state.allStatuses).to.have.length(1)
+
+ // Add new version of status
+ mutations.addNewStatuses(state, { statuses: [retweet], showImmediately: false, timeline: 'public' })
+ expect(state.timelines.public.visibleStatuses).to.have.length(1)
+ // Don't add the retweet itself if the tweet is visible
+ expect(state.timelines.public.statuses).to.have.length(1)
+ expect(state.allStatuses).to.have.length(2)
+ expect(state.allStatuses[0].text).to.eql(modStatus.text)
+ })
+
+ it('handles favorite actions', () => {
+ const state = defaultState()
+ const status = makeMockStatus({id: '1'})
+
+ const favorite = {
+ id: '2',
+ type: 'favorite',
+ in_reply_to_status_id: '1', // The API uses strings here...
+ uri: 'tag:shitposter.club,2016-08-21:fave:3895:note:773501:2016-08-21T16:52:15+00:00',
+ text: 'a favorited something by b',
+ user: { id: '99' }
+ }
+
+ mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
+ mutations.addNewStatuses(state, { statuses: [favorite], showImmediately: true, timeline: 'public' })
+
+ expect(state.timelines.public.visibleStatuses.length).to.eql(1)
+ expect(state.timelines.public.visibleStatuses[0].fave_num).to.eql(1)
+ expect(state.timelines.public.maxId).to.eq(favorite.id)
+
+ // Adding it again does nothing
+ mutations.addNewStatuses(state, { statuses: [favorite], showImmediately: true, timeline: 'public' })
+
+ expect(state.timelines.public.visibleStatuses.length).to.eql(1)
+ expect(state.timelines.public.visibleStatuses[0].fave_num).to.eql(1)
+ expect(state.timelines.public.maxId).to.eq(favorite.id)
+
+ // If something is favorited by the current user, it also sets the 'favorited' property but does not increment counter to avoid over-counting. Counter is incremented (updated, really) via response to the favorite request.
+ const user = {
+ id: '1'
+ }
+
+ const ownFavorite = {
+ id: '3',
+ type: 'favorite',
+ in_reply_to_status_id: '1', // The API uses strings here...
+ uri: 'tag:shitposter.club,2016-08-21:fave:3895:note:773501:2016-08-21T16:52:15+00:00',
+ text: 'a favorited something by b',
+ user
+ }
+
+ mutations.addNewStatuses(state, { statuses: [ownFavorite], showImmediately: true, timeline: 'public', user })
+
+ expect(state.timelines.public.visibleStatuses.length).to.eql(1)
+ expect(state.timelines.public.visibleStatuses[0].fave_num).to.eql(1)
+ expect(state.timelines.public.visibleStatuses[0].favorited).to.eql(true)
+ })
})
- it('handles favorite actions', () => {
- const state = defaultState()
- const status = makeMockStatus({id: '1'})
-
- const favorite = {
- id: '2',
- type: 'favorite',
- in_reply_to_status_id: '1', // The API uses strings here...
- uri: 'tag:shitposter.club,2016-08-21:fave:3895:note:773501:2016-08-21T16:52:15+00:00',
- text: 'a favorited something by b',
- user: { id: '99' }
- }
-
- mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
- mutations.addNewStatuses(state, { statuses: [favorite], showImmediately: true, timeline: 'public' })
-
- expect(state.timelines.public.visibleStatuses.length).to.eql(1)
- expect(state.timelines.public.visibleStatuses[0].fave_num).to.eql(1)
- expect(state.timelines.public.maxId).to.eq(favorite.id)
-
- // Adding it again does nothing
- mutations.addNewStatuses(state, { statuses: [favorite], showImmediately: true, timeline: 'public' })
-
- expect(state.timelines.public.visibleStatuses.length).to.eql(1)
- expect(state.timelines.public.visibleStatuses[0].fave_num).to.eql(1)
- expect(state.timelines.public.maxId).to.eq(favorite.id)
-
- // If something is favorited by the current user, it also sets the 'favorited' property but does not increment counter to avoid over-counting. Counter is incremented (updated, really) via response to the favorite request.
- const user = {
- id: '1'
- }
-
- const ownFavorite = {
- id: '3',
- type: 'favorite',
- in_reply_to_status_id: '1', // The API uses strings here...
- uri: 'tag:shitposter.club,2016-08-21:fave:3895:note:773501:2016-08-21T16:52:15+00:00',
- text: 'a favorited something by b',
- user
- }
-
- mutations.addNewStatuses(state, { statuses: [ownFavorite], showImmediately: true, timeline: 'public', user })
-
- expect(state.timelines.public.visibleStatuses.length).to.eql(1)
- expect(state.timelines.public.visibleStatuses[0].fave_num).to.eql(1)
- expect(state.timelines.public.visibleStatuses[0].favorited).to.eql(true)
+ describe('showNewStatuses', () => {
+ it('resets the minId to the min of the visible statuses when adding new to visible statuses', () => {
+ const state = defaultState()
+ const status = makeMockStatus({ id: '10' })
+ mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
+ const newStatus = makeMockStatus({ id: '20' })
+ mutations.addNewStatuses(state, { statuses: [newStatus], showImmediately: false, timeline: 'public' })
+ state.timelines.public.minId = '5'
+ mutations.showNewStatuses(state, { timeline: 'public' })
+
+ expect(state.timelines.public.visibleStatuses.length).to.eql(2)
+ expect(state.timelines.public.minVisibleId).to.eql('10')
+ expect(state.timelines.public.minId).to.eql('10')
+ })
})
- it('keeps userId when clearing user timeline', () => {
- const state = defaultState()
- state.timelines.user.userId = 123
+ describe('clearTimeline', () => {
+ it('keeps userId when clearing user timeline', () => {
+ const state = defaultState()
+ state.timelines.user.userId = 123
- mutations.clearTimeline(state, { timeline: 'user' })
+ mutations.clearTimeline(state, { timeline: 'user' })
- expect(state.timelines.user.userId).to.eql(123)
+ expect(state.timelines.user.userId).to.eql(123)
+ })
})
describe('notifications', () => {