From 88d960b9f6109c0c57958fb74d841dab9954ac33 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Mon, 31 Oct 2016 10:20:02 +0100 Subject: [PATCH 01/20] Make created_at_parsed reactive. --- src/modules/statuses.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/modules/statuses.js b/src/modules/statuses.js index eee368a3..c3692ae7 100644 --- a/src/modules/statuses.js +++ b/src/modules/statuses.js @@ -55,6 +55,9 @@ const addStatusesToTimeline = (addedStatuses, showImmediately, { statuses, visib // Add some html and nsfw to the statuses. each(addedStatuses, (status) => { const statusoid = status.retweeted_status || status + + statusoid.created_at_parsed = statusoid.created_at + if (statusoid.parsedText === undefined) { // statusoid.parsedText = statusParserService.parse(statusoid) statusoid.parsedText = statusoid.text From 2917f4ab44f36aaf765f5b1b54b67551b600af77 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sat, 5 Nov 2016 11:01:17 +0100 Subject: [PATCH 02/20] Fix background css (partly). --- src/App.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.scss b/src/App.scss index a15751aa..afd65172 100644 --- a/src/App.scss +++ b/src/App.scss @@ -2,7 +2,7 @@ $main-color: #f58d2c; $main-background: white; $darkened-background: whitesmoke; -body { +#app { background-color: $main-color; background-size: cover; background-attachment: fixed; From 15800bab576b1a1e1ef5eab61b6d0d16ea6dfd5e Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sun, 6 Nov 2016 17:43:31 +0100 Subject: [PATCH 03/20] Add mp4 to attachments. --- src/components/attachment/attachment.js | 4 ++-- src/components/attachment/attachment.vue | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/attachment/attachment.js b/src/components/attachment/attachment.js index 161c6b2b..85d924d0 100644 --- a/src/components/attachment/attachment.js +++ b/src/components/attachment/attachment.js @@ -19,8 +19,8 @@ const Attachment = { type = 'image'; } - if(this.attachment.mimetype.match(/video\/webm/)) { - type = 'webm'; + if(this.attachment.mimetype.match(/video\/(webm|mp4)/)) { + type = 'video'; }; return type diff --git a/src/components/attachment/attachment.vue b/src/components/attachment/attachment.vue index 7feab42c..09ca5fa9 100644 --- a/src/components/attachment/attachment.vue +++ b/src/components/attachment/attachment.vue @@ -6,7 +6,7 @@ - + Don't know how to display this... From 1a94217222de1b5f61a1b88bf633d752d45ccc1f Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sun, 6 Nov 2016 17:43:43 +0100 Subject: [PATCH 04/20] Fix app height. --- src/App.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/App.scss b/src/App.scss index afd65172..100187cf 100644 --- a/src/App.scss +++ b/src/App.scss @@ -8,6 +8,7 @@ $darkened-background: whitesmoke; background-attachment: fixed; background-repeat: no-repeat; background-position: 0 50px; + min-height: 100vh; } h4 { From e1103f04a44133fa5775b0be1fd5e2acce79daef Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sun, 6 Nov 2016 17:44:05 +0100 Subject: [PATCH 05/20] Add fetching of older statuses. --- src/components/timeline/timeline.js | 13 +++++++++++++ src/components/timeline/timeline.vue | 7 +++++++ src/modules/statuses.js | 17 ++++++++++++----- .../timeline_fetcher.service.js | 6 ++++-- 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/components/timeline/timeline.js b/src/components/timeline/timeline.js index 433bca11..113455f4 100644 --- a/src/components/timeline/timeline.js +++ b/src/components/timeline/timeline.js @@ -1,4 +1,5 @@ import Status from '../status/status.vue' +import timelineFetcher from '../../services/timeline_fetcher/timeline_fetcher.service.js' const Timeline = { props: [ @@ -11,6 +12,18 @@ const Timeline = { methods: { showNewStatuses () { this.$store.commit('showNewStatuses', { timeline: this.timelineName }) + }, + fetchOlderStatuses () { + const store = this.$store + const credentials = store.state.users.currentUser.credentials + store.commit('setLoading', { timeline: this.timelineName, value: true }); + timelineFetcher.fetchAndUpdate({ + store, + credentials, + timeline: this.timelineName, + older: true, + showImmediately: true + }).then(() => store.commit('setLoading', { timeline: this.timelineName, value: false })) } } } diff --git a/src/components/timeline/timeline.vue b/src/components/timeline/timeline.vue index 1e779638..2f1b8c28 100644 --- a/src/components/timeline/timeline.vue +++ b/src/components/timeline/timeline.vue @@ -8,6 +8,13 @@ + +
+

+ Load older statuses. +

+
+
diff --git a/src/modules/statuses.js b/src/modules/statuses.js index c3692ae7..5fb57a4f 100644 --- a/src/modules/statuses.js +++ b/src/modules/statuses.js @@ -12,7 +12,8 @@ const defaultState = { visibleStatuses: [], newStatusCount: 0, maxId: 0, - minVisibleId: 0 + minVisibleId: 0, + loading: false }, publicAndExternal: { statuses: [], @@ -20,7 +21,8 @@ const defaultState = { visibleStatuses: [], newStatusCount: 0, maxId: 0, - minVisibleId: 0 + minVisibleId: 0, + loading: false }, friends: { statuses: [], @@ -28,7 +30,8 @@ const defaultState = { visibleStatuses: [], newStatusCount: 0, maxId: 0, - minVisibleId: 0 + minVisibleId: 0, + loading: false } } } @@ -37,7 +40,7 @@ const statusType = (status) => { return !status.is_post_verb && status.uri.match(/fave/) ? 'fave' : 'status' } -const addStatusesToTimeline = (addedStatuses, showImmediately, { statuses, visibleStatuses, newStatusCount, faves }) => { +const addStatusesToTimeline = (addedStatuses, showImmediately, { statuses, visibleStatuses, newStatusCount, faves, loading }) => { const statusesAndFaves = groupBy(addedStatuses, statusType) const addedFaves = statusesAndFaves['fave'] || [] const unseenFaves = differenceBy(addedFaves, faves, 'id') @@ -92,7 +95,8 @@ const addStatusesToTimeline = (addedStatuses, showImmediately, { statuses, visib newStatusCount: newNewStatusCount, maxId: newStatuses[0].id, minVisibleId: (last(newVisibleStatuses) || { id: undefined }).id, - faves: unionBy(faves, addedFaves, 'id') + faves: unionBy(faves, addedFaves, 'id'), + loading } } @@ -138,6 +142,9 @@ const statuses = { const newStatus = find(state.allStatuses, status) newStatus.favorited = value }, + setLoading (state, { timeline, value }) { + state.timelines[timeline].loading = value + }, setNsfw (state, { id, nsfw }) { // For now, walk through all the statuses because the stuff might be in the replied_to_status // TODO: Save the replied_tos as references. diff --git a/src/services/timeline_fetcher/timeline_fetcher.service.js b/src/services/timeline_fetcher/timeline_fetcher.service.js index a3d9b9d1..8a39eeb5 100644 --- a/src/services/timeline_fetcher/timeline_fetcher.service.js +++ b/src/services/timeline_fetcher/timeline_fetcher.service.js @@ -16,7 +16,8 @@ const update = ({store, statuses, timeline, showImmediately}) => { const fetchAndUpdate = ({store, credentials, timeline = 'friends', older = false, showImmediately = false}) => { const args = { timeline, credentials } - const timelineData = store.rootState.statuses.timelines[camelCase(timeline)] + const rootState = store.rootState || store.state + const timelineData = rootState.statuses.timelines[camelCase(timeline)] if (older) { args['until'] = timelineData.minVisibleId @@ -24,7 +25,7 @@ const fetchAndUpdate = ({store, credentials, timeline = 'friends', older = false args['since'] = timelineData.maxId } - apiService.fetchTimeline(args) + return apiService.fetchTimeline(args) .then((statuses) => update({store, statuses, timeline, showImmediately})) } @@ -35,6 +36,7 @@ const startFetching = ({ timeline = 'friends', credentials, store }) => { setInterval(boundFetchAndUpdate, 10000) } const timelineFetcher = { + fetchAndUpdate, startFetching } From a5edcef24ddf7011dff77f76679df3fe06f42786 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sun, 6 Nov 2016 17:48:56 +0100 Subject: [PATCH 06/20] Remove temp data. --- src/services/timeline_fetcher/.#timeline_fetcher.service.js | 1 - 1 file changed, 1 deletion(-) delete mode 120000 src/services/timeline_fetcher/.#timeline_fetcher.service.js diff --git a/src/services/timeline_fetcher/.#timeline_fetcher.service.js b/src/services/timeline_fetcher/.#timeline_fetcher.service.js deleted file mode 120000 index 8315cdae..00000000 --- a/src/services/timeline_fetcher/.#timeline_fetcher.service.js +++ /dev/null @@ -1 +0,0 @@ -roger@yuuyuu.18961 \ No newline at end of file From dcb7fd14407f144f918eb65f191ecbab6844e1f7 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sun, 6 Nov 2016 19:28:02 +0100 Subject: [PATCH 07/20] Add upload image to icon font. --- static/font/config.json | 6 ++++++ static/font/css/fontello-codes.css | 1 + static/font/css/fontello-embedded.css | 13 +++++++------ static/font/css/fontello-ie7-codes.css | 1 + static/font/css/fontello-ie7.css | 1 + static/font/css/fontello.css | 15 ++++++++------- static/font/demo.html | 13 ++++++++----- static/font/font/fontello.eot | Bin 5876 -> 6168 bytes static/font/font/fontello.svg | 2 ++ static/font/font/fontello.ttf | Bin 5708 -> 6000 bytes static/font/font/fontello.woff | Bin 3336 -> 3548 bytes static/font/font/fontello.woff2 | Bin 2712 -> 2916 bytes 12 files changed, 34 insertions(+), 18 deletions(-) diff --git a/static/font/config.json b/static/font/config.json index 08d80924..f343ebdd 100644 --- a/static/font/config.json +++ b/static/font/config.json @@ -29,6 +29,12 @@ "css": "star-empty", "code": 59394, "src": "fontawesome" + }, + { + "uid": "eeec3208c90b7b48e804919d0d2d4a41", + "css": "upload", + "code": 59395, + "src": "fontawesome" } ] } \ No newline at end of file diff --git a/static/font/css/fontello-codes.css b/static/font/css/fontello-codes.css index 092af2b5..4ac31b40 100644 --- a/static/font/css/fontello-codes.css +++ b/static/font/css/fontello-codes.css @@ -2,4 +2,5 @@ .icon-retweet:before { content: '\e800'; } /* '' */ .icon-star:before { content: '\e801'; } /* '' */ .icon-star-empty:before { content: '\e802'; } /* '' */ +.icon-upload:before { content: '\e803'; } /* '' */ .icon-reply:before { content: '\f112'; } /* '' */ \ No newline at end of file diff --git a/static/font/css/fontello-embedded.css b/static/font/css/fontello-embedded.css index f1fb8f97..366bfd75 100644 --- a/static/font/css/fontello-embedded.css +++ b/static/font/css/fontello-embedded.css @@ -1,15 +1,15 @@ @font-face { font-family: 'fontello'; - src: url('../font/fontello.eot?79259046'); - src: url('../font/fontello.eot?79259046#iefix') format('embedded-opentype'), - url('../font/fontello.svg?79259046#fontello') format('svg'); + src: url('../font/fontello.eot?34503250'); + src: url('../font/fontello.eot?34503250#iefix') format('embedded-opentype'), + url('../font/fontello.svg?34503250#fontello') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'fontello'; - src: url('data:application/octet-stream;base64,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') format('woff'), - url('data:application/octet-stream;base64,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KyNhOC2wOSywABawAyWwAiVHI0cjYbAAVFguIDwjIRuwAiWwAiVHI0cjYSCwBSWwBCVHI0cjYbAGJbAFJUmwAiVhuQgACABjYyMgWGIbIVljuAQAYiCwAFBYsEBgWWawAWNgIy4jICA8ijgjIVktsDossAAWILAIQyAuRyNHI2EgYLAgYGawAmIgsABQWLBAYFlmsAFjIyAgPIo4LbA7LCMgLkawAiVGUlggPFkusSsBFCstsDwsIyAuRrACJUZQWCA8WS6xKwEUKy2wPSwjIC5GsAIlRlJYIDxZIyAuRrACJUZQWCA8WS6xKwEUKy2wPiywNSsjIC5GsAIlRlJYIDxZLrErARQrLbA/LLA2K4ogIDywBCNCijgjIC5GsAIlRlJYIDxZLrErARQrsARDLrArKy2wQCywABawBCWwBCYgLkcjRyNhsAlDKyMgPCAuIzixKwEUKy2wQSyxCAQlQrAAFrAEJbAEJSAuRyNHI2EgsAQjQrAJQysgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjIEewBEOwAmIgsABQWLBAYFlmsAFjYCCwASsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsAJiILAAUFiwQGBZZrABY2GwAiVGYTgjIDwjOBshICBGI0ewASsjYTghWbErARQrLbBCLLA1Ky6xKwEUKy2wQyywNishIyAgPLAEI0IjOLErARQrsARDLrArKy2wRCywABUgR7AAI0KyAAEBFRQTLrAxKi2wRSywABUgR7AAI0KyAAEBFRQTLrAxKi2wRiyxAAEUE7AyKi2wRyywNCotsEgssAAWRSMgLiBGiiNhOLErARQrLbBJLLAII0KwSCstsEossgAAQSstsEsssgABQSstsEwssgEAQSstsE0ssgEBQSstsE4ssgAAQistsE8ssgABQistsFAssgEAQistsFEssgEBQistsFIssgAAPistsFMssgABPistsFQssgEAPistsFUssgEBPistsFYssgAAQCstsFcssgABQCstsFgssgEAQCstsFkssgEBQCstsFossgAAQystsFsssgABQystsFwssgEAQystsF0ssgEBQystsF4ssgAAPystsF8ssgABPystsGAssgEAPystsGEssgEBPystsGIssDcrLrErARQrLbBjLLA3K7A7Ky2wZCywNyuwPCstsGUssAAWsDcrsD0rLbBmLLA4Ky6xKwEUKy2wZyywOCuwOystsGgssDgrsDwrLbBpLLA4K7A9Ky2waiywOSsusSsBFCstsGsssDkrsDsrLbBsLLA5K7A8Ky2wbSywOSuwPSstsG4ssDorLrErARQrLbBvLLA6K7A7Ky2wcCywOiuwPCstsHEssDorsD0rLbByLLMJBAIDRVghGyMhWUIrsAhlsAMkUHiwARUwLQBLuADIUlixAQGOWbABuQgACABjcLEABUKyAAEAKrEABUKzCgIBCCqxAAVCsw4AAQgqsQAGQroCwAABAAkqsQAHQroAQAABAAkqsQMARLEkAYhRWLBAiFixA2REsSYBiFFYugiAAAEEQIhjVFixAwBEWVlZWbMMAgEMKrgB/4WwBI2xAgBEAAA=') format('truetype'); + src: url('data:application/octet-stream;base64,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') format('woff'), + url('data:application/octet-stream;base64,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') format('truetype'); } /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ @@ -17,7 +17,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; - src: url('../font/fontello.svg?79259046#fontello') format('svg'); + src: url('../font/fontello.svg?34503250#fontello') format('svg'); } } */ @@ -55,4 +55,5 @@ .icon-retweet:before { content: '\e800'; } /* '' */ .icon-star:before { content: '\e801'; } /* '' */ .icon-star-empty:before { content: '\e802'; } /* '' */ +.icon-upload:before { content: '\e803'; } /* '' */ .icon-reply:before { content: '\f112'; } /* '' */ \ No newline at end of file diff --git a/static/font/css/fontello-ie7-codes.css b/static/font/css/fontello-ie7-codes.css index ca8259c0..6ed70fc1 100644 --- a/static/font/css/fontello-ie7-codes.css +++ b/static/font/css/fontello-ie7-codes.css @@ -2,4 +2,5 @@ .icon-retweet { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-star { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-star-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-upload { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-reply { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file diff --git a/static/font/css/fontello-ie7.css b/static/font/css/fontello-ie7.css index 2276576a..1d01d5d8 100644 --- a/static/font/css/fontello-ie7.css +++ b/static/font/css/fontello-ie7.css @@ -13,4 +13,5 @@ .icon-retweet { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-star { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-star-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-upload { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-reply { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file diff --git a/static/font/css/fontello.css b/static/font/css/fontello.css index f2e62ee0..5ed6c95a 100644 --- a/static/font/css/fontello.css +++ b/static/font/css/fontello.css @@ -1,11 +1,11 @@ @font-face { font-family: 'fontello'; - src: url('../font/fontello.eot?1876128'); - src: url('../font/fontello.eot?1876128#iefix') format('embedded-opentype'), - url('../font/fontello.woff2?1876128') format('woff2'), - url('../font/fontello.woff?1876128') format('woff'), - url('../font/fontello.ttf?1876128') format('truetype'), - url('../font/fontello.svg?1876128#fontello') format('svg'); + src: url('../font/fontello.eot?70483588'); + src: url('../font/fontello.eot?70483588#iefix') format('embedded-opentype'), + url('../font/fontello.woff2?70483588') format('woff2'), + url('../font/fontello.woff?70483588') format('woff'), + url('../font/fontello.ttf?70483588') format('truetype'), + url('../font/fontello.svg?70483588#fontello') format('svg'); font-weight: normal; font-style: normal; } @@ -15,7 +15,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; - src: url('../font/fontello.svg?1876128#fontello') format('svg'); + src: url('../font/fontello.svg?70483588#fontello') format('svg'); } } */ @@ -58,4 +58,5 @@ .icon-retweet:before { content: '\e800'; } /* '' */ .icon-star:before { content: '\e801'; } /* '' */ .icon-star-empty:before { content: '\e802'; } /* '' */ +.icon-upload:before { content: '\e803'; } /* '' */ .icon-reply:before { content: '\f112'; } /* '' */ \ No newline at end of file diff --git a/static/font/demo.html b/static/font/demo.html index 219c4511..f2411ea1 100644 --- a/static/font/demo.html +++ b/static/font/demo.html @@ -229,11 +229,11 @@ body { } @font-face { font-family: 'fontello'; - src: url('./font/fontello.eot?51751583'); - src: url('./font/fontello.eot?51751583#iefix') format('embedded-opentype'), - url('./font/fontello.woff?51751583') format('woff'), - url('./font/fontello.ttf?51751583') format('truetype'), - url('./font/fontello.svg?51751583#fontello') format('svg'); + src: url('./font/fontello.eot?93026246'); + src: url('./font/fontello.eot?93026246#iefix') format('embedded-opentype'), + url('./font/fontello.woff?93026246') format('woff'), + url('./font/fontello.ttf?93026246') format('truetype'), + url('./font/fontello.svg?93026246#fontello') format('svg'); font-weight: normal; font-style: normal; } @@ -304,6 +304,9 @@ body {
icon-retweet0xe800
icon-star0xe801
icon-star-empty0xe802
+
icon-upload0xe803
+ +
icon-reply0xf112
diff --git a/static/font/font/fontello.eot b/static/font/font/fontello.eot index 5bcdc8dd012399902bd2f133a60d0f3121e08f8c..7991537f62cd89267a83f79b4c47cf1ae597e91b 100644 GIT binary patch delta 792 zcmYjPUr19?82`R=?#|ur=G3*$Zld$%)D+EP>Xm4fVcCmNM3@m&!|AlP?k%nKMPDkY zh$VxFAhNffLK#U!57A?Pz=w+Jr67{|A_Vq_A*}CCgbsXve!t)MeH^}XR=3~VDRdpc z4$TNtv6`2cX1Z@pUjV=(0MI{}j@#cyf1e}#m~3wF^0*;B6cqsP0O`iColM`HxpRW> z1eu+TkJ-dmQ10}*lc~w!z0aOb0dT5UT1STB3Ge4o4M4q0x;a9GdW}CM{DN@(NP2ui ze(k3e)NkbUlr{o*sJppgK&r34pz`t+DYd&!^e| zG^f7bzBpw6*xy3KWj;HLCvh>mhRMSTKvDrt0WW2(6zNi!00pAN3yKIV&wmDrMSwi4 zM^cb9Unw%`QNTr%$jvi`6(t^^k5uQlvafif%yVidqf#2OZs5wT@<}#LRB@g^;%(rD zN@#{|=g4E)6&q<=x1RxyEfwHpona(Yuwh^VTRhnxErHpSNn8Sa?ygMsS!sbw-3!|ElTz} z7!ESMO1~X60!&uxy@p(S6AGgtSA1q9Q)iZ~NMpgHXM*LK@*rkHn<@)hSSti-{E`KX zfKuh#NN(h$VMuaV+tgGW#-p-89nxQDRjEfSR6_QwSg2lFZnjRB$9{pA=bi1nKNz^b z5wkJ1t4BDzvV(ro?0;6OrMm0z5o7q0Ny?q46>z}WI2{H-sE0Aij_01Je^{A7MjKSn bg#y*=oVKM*T(VPEJmI3hlA6pdYW2Q<;|rb? delta 488 zcmXv~O(>*c9REGf`!T~aB44GXIZQ5ygE&wq7iC*TYO|%+7&C`?*PEGST(&)Mz`=M^ zE~GtdP7dbaA_}dNb+TLJpl#J0TrhG`hRQ z>F&j^vw#=?FdVimr}g0CANdyRdw4n-G=JxHptzNOaKee&3+d%gVVbGQC_|jDl}Y+aTxu2*vE=Ohwl)TbO5@D&v!3OB~7= z`3-r%wq_jsRafM9l(j6Uow#^+!O_HT@6HRK&UMY1jj*j@?Z$ zA}-w*5$zj;pbLD4R_Gdu#eCoxbhJ=6i2^b!@5}RfAdCM`8tCQ0-jJw72nlwBnN$C>RECg36S^>j>7J_^pTVccQ^@30DDVoiTyAOr diff --git a/static/font/font/fontello.svg b/static/font/font/fontello.svg index e159fbb3..4a83af4b 100644 --- a/static/font/font/fontello.svg +++ b/static/font/font/fontello.svg @@ -12,6 +12,8 @@ + + diff --git a/static/font/font/fontello.ttf b/static/font/font/fontello.ttf index 9693b3713fa4e9840b4529b6753f3464223e3f82..8d3c5da43ee045015d3bacbc7d311f55d0adefd0 100644 GIT binary patch delta 797 zcmYjPL1+^}6#X-^JDY4`Vq%b?`yBEI7!M~d*&2UWmjFED=xdW!Hh+C-@g(v&3@d9CEY!DR?aaHf zx#HyhCy(a=81_qvsf>~Ke4JJRl*{PrQz$4`*j?n$khf3e?K$yz3`Ku^(t+JoNdL5t&8;A};&)YzXGZM%s@p6FH z${Kb19S2~fkpbj#GwT#ph6^yT8P{wC$dwURqzfq3AF=za2V4+`KiH__Wh^1oDWXGOxP?cM|J9;~PG(zLP<3DIzK_(n(zQqd9~ z*2LdeO%bArHLo5kMfELfLR)r+OCf*BA0nluZGoB^QES0gpP)f4C^dUGi)$63X#x{z zi^tm{kv8^@1A2-=~5)rksM{?HUB6mL)>GT}r4WhP_KW-_)^ eu#FkjNxL$6%P#VZR?aliGCrVOu@YC?z5f9CRiEkr delta 505 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 Date: Sun, 6 Nov 2016 19:28:37 +0100 Subject: [PATCH 08/20] Add MediaUpload component. --- src/components/media_upload/media_upload.js | 22 ++++++++++++++++++++ src/components/media_upload/media_upload.vue | 17 +++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 src/components/media_upload/media_upload.js create mode 100644 src/components/media_upload/media_upload.vue diff --git a/src/components/media_upload/media_upload.js b/src/components/media_upload/media_upload.js new file mode 100644 index 00000000..c24c71e9 --- /dev/null +++ b/src/components/media_upload/media_upload.js @@ -0,0 +1,22 @@ +/* eslint-env browser */ +import statusPosterService from '../../services/status_poster/status_poster.service.js' + +const mediaUpload = { + mounted () { + const store = this.$store + const input = this.$el.querySelector('input') + const self = this + + input.addEventListener('change', ({target}) => { + const file = target.files[0]; + const formData = new FormData(); + formData.append('media', file); + statusPosterService.uploadMedia({ store, formData }) + .then((fileData) => { + self.$emit('uploaded', fileData) + }) + }) + } +} + +export default mediaUpload diff --git a/src/components/media_upload/media_upload.vue b/src/components/media_upload/media_upload.vue new file mode 100644 index 00000000..a62d8316 --- /dev/null +++ b/src/components/media_upload/media_upload.vue @@ -0,0 +1,17 @@ + + + + + From 86749f759d6b2f75871242ba1edcd53e6d8ab14c Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sun, 6 Nov 2016 19:28:48 +0100 Subject: [PATCH 09/20] Remove superfluous css. --- src/App.scss | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/App.scss b/src/App.scss index 100187cf..a4d87308 100644 --- a/src/App.scss +++ b/src/App.scss @@ -304,11 +304,6 @@ attention { display: flex; padding: 0.5em; - media-upload { - font-size: 26px; - flex: 1; - } - button { flex: 2; } From f86f0ef7f02ff68cfa2cd80ac38b0073314399b6 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sun, 6 Nov 2016 19:29:41 +0100 Subject: [PATCH 10/20] Add media upload to API Service. --- src/services/api/api.service.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index df7b4190..c9fcc4f6 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -6,8 +6,8 @@ const PUBLIC_AND_EXTERNAL_TIMELINE_URL = '/api/statuses/public_and_external_time const FAVORITE_URL = '/api/favorites/create' const UNFAVORITE_URL = '/api/favorites/destroy' const STATUS_UPDATE_URL = '/api/statuses/update.json' +const MEDIA_UPLOAD_URL = '/api/statusnet/media/upload' // const CONVERSATION_URL = '/api/statusnet/conversation/'; -// const MEDIA_UPLOAD_URL = '/api/statusnet/media/upload'; // const FORM_CONTENT_TYPE = {'Content-Type': 'application/x-www-form-urlencoded'}; @@ -75,12 +75,23 @@ const postStatus = ({credentials, status, mediaIds, inReplyToStatusId}) => { }) } +const uploadMedia = ({formData, credentials}) => { + return fetch(MEDIA_UPLOAD_URL, { + body: formData, + method: 'POST', + headers: authHeaders(credentials) + }) + .then((response) => response.text()) + .then((text) => (new DOMParser()).parseFromString(text, 'application/xml')) +} + const apiService = { verifyCredentials, fetchTimeline, favorite, unfavorite, - postStatus + postStatus, + uploadMedia } export default apiService From 7e2e2d3ec3e7eb79674777c63f0d89e6d55fbbd0 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sun, 6 Nov 2016 19:30:20 +0100 Subject: [PATCH 11/20] Add media upload to StatusPosterService. --- .../status_poster/status_poster.service.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/services/status_poster/status_poster.service.js b/src/services/status_poster/status_poster.service.js index 1a96b5f6..2a324541 100644 --- a/src/services/status_poster/status_poster.service.js +++ b/src/services/status_poster/status_poster.service.js @@ -12,8 +12,21 @@ const postStatus = ({ store, status, media = [], inReplyToStatusId = undefined } }) } +const uploadMedia = ({ store, formData }) => { + const credentials = store.state.users.currentUser.credentials + + return apiService.uploadMedia({ credentials, formData }).then((xml) => { + return { + id: xml.getElementsByTagName('media_id')[0].textContent, + url: xml.getElementsByTagName('media_url')[0].textContent, + image: xml.getElementsByTagName('atom:link')[0].getAttribute('href') + } + }) +} + const statusPosterService = { - postStatus + postStatus, + uploadMedia } export default statusPosterService From e21a60096c397f949848db0de4699eb41a7623de Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sun, 6 Nov 2016 19:30:35 +0100 Subject: [PATCH 12/20] Add media upload to PostStatusForm. --- .../post_status_form/post_status_form.js | 17 +++++++++++++++-- .../post_status_form/post_status_form.vue | 2 +- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js index 2c015154..30a7cd40 100644 --- a/src/components/post_status_form/post_status_form.js +++ b/src/components/post_status_form/post_status_form.js @@ -1,4 +1,6 @@ import statusPoster from '../../services/status_poster/status_poster.service.js' +import MediaUpload from '../media_upload/media_upload.vue' + import { reject, map, uniqBy } from 'lodash'; const buildMentionsString = ({user, attentions}, currentUser) => { @@ -23,6 +25,9 @@ const PostStatusForm = { 'repliedUser', 'attentions' ], + components: { + MediaUpload + }, data () { let statusText = '' @@ -33,7 +38,8 @@ const PostStatusForm = { return { newStatus: { - status: statusText + status: statusText, + files: [] } } }, @@ -41,11 +47,18 @@ const PostStatusForm = { postStatus (newStatus) { statusPoster.postStatus({ status: newStatus.status, + media: newStatus.files, store: this.$store, inReplyToStatusId: this.replyTo }) - this.newStatus = { } + this.newStatus = { + status: '', + files: [] + } this.$emit('posted') + }, + addMediaFile (fileInfo) { + this.newStatus.files.push(fileInfo) } } } diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue index d2106d5a..943bf422 100644 --- a/src/components/post_status_form/post_status_form.vue +++ b/src/components/post_status_form/post_status_form.vue @@ -10,7 +10,7 @@
- +
From 521c81525147798e7de93f90c7fe1b312564fbe6 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sun, 6 Nov 2016 20:10:20 +0100 Subject: [PATCH 13/20] Add NavPanel. --- src/components/nav_panel/nav_panel.js | 4 ++ src/components/nav_panel/nav_panel.vue | 54 ++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 src/components/nav_panel/nav_panel.js create mode 100644 src/components/nav_panel/nav_panel.vue diff --git a/src/components/nav_panel/nav_panel.js b/src/components/nav_panel/nav_panel.js new file mode 100644 index 00000000..318d30cc --- /dev/null +++ b/src/components/nav_panel/nav_panel.js @@ -0,0 +1,4 @@ +const NavPanel = { +} + +export default NavPanel diff --git a/src/components/nav_panel/nav_panel.vue b/src/components/nav_panel/nav_panel.vue new file mode 100644 index 00000000..b535b092 --- /dev/null +++ b/src/components/nav_panel/nav_panel.vue @@ -0,0 +1,54 @@ + + + + + From 7c2018108d8de90c17b09e980484495a1e90cc12 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sun, 6 Nov 2016 20:10:33 +0100 Subject: [PATCH 14/20] Remove fake public statuses. --- src/main.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main.js b/src/main.js index 6ce2ca1b..f95d286f 100644 --- a/src/main.js +++ b/src/main.js @@ -34,9 +34,3 @@ new Vue({ template: '', components: { App } }) - -const statusesEx = require('../test/fixtures/statuses.json') - -setTimeout(() => { - store.commit('addNewStatuses', { statuses: statusesEx, timeline: 'public', showImmediately: false }) -}, 3000) From 3bb2e91dbf740e77b25bc5256abfd7307a2bd04b Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sun, 6 Nov 2016 20:10:45 +0100 Subject: [PATCH 15/20] Return empty auth header when we don't have a user. --- src/services/api/api.service.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index c9fcc4f6..9538517d 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -14,7 +14,13 @@ const MEDIA_UPLOAD_URL = '/api/statusnet/media/upload' // import { param, ajax } from 'jquery'; // import { merge } from 'lodash'; -const authHeaders = (user) => ({ 'Authorization': `Basic ${btoa(`${user.username}:${user.password}`)}` }) +const authHeaders = (user) => { + if (user) { + return { 'Authorization': `Basic ${btoa(`${user.username}:${user.password}`)}` } + } else { + return { } + } +} const fetchTimeline = ({timeline, credentials, since = false, until = false}) => { const timelineUrls = { From c9e235f8898c4f1c4c1c2d5111ad34b1dd4ffa10 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sun, 6 Nov 2016 20:11:00 +0100 Subject: [PATCH 16/20] Load timeline once on creation. --- src/components/timeline/timeline.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/components/timeline/timeline.js b/src/components/timeline/timeline.js index 113455f4..e0c75d76 100644 --- a/src/components/timeline/timeline.js +++ b/src/components/timeline/timeline.js @@ -9,6 +9,17 @@ const Timeline = { components: { Status }, + created () { + const store = this.$store + const credentials = store.state.users.currentUser.credentials + + timelineFetcher.fetchAndUpdate({ + store, + credentials, + timeline: this.timelineName, + showImmediately: true + }) + }, methods: { showNewStatuses () { this.$store.commit('showNewStatuses', { timeline: this.timelineName }) From 1ae5223742415d69d3b6ec9fd46d04c85d8f787b Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sun, 6 Nov 2016 20:11:23 +0100 Subject: [PATCH 17/20] Add NavPanel to app. --- src/App.js | 4 +++- src/App.scss | 21 --------------------- 2 files changed, 3 insertions(+), 22 deletions(-) diff --git a/src/App.js b/src/App.js index 3c677566..c3e5164a 100644 --- a/src/App.js +++ b/src/App.js @@ -1,9 +1,11 @@ import UserPanel from './components/user_panel/user_panel.vue' +import NavPanel from './components/nav_panel/nav_panel.vue' export default { name: 'app', components: { - UserPanel + UserPanel, + NavPanel }, computed: { user () { return this.$store.state.users.currentUser || {} }, diff --git a/src/App.scss b/src/App.scss index a4d87308..32e4a3eb 100644 --- a/src/App.scss +++ b/src/App.scss @@ -222,27 +222,6 @@ status.ng-enter.ng-enter-active { cursor: pointer; } -nav-panel ul { - list-style: none; - margin: 0; - padding: 0; -} - -nav-panel li { - border-bottom: 1px solid silver; - padding: 0.5em; - padding-left: 1em; -} - -nav-panel li:last-child { - border: none; -} - -nav-panel a { - display: block; - width: 100%; -} - .status-el p { margin: 0; margin-top: 0.2em; From b6ac99fdf07a58efe331c82905c513ca7ceb75e1 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sun, 6 Nov 2016 20:26:07 +0100 Subject: [PATCH 18/20] Use history routing. --- config/index.js | 5 ----- index.html | 2 +- src/main.js | 5 ++++- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/config/index.js b/config/index.js index fdfac8b2..6652048c 100644 --- a/config/index.js +++ b/config/index.js @@ -26,11 +26,6 @@ module.exports = { target: 'https://social.heldscal.la/', changeOrigin: true, cookieDomainRewrite: 'localhost' - }, - '/main': { - target: 'https://social.heldscal.la/', - changeOrigin: true, - cookieDomainRewrite: 'localhost' } }, // CSS Sourcemaps off by default because relative paths are "buggy" diff --git a/index.html b/index.html index 713fe27c..93d9d6fd 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ Pleroma - +
diff --git a/src/main.js b/src/main.js index f95d286f..7f917128 100644 --- a/src/main.js +++ b/src/main.js @@ -24,7 +24,10 @@ const routes = [ { path: '/main/friends', component: FriendsTimeline } ] -const router = new VueRouter({routes}) +const router = new VueRouter({ + mode: 'history', + routes +}) /* eslint-disable no-new */ new Vue({ From 7fcd36e2c19c29ce36086a85e59cc297d3474841 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sun, 6 Nov 2016 20:45:26 +0100 Subject: [PATCH 19/20] Don't show actions when not logged in. --- src/components/status/status.js | 3 +++ src/components/status/status.vue | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/status/status.js b/src/components/status/status.js index 2e6565e8..6253d334 100644 --- a/src/components/status/status.js +++ b/src/components/status/status.js @@ -16,6 +16,9 @@ const Status = { } else { return this.statusoid } + }, + loggedIn () { + return !!this.$store.state.users.currentUser } }, components: { diff --git a/src/components/status/status.vue b/src/components/status/status.vue index 8361aa52..1c5dc458 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -32,7 +32,7 @@ -
+
diff --git a/src/components/public_and_external_timeline/public_and_external_timeline.js b/src/components/public_and_external_timeline/public_and_external_timeline.js new file mode 100644 index 00000000..138118ad --- /dev/null +++ b/src/components/public_and_external_timeline/public_and_external_timeline.js @@ -0,0 +1,11 @@ +import Timeline from '../timeline/timeline.vue' +const PublicAndExternalTimeline = { + components: { + Timeline + }, + computed: { + timeline () { return this.$store.state.statuses.timelines.publicAndExternal } + } +} + +export default PublicAndExternalTimeline diff --git a/src/components/public_and_external_timeline/public_and_external_timeline.vue b/src/components/public_and_external_timeline/public_and_external_timeline.vue new file mode 100644 index 00000000..94cdaf17 --- /dev/null +++ b/src/components/public_and_external_timeline/public_and_external_timeline.vue @@ -0,0 +1,10 @@ + + + diff --git a/src/main.js b/src/main.js index 7f917128..de3b2af1 100644 --- a/src/main.js +++ b/src/main.js @@ -3,6 +3,7 @@ import VueRouter from 'vue-router' import Vuex from 'vuex' import App from './App.vue' import PublicTimeline from './components/public_timeline/public_timeline.vue' +import PublicAndExternalTimeline from './components/public_and_external_timeline/public_and_external_timeline.vue' import FriendsTimeline from './components/friends_timeline/friends_timeline.vue' import statusesModule from './modules/statuses.js' @@ -19,7 +20,8 @@ const store = new Vuex.Store({ }) const routes = [ - { path: '/', redirect: '/main/public' }, + { path: '/', redirect: '/main/all' }, + { path: '/main/all', component: PublicAndExternalTimeline }, { path: '/main/public', component: PublicTimeline }, { path: '/main/friends', component: FriendsTimeline } ] diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index 9538517d..06585ac7 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -26,7 +26,7 @@ const fetchTimeline = ({timeline, credentials, since = false, until = false}) => const timelineUrls = { public: PUBLIC_TIMELINE_URL, friends: FRIENDS_TIMELINE_URL, - 'public-and-external': PUBLIC_AND_EXTERNAL_TIMELINE_URL + 'publicAndExternal': PUBLIC_AND_EXTERNAL_TIMELINE_URL } let url = timelineUrls[timeline]