diff --git a/src/boot/routes.js b/src/boot/routes.js index 00ffda66..cb2534c1 100644 --- a/src/boot/routes.js +++ b/src/boot/routes.js @@ -2,6 +2,7 @@ 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 TagTimeline from 'components/tag_timeline/tag_timeline.vue' +import BubbleTimeline from 'components/bubble_timeline/bubble_timeline.vue' import BookmarkTimeline from 'components/bookmark_timeline/bookmark_timeline.vue' import ConversationPage from 'components/conversation-page/conversation-page.vue' import Interactions from 'components/interactions/interactions.vue' @@ -42,6 +43,7 @@ export default (store) => { }, { name: 'public-external-timeline', path: '/main/all', component: PublicAndExternalTimeline }, { name: 'public-timeline', path: '/main/public', component: PublicTimeline }, + { name: 'bubble-timeline', path: '/main/bubble', component: BubbleTimeline }, { name: 'friends', path: '/main/friends', component: FriendsTimeline, beforeEnter: validateAuthenticatedRoute }, { name: 'tag-timeline', path: '/tag/:tag', component: TagTimeline }, { name: 'bookmarks', path: '/bookmarks', component: BookmarkTimeline }, diff --git a/src/components/bubble_timeline/bubble_timeline.js b/src/components/bubble_timeline/bubble_timeline.js new file mode 100644 index 00000000..514f8a59 --- /dev/null +++ b/src/components/bubble_timeline/bubble_timeline.js @@ -0,0 +1,18 @@ +import Timeline from '../timeline/timeline.vue' +const PublicTimeline = { + components: { + Timeline + }, + computed: { + timeline () { return this.$store.state.statuses.timelines.bubble } + }, + created () { + this.$store.dispatch('startFetchingTimeline', { timeline: 'bubble' }) + }, + unmounted () { + this.$store.dispatch('stopFetchingTimeline', 'bubble') + } + +} + +export default PublicTimeline diff --git a/src/components/bubble_timeline/bubble_timeline.vue b/src/components/bubble_timeline/bubble_timeline.vue new file mode 100644 index 00000000..27e6ba32 --- /dev/null +++ b/src/components/bubble_timeline/bubble_timeline.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/components/timeline_menu/timeline_menu.js b/src/components/timeline_menu/timeline_menu.js index d152c0fe..a3cb968e 100644 --- a/src/components/timeline_menu/timeline_menu.js +++ b/src/components/timeline_menu/timeline_menu.js @@ -15,7 +15,8 @@ export const timelineNames = () => { 'bookmarks': 'nav.bookmarks', 'dms': 'nav.dms', 'public-timeline': 'nav.public_tl', - 'public-external-timeline': 'nav.twkn' + 'public-external-timeline': 'nav.twkn', + 'bubble-timeline': 'nav.bubble_timeline' } } diff --git a/src/components/timeline_menu/timeline_menu.vue b/src/components/timeline_menu/timeline_menu.vue index 61119482..5efe7db6 100644 --- a/src/components/timeline_menu/timeline_menu.vue +++ b/src/components/timeline_menu/timeline_menu.vue @@ -135,6 +135,7 @@ a { display: block; padding: 0.6em 0.65em; + padding-bottom: 0; &:hover { background-color: $fallback--lightBg; diff --git a/src/components/timeline_menu/timeline_menu_content.js b/src/components/timeline_menu/timeline_menu_content.js index 671570dd..9121a983 100644 --- a/src/components/timeline_menu/timeline_menu_content.js +++ b/src/components/timeline_menu/timeline_menu_content.js @@ -5,7 +5,8 @@ import { faGlobe, faBookmark, faEnvelope, - faHome + faHome, + faCircle } from '@fortawesome/free-solid-svg-icons' library.add( @@ -13,7 +14,8 @@ library.add( faGlobe, faBookmark, faEnvelope, - faHome + faHome, + faCircle ) const TimelineMenuContent = { diff --git a/src/components/timeline_menu/timeline_menu_content.vue b/src/components/timeline_menu/timeline_menu_content.vue index bed1b679..452afd88 100644 --- a/src/components/timeline_menu/timeline_menu_content.vue +++ b/src/components/timeline_menu/timeline_menu_content.vue @@ -11,6 +11,20 @@ icon="home" />{{ $t("nav.home_timeline") }} + {{ $t("nav.home_timeline_description") }} + +
  • + + {{ $t("nav.bubble_timeline") }} + + {{ $t("nav.bubble_timeline_description") }}
  • {{ $t("nav.public_tl") }} + {{ $t("nav.public_timeline_description") }}
  • {{ $t("nav.twkn") }} + {{ $t("nav.twkn_timeline_description") }}
  • + + diff --git a/src/i18n/en.json b/src/i18n/en.json index f3f99001..240843dc 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -158,9 +158,14 @@ "interactions": "Interactions", "dms": "Direct messages", "public_tl": "Public timeline", + "public_timeline_description": "Public posts from this instance", "timeline": "Timeline", "home_timeline": "Home timeline", + "home_timeline_description": "Posts from people you follow", + "bubble_timeline": "Bubble timeline", + "bubble_timeline_description": "Posts from instances close to yours, as recommended by the admin(s)", "twkn": "Known Network", + "twkn_timeline_description": "Posts from the entire network", "bookmarks": "Bookmarks", "user_search": "User Search", "search": "Search", diff --git a/src/i18n/ja_pedantic.json b/src/i18n/ja_pedantic.json index 00d8bffb..583be0ad 100644 --- a/src/i18n/ja_pedantic.json +++ b/src/i18n/ja_pedantic.json @@ -90,9 +90,13 @@ "interactions": "インタラクション", "dms": "ダイレクトメッセージ", "public_tl": "公開タイムライン", + "public_timeline_description": "このインスタンスからの公開投稿", "timeline": "タイムライン", "lists": "リスト", "twkn": "すべてのネットワーク", + "twkn_timeline_description": "全連合からの投稿", + "bubble_timeline": "バブルタイムライン", + "bubble_timeline_description": "管理者がおすすめしているインスタンスからの投稿", "user_search": "ユーザーを探す", "search": "検索", "who_to_follow": "おすすめユーザー", @@ -102,6 +106,7 @@ "timelines": "タイムライン", "chats": "チャット", "home_timeline": "ホームタイムライン", + "home_timeline_description": "フォローしているユーザーからの投稿", "announcements": "お知らせ" }, "notifications": { diff --git a/src/modules/statuses.js b/src/modules/statuses.js index c1aa2e73..56e48759 100644 --- a/src/modules/statuses.js +++ b/src/modules/statuses.js @@ -63,7 +63,8 @@ export const defaultState = () => ({ tag: emptyTl(), dms: emptyTl(), bookmarks: emptyTl(), - list: emptyTl() + list: emptyTl(), + bubble: emptyTl() } }) diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index 86fe2927..f0524e76 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -47,6 +47,7 @@ const MASTODON_DENY_USER_URL = id => `/api/v1/follow_requests/${id}/reject` const MASTODON_DIRECT_MESSAGES_TIMELINE_URL = '/api/v1/timelines/direct' const MASTODON_PUBLIC_TIMELINE = '/api/v1/timelines/public' const MASTODON_USER_HOME_TIMELINE_URL = '/api/v1/timelines/home' +const AKKOMA_BUBBLE_TIMELINE_URL = '/api/v1/timelines/bubble' const MASTODON_STATUS_URL = id => `/api/v1/statuses/${id}` const MASTODON_STATUS_CONTEXT_URL = id => `/api/v1/statuses/${id}/context` const MASTODON_USER_URL = id => `/api/v1/accounts/${id}?with_relationships=true` @@ -608,6 +609,7 @@ const fetchTimeline = ({ }) => { const timelineUrls = { public: MASTODON_PUBLIC_TIMELINE, + bubble: AKKOMA_BUBBLE_TIMELINE_URL, friends: MASTODON_USER_HOME_TIMELINE_URL, dms: MASTODON_DIRECT_MESSAGES_TIMELINE_URL, notifications: MASTODON_USER_NOTIFICATIONS_URL, @@ -1395,7 +1397,15 @@ export const ProcessedWS = ({ } socket.addEventListener('open', (wsEvent) => { console.debug(`[WS][${id}] Socket connected`, wsEvent) + setInterval(() => { + try { + socket.send('ping') + } catch (e) { + clearInterval(this) + } + }, 30000) }) + socket.addEventListener('error', (wsEvent) => { console.debug(`[WS][${id}] Socket errored`, wsEvent) })