From a75f3fb87c2fdd6d0eb66af4c2ce9939a29c180d Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 26 Sep 2021 02:10:07 +0900 Subject: refactor: fix types --- src/client/scripts/autocomplete.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/client/scripts') diff --git a/src/client/scripts/autocomplete.ts b/src/client/scripts/autocomplete.ts index 924d6a62ee..c4bcc4b724 100644 --- a/src/client/scripts/autocomplete.ts +++ b/src/client/scripts/autocomplete.ts @@ -7,9 +7,9 @@ export class Autocomplete { private suggestion: { x: Ref; y: Ref; - q: Ref; + q: Ref; close: Function; - }; + } | null; private textarea: any; private vm: any; private currentType: string; @@ -122,7 +122,7 @@ export class Autocomplete { /** * サジェストを提示します。 */ - private async open(type: string, q: string) { + private async open(type: string, q: string | null) { if (type != this.currentType) { this.close(); } -- cgit v1.2.3-freya From a70dbb7e74356caed2fe03bec05c4e8d5bde4316 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 26 Sep 2021 02:55:11 +0900 Subject: feat(client): MFM関数構文のサジェストを実装 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + src/client/components/autocomplete.vue | 47 +++++++++++++++++++++------------- src/client/scripts/autocomplete.ts | 29 ++++++++++++++++++++- 3 files changed, 58 insertions(+), 19 deletions(-) (limited to 'src/client/scripts') diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a5f497ddb..9bbc09860e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ ### Improvements - クライアント: アニメーションを減らす設定をメニューのアニメーションにも適用するように +- クライアント: MFM関数構文のサジェストを実装 - ActivityPub: HTML -> MFMの変換を強化 ### Bugfixes diff --git a/src/client/components/autocomplete.vue b/src/client/components/autocomplete.vue index 065ee6de2e..e2c1af3356 100644 --- a/src/client/components/autocomplete.vue +++ b/src/client/components/autocomplete.vue @@ -10,12 +10,12 @@
  • {{ $ts.selectUser }}
  • -
      +
      1. {{ hashtag }}
      -
        +
        1. @@ -24,6 +24,11 @@ ({{ emoji.aliasOf }})
        +
          +
        1. + {{ tag }} +
        2. +
        @@ -106,6 +111,8 @@ emojiDefinitions.sort((a, b) => a.name.length - b.name.length); const emojiDb = markRaw(emojiDefinitions.concat(emjdb)); //#endregion +const MFM_TAGS = ['tada', 'jelly', 'twitch', 'shake', 'spin', 'jump', 'bounce', 'flip', 'x2', 'x3', 'x4', 'font', 'blur', 'rainbow', 'sparkle']; + export default defineComponent({ props: { type: { @@ -137,11 +144,6 @@ export default defineComponent({ type: Number, required: true, }, - - showing: { - type: Boolean, - required: true - }, }, emits: ['done', 'closed'], @@ -154,18 +156,11 @@ export default defineComponent({ hashtags: [], emojis: [], items: [], + mfmTags: [], select: -1, } }, - watch: { - showing() { - if (!this.showing) { - this.$emit('closed'); - } - } - }, - updated() { this.setPosition(); this.items = (this.$refs.suggests as Element | undefined)?.children || []; @@ -236,7 +231,9 @@ export default defineComponent({ } } - if (this.type == 'user') { + console.log(this.type); + + if (this.type === 'user') { if (this.q == null) { this.users = []; this.fetching = false; @@ -262,7 +259,7 @@ export default defineComponent({ sessionStorage.setItem(cacheKey, JSON.stringify(users)); }); } - } else if (this.type == 'hashtag') { + } else if (this.type === 'hashtag') { if (this.q == null || this.q == '') { this.hashtags = JSON.parse(localStorage.getItem('hashtags') || '[]'); this.fetching = false; @@ -286,7 +283,7 @@ export default defineComponent({ }); } } - } else if (this.type == 'emoji') { + } else if (this.type === 'emoji') { if (this.q == null || this.q == '') { // 最近使った絵文字をサジェスト this.emojis = this.$store.state.recentlyUsedEmojis.map(emoji => emojiDb.find(e => e.emoji == emoji)).filter(x => x != null); @@ -314,6 +311,14 @@ export default defineComponent({ } this.emojis = matched; + } else if (this.type === 'mfmTag') { + console.log(this.q); + if (this.q == null || this.q == '') { + this.mfmTags = MFM_TAGS; + return; + } + + this.mfmTags = MFM_TAGS.filter(tag => tag.startsWith(this.q)); } }, @@ -490,5 +495,11 @@ export default defineComponent({ margin: 0 0 0 8px; } } + + > .mfmTags > li { + + .name { + } + } } diff --git a/src/client/scripts/autocomplete.ts b/src/client/scripts/autocomplete.ts index c4bcc4b724..e952ad3907 100644 --- a/src/client/scripts/autocomplete.ts +++ b/src/client/scripts/autocomplete.ts @@ -70,11 +70,13 @@ export class Autocomplete { const mentionIndex = text.lastIndexOf('@'); const hashtagIndex = text.lastIndexOf('#'); const emojiIndex = text.lastIndexOf(':'); + const mfmTagIndex = text.lastIndexOf('$'); const max = Math.max( mentionIndex, hashtagIndex, - emojiIndex); + emojiIndex, + mfmTagIndex); if (max == -1) { this.close(); @@ -83,6 +85,7 @@ export class Autocomplete { const isMention = mentionIndex != -1; const isHashtag = hashtagIndex != -1; + const isMfmTag = mfmTagIndex != -1; const isEmoji = emojiIndex != -1 && text.split(/:[a-z0-9_+\-]+:/).pop()!.includes(':'); let opened = false; @@ -114,6 +117,14 @@ export class Autocomplete { } } + if (isMfmTag && !opened) { + const mfmTag = text.substr(mfmTagIndex + 1); + if (!mfmTag.includes(' ')) { + this.open('mfmTag', mfmTag); + opened = true; + } + } + if (!opened) { this.close(); } @@ -244,6 +255,22 @@ export class Autocomplete { const pos = trimmedBefore.length + value.length; this.textarea.setSelectionRange(pos, pos); }); + } else if (type == 'mfmTag') { + const source = this.text; + + const before = source.substr(0, caret); + const trimmedBefore = before.substring(0, before.lastIndexOf('$')); + const after = source.substr(caret); + + // 挿入 + this.text = `${trimmedBefore}$[${value} ]${after}`; + + // キャレットを戻す + this.vm.$nextTick(() => { + this.textarea.focus(); + const pos = trimmedBefore.length + (value.length + 3); + this.textarea.setSelectionRange(pos, pos); + }); } } } -- cgit v1.2.3-freya From 78b400e8b0505ca319c77209f0c6760140622248 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 26 Sep 2021 03:25:00 +0900 Subject: fix(client): MFM関数構文のサジェストで括弧を無視するように MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/scripts/autocomplete.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/client/scripts') diff --git a/src/client/scripts/autocomplete.ts b/src/client/scripts/autocomplete.ts index e952ad3907..c0c33b2c7e 100644 --- a/src/client/scripts/autocomplete.ts +++ b/src/client/scripts/autocomplete.ts @@ -120,7 +120,7 @@ export class Autocomplete { if (isMfmTag && !opened) { const mfmTag = text.substr(mfmTagIndex + 1); if (!mfmTag.includes(' ')) { - this.open('mfmTag', mfmTag); + this.open('mfmTag', mfmTag.replace('[', '')); opened = true; } } -- cgit v1.2.3-freya From 9109ae02a7f34b8e4f59bb0f2ba3e332549ac222 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 2 Oct 2021 01:08:04 +0900 Subject: chore: fix bug --- src/client/scripts/physics.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/client/scripts') diff --git a/src/client/scripts/physics.ts b/src/client/scripts/physics.ts index 8e971d5844..445b6296eb 100644 --- a/src/client/scripts/physics.ts +++ b/src/client/scripts/physics.ts @@ -79,7 +79,7 @@ export function physics(container: HTMLElement) { objEl.offsetWidth, objEl.offsetHeight, { - chamfer: { radius: parseInt(style.borderRadius, 10) }, + chamfer: { radius: parseInt(style.borderRadius || '0', 10) }, restitution: 0.5 } ); -- cgit v1.2.3-freya From dd17065129c66f5093add1192fcdf853123f7583 Mon Sep 17 00:00:00 2001 From: tamaina Date: Thu, 7 Oct 2021 14:26:16 +0900 Subject: Fix idb --- src/client/scripts/idb-proxy.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'src/client/scripts') diff --git a/src/client/scripts/idb-proxy.ts b/src/client/scripts/idb-proxy.ts index 21c4dcff65..5f76ae30bb 100644 --- a/src/client/scripts/idb-proxy.ts +++ b/src/client/scripts/idb-proxy.ts @@ -4,7 +4,6 @@ import { get as iget, set as iset, del as idel, - createStore, } from 'idb-keyval'; const fallbackName = (key: string) => `idbfallback::${key}`; @@ -13,9 +12,9 @@ let idbAvailable = typeof window !== 'undefined' ? !!window.indexedDB : true; if (idbAvailable) { try { - await createStore('keyval-store', 'keyval'); + await iset('idb-test', 'test'); } catch (e) { - console.error('idb open error', e); + console.error('idb error', e); idbAvailable = false; } } -- cgit v1.2.3-freya From 67875e2afa65fb0be477099def0e3d9cdb08ea22 Mon Sep 17 00:00:00 2001 From: tamaina Date: Thu, 7 Oct 2021 14:28:22 +0900 Subject: Revert "Fix idb" This reverts commit dd17065129c66f5093add1192fcdf853123f7583. --- src/client/scripts/idb-proxy.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/client/scripts') diff --git a/src/client/scripts/idb-proxy.ts b/src/client/scripts/idb-proxy.ts index 5f76ae30bb..21c4dcff65 100644 --- a/src/client/scripts/idb-proxy.ts +++ b/src/client/scripts/idb-proxy.ts @@ -4,6 +4,7 @@ import { get as iget, set as iset, del as idel, + createStore, } from 'idb-keyval'; const fallbackName = (key: string) => `idbfallback::${key}`; @@ -12,9 +13,9 @@ let idbAvailable = typeof window !== 'undefined' ? !!window.indexedDB : true; if (idbAvailable) { try { - await iset('idb-test', 'test'); + await createStore('keyval-store', 'keyval'); } catch (e) { - console.error('idb error', e); + console.error('idb open error', e); idbAvailable = false; } } -- cgit v1.2.3-freya From 597c9761cb09614cb05a0dfe5c2d126f549fa2dd Mon Sep 17 00:00:00 2001 From: tamaina Date: Fri, 8 Oct 2021 13:37:55 +0900 Subject: Revert "Revert "Fix idb"" (#7860) This reverts commit 67875e2afa65fb0be477099def0e3d9cdb08ea22. --- src/client/scripts/idb-proxy.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'src/client/scripts') diff --git a/src/client/scripts/idb-proxy.ts b/src/client/scripts/idb-proxy.ts index 21c4dcff65..5f76ae30bb 100644 --- a/src/client/scripts/idb-proxy.ts +++ b/src/client/scripts/idb-proxy.ts @@ -4,7 +4,6 @@ import { get as iget, set as iset, del as idel, - createStore, } from 'idb-keyval'; const fallbackName = (key: string) => `idbfallback::${key}`; @@ -13,9 +12,9 @@ let idbAvailable = typeof window !== 'undefined' ? !!window.indexedDB : true; if (idbAvailable) { try { - await createStore('keyval-store', 'keyval'); + await iset('idb-test', 'test'); } catch (e) { - console.error('idb open error', e); + console.error('idb error', e); idbAvailable = false; } } -- cgit v1.2.3-freya From 27c056cbbf6e85a033e85adbafd95a179a9db755 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 9 Oct 2021 12:33:08 +0900 Subject: tweak ui --- src/client/components/global/header.vue | 319 ++++++++++++++++++++++++ src/client/components/index.ts | 2 + src/client/components/modal-page-window.vue | 3 - src/client/components/page-window.vue | 6 +- src/client/pages/announcements.vue | 34 ++- src/client/pages/antenna-timeline.vue | 2 +- src/client/pages/emojis.vue | 12 +- src/client/pages/explore.vue | 126 +++++----- src/client/pages/favorites.vue | 14 +- src/client/pages/featured.vue | 17 +- src/client/pages/federation.vue | 182 +++++++------- src/client/pages/instance/ads.vue | 89 ++++--- src/client/pages/instance/announcements.vue | 52 ++-- src/client/pages/instance/emojis.vue | 30 ++- src/client/pages/instance/index.vue | 6 +- src/client/pages/instance/users.vue | 29 ++- src/client/pages/mentions.vue | 15 +- src/client/pages/messages.vue | 13 +- src/client/pages/messaging/index.vue | 73 +++--- src/client/pages/messaging/messaging-room.vue | 2 +- src/client/pages/my-lists/index.vue | 25 +- src/client/pages/my-lists/list.vue | 57 +++-- src/client/pages/notifications.vue | 12 +- src/client/pages/pages.vue | 13 +- src/client/pages/search.vue | 15 +- src/client/pages/settings/index.vue | 10 +- src/client/pages/settings/profile.vue | 1 - src/client/pages/timeline.vue | 38 +-- src/client/pages/user-list-timeline.vue | 2 +- src/client/pages/user/index.vue | 346 +++++++++++++------------- src/client/scripts/scroll.ts | 20 +- src/client/ui/_common_/header.vue | 295 ---------------------- src/client/ui/chat/index.vue | 4 +- src/client/ui/chat/side.vue | 4 +- src/client/ui/deck/main-column.vue | 3 - src/client/ui/default.side.vue | 7 +- src/client/ui/default.vue | 45 +--- src/client/ui/universal.vue | 29 +-- src/client/ui/zen.vue | 4 +- 39 files changed, 1042 insertions(+), 914 deletions(-) create mode 100644 src/client/components/global/header.vue delete mode 100644 src/client/ui/_common_/header.vue (limited to 'src/client/scripts') diff --git a/src/client/components/global/header.vue b/src/client/components/global/header.vue new file mode 100644 index 0000000000..977912e2bd --- /dev/null +++ b/src/client/components/global/header.vue @@ -0,0 +1,319 @@ + + + + + diff --git a/src/client/components/index.ts b/src/client/components/index.ts index 8b914c5eec..8f071dfce1 100644 --- a/src/client/components/index.ts +++ b/src/client/components/index.ts @@ -13,6 +13,7 @@ import i18n from './global/i18n'; import loading from './global/loading.vue'; import error from './global/error.vue'; import ad from './global/ad.vue'; +import header from './global/header.vue'; export default function(app: App) { app.component('I18n', i18n); @@ -28,4 +29,5 @@ export default function(app: App) { app.component('MkLoading', loading); app.component('MkError', error); app.component('MkAd', ad); + app.component('MkHeader', header); } diff --git a/src/client/components/modal-page-window.vue b/src/client/components/modal-page-window.vue index 31931a89b7..c20e2b3087 100644 --- a/src/client/components/modal-page-window.vue +++ b/src/client/components/modal-page-window.vue @@ -11,7 +11,6 @@
        - @@ -23,7 +22,6 @@ - - diff --git a/src/client/ui/chat/index.vue b/src/client/ui/chat/index.vue index 7090c9486a..4194a9919f 100644 --- a/src/client/ui/chat/index.vue +++ b/src/client/ui/chat/index.vue @@ -74,7 +74,7 @@
        - +
        @@ -101,7 +101,6 @@ import XSidebar from '@client/ui/_common_/sidebar.vue'; import XWidgets from './widgets.vue'; import XCommon from '../_common_/common.vue'; import XSide from './side.vue'; -import XHeader from '../_common_/header.vue'; import XHeaderClock from './header-clock.vue'; import * as os from '@client/os'; import { router } from '@client/router'; @@ -117,7 +116,6 @@ export default defineComponent({ XSidebar, XWidgets, XSide, // NOTE: dynamic importするとAsyncComponentWrapperが間に入るせいでref取得できなくて面倒になる - XHeader, XHeaderClock, }, diff --git a/src/client/ui/chat/side.vue b/src/client/ui/chat/side.vue index 3e8904596d..d920e5b77c 100644 --- a/src/client/ui/chat/side.vue +++ b/src/client/ui/chat/side.vue @@ -1,7 +1,7 @@