From fb96a9ef8fbe818db990e24e069ad57e1be02bda Mon Sep 17 00:00:00 2001 From: kakkokari-gtyih Date: Mon, 30 Oct 2023 22:52:19 +0900 Subject: [PATCH] (add) iroiro --- locales/index.d.ts | 41 +++ locales/ja-JP.yml | 36 ++- packages/frontend/assets/tutorial/ai.webp | Bin 0 -> 12238 bytes .../assets/tutorial/natto_failed.webp | Bin 0 -> 13196 bytes packages/frontend/assets/tutorial/syuilo.webp | Bin 0 -> 11184 bytes ...uilo_nattoopen_failed.webp:Zone.Identifier | 4 + .../frontend/assets/tutorial/timeline_tab.png | Bin 0 -> 2860 bytes packages/frontend/src/components/MkInfo.vue | 2 +- .../frontend/src/components/MkPostForm.vue | 26 +- .../src/components/MkPostFormAttaches.vue | 14 + ...Tutorial.vue => MkTutorialDialog.Note.vue} | 78 ++---- .../components/MkTutorialDialog.PostNote.vue | 135 ++++++++++ .../components/MkTutorialDialog.Sensitive.vue | 156 +++++++++++ ...rial.vue => MkTutorialDialog.Timeline.vue} | 12 +- .../src/components/MkTutorialDialog.vue | 252 ++++++++++++++++++ .../src/components/MkUserSetupDialog.vue | 114 ++------ packages/frontend/src/ui/_common_/common.ts | 4 +- 17 files changed, 718 insertions(+), 156 deletions(-) create mode 100644 packages/frontend/assets/tutorial/ai.webp create mode 100644 packages/frontend/assets/tutorial/natto_failed.webp create mode 100644 packages/frontend/assets/tutorial/syuilo.webp create mode 100644 packages/frontend/assets/tutorial/syuilo_nattoopen_failed.webp:Zone.Identifier create mode 100644 packages/frontend/assets/tutorial/timeline_tab.png rename packages/frontend/src/components/{MkUserSetupDialog.NoteTutorial.vue => MkTutorialDialog.Note.vue} (66%) create mode 100644 packages/frontend/src/components/MkTutorialDialog.PostNote.vue create mode 100644 packages/frontend/src/components/MkTutorialDialog.Sensitive.vue rename packages/frontend/src/components/{MkUserSetupDialog.TimelineTutorial.vue => MkTutorialDialog.Timeline.vue} (85%) create mode 100644 packages/frontend/src/components/MkTutorialDialog.vue diff --git a/locales/index.d.ts b/locales/index.d.ts index a43203783a..383c454ca9 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -1188,6 +1188,11 @@ export interface Locale { "launchTutorial": string; "title": string; "wellDone": string; + "skipAreYouSure": string; + "_landing": { + "title": string; + "description": string; + }; "_note": { "title": string; "description": string; @@ -1202,6 +1207,7 @@ export interface Locale { "description": string; "letsTryReacting": string; "reactToContinue": string; + "reactNotification": string; "reactDone": string; }; "_timeline": { @@ -1212,6 +1218,41 @@ export interface Locale { "social": string; "global": string; "description2": string; + "description3": string; + }; + "_postNote": { + "title": string; + "description1": string; + "_visibility": { + "description": string; + "public": string; + "home": string; + "followers": string; + "direct": string; + "doNotSendConfidencialOnDirect1": string; + "doNotSendConfidencialOnDirect2": string; + "localOnly": string; + }; + "_cw": { + "title": string; + "description": string; + "_exampleNote": { + "cw": string; + "note": string; + }; + "useCases": string; + }; + }; + "_howToMakeAttachmentsSensitive": { + "title": string; + "description": string; + "tryThisFile": string; + "_exampleNote": { + "note": string; + }; + "method": string; + "sensitiveSucceeded": string; + "doItToContinue": string; }; "_done": { "title": string; diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index afd13b0a9e..664143d170 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1186,6 +1186,10 @@ _initialTutorial: launchTutorial: "チュートリアルを見る" title: "チュートリアル" wellDone: "お見事!" + skipAreYouSure: "チュートリアルを終了しますか?" + _landing: + title: "チュートリアルへようこそ!" + description: "ここでは、Misskeyの基本的な使い方や機能を確認できます。「次へ」を押して早速始はじめましょう!" _note: title: "ノートって何?" description: "Misskeyでの投稿は「ノート」と呼びます。ノートはタイムラインに時系列で並んでいて、リアルタイムで更新されていきます。" @@ -1199,6 +1203,7 @@ _initialTutorial: description: "ノートには「リアクション」をつけることができます。「いいね」では伝わらないニュアンスも、リアクションで簡単・気軽に表現できます。" letsTryReacting: "リアクションは、ノートの「+」ボタンをクリックするとつけられます。試しにこのノートに好きなリアクションをつけてみましょう!" reactToContinue: "リアクションをつけると先に進めるようになります。" + reactNotification: "あなたのノートが誰かにリアクションされると、通知が入ります。もちろん、これもリアルタイムです!" reactDone: "リアクションを外すときは、「ー」ボタンを押します。実際に試してみてくださいね。" _timeline: title: "タイムラインのしくみ" @@ -1207,7 +1212,36 @@ _initialTutorial: local: "このサーバーにいるユーザー全員の投稿を見られます。" social: "ホームタイムラインとローカルタイムラインの投稿が両方表示されます。" global: "接続している他のすべてのサーバーからの投稿を見られます。" - description2: "その他にも、リストタイムラインやチャンネルタイムラインなどがあります。詳しくは{link}をご覧ください。" + description2: "それぞれのタイムラインは、画面上部でいつでも切り替えられます。" + description3: "その他にも、リストタイムラインやチャンネルタイムラインなどがあります。詳しくは{link}をご覧ください。" + _postNote: + title: "ノートの投稿設定" + description1: "Misskeyにノートを投稿する際には、細かい設定ができるようになっています。ノートの設定は、以下のような投稿フォームから行えます。" + _visibility: + description: "ノートを表示できる相手を制限できます。" + public: "すべてのユーザーに公開。" + home: "ホームタイムラインのみに公開。フォロワー・プロフィールを見に来た人・リノートから、他のユーザーも見ることができます。" + followers: "フォロワーにのみ公開。本人以外がリノートすることはできず、またフォロワー以外は閲覧できません。" + direct: "指定したユーザーにのみ公開され、また相手に通知が入ります。ダイレクトメッセージのかわりにお使いいただけます。" + doNotSendConfidencialOnDirect1: "ダイレクトであっても、機密情報は送信しないようにしてください。" + doNotSendConfidencialOnDirect2: "指定したユーザー以外には公開されないとはいえ、悪意のある他のソフトウェアに連合された際に、連合先で公開設定が無視されるおそれがあります。" + localOnly: "他のサーバーに投稿を連合しません。上記の公開範囲に関わらず、他のサーバーのユーザーは、この設定がついたノートを直接閲覧することができなくなります。" + _cw: + title: "内容を隠す(CW)" + description: "本文のかわりに「注釈」に書いた内容が表示されます。「もっと見る」を押すと本文が表示されます。" + _exampleNote: + cw: "飯テロ注意" + note: "チョコのかかったドーナツを食べました🍩😋" + useCases: "サーバーのガイドラインにより必要とされるノートに指定したり、ネタバレ投稿やセンシティブな文章を自主規制したりするときに使います。" + _howToMakeAttachmentsSensitive: + title: "添付ファイルをセンシティブにするには?" + description: "サーバーのガイドラインにより必要とされる際や、そのまま見れる状態にしておくべきではない添付ファイルには、「センシティブ」設定を付けます。" + tryThisFile: "試しに、このノートについている画像をセンシティブにしてみましょう。" + _exampleNote: + note: "納豆のフタ開けるのミスったわね… なんかグロい" + method: "添付ファイルをセンシティブにする際は、そのファイルをクリックしてメニューを開き、「センシティブとして設定」をクリックします。" + sensitiveSucceeded: "今後ファイルを添付する際は、お使いのサーバーのガイドラインに従って、センシティブを適切に設定してください!" + doItToContinue: "画像をセンシティブに設定すると先に進めるようになります。" _done: title: "チュートリアルは終了です🎉" description: "ここで紹介した機能は、ほんの一部です!Misskeyの使い方をより詳しく知るには、{link}をご覧ください。" diff --git a/packages/frontend/assets/tutorial/ai.webp b/packages/frontend/assets/tutorial/ai.webp new file mode 100644 index 0000000000000000000000000000000000000000..d9d456494272913452dba78c1b13192db0e7d49d GIT binary patch literal 12238 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 literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/tutorial/syuilo.webp b/packages/frontend/assets/tutorial/syuilo.webp new file mode 100644 index 0000000000000000000000000000000000000000..316601f0facd8ef9d850f92c1dc2f1a47e500c73 GIT binary patch literal 11184 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 OuS`|&DRtO_E!Y4+{ljel literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/tutorial/syuilo_nattoopen_failed.webp:Zone.Identifier b/packages/frontend/assets/tutorial/syuilo_nattoopen_failed.webp:Zone.Identifier new file mode 100644 index 0000000000..88438ad86f --- /dev/null +++ b/packages/frontend/assets/tutorial/syuilo_nattoopen_failed.webp:Zone.Identifier @@ -0,0 +1,4 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=https://s3.arkjp.net/emoji/syuilo_nattoopen_failed.png +HostUrl=https://s3.arkjp.net/emoji/syuilo_nattoopen_failed.png diff --git a/packages/frontend/assets/tutorial/timeline_tab.png b/packages/frontend/assets/tutorial/timeline_tab.png new file mode 100644 index 0000000000000000000000000000000000000000..b52ad5fb519119efa418f47204c1131db0a9d1c5 GIT binary patch literal 2860 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 - +
diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue index 598846b166..492306f5d9 100644 --- a/packages/frontend/src/components/MkPostForm.vue +++ b/packages/frontend/src/components/MkPostForm.vue @@ -71,7 +71,7 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ maxTextLength - textLength }}
- +
@@ -143,15 +143,20 @@ const props = withDefaults(defineProps<{ fixed?: boolean; autofocus?: boolean; freezeAfterPosted?: boolean; + mock?: boolean; }>(), { initialVisibleUsers: () => [], autofocus: true, + mock: false, }); const emit = defineEmits<{ (ev: 'posted'): void; (ev: 'cancel'): void; (ev: 'esc'): void; + + // Mock用 + (ev: 'fileChangeSensitive', fileId: string, to: boolean): void; }>(); const textareaEl = $shallowRef(null); @@ -239,7 +244,7 @@ const maxTextLength = $computed((): number => { }); const canPost = $computed((): boolean => { - return !posting && !posted && + return !props.mock && !posting && !posted && (1 <= textLength || 1 <= files.length || !!poll || !!props.renote) && (textLength <= maxTextLength) && (!poll || poll.choices.length >= 2); @@ -396,6 +401,8 @@ function focus() { } function chooseFileFrom(ev) { + if (props.mock) return; + selectFiles(ev.currentTarget ?? ev.target, i18n.ts.attachFile).then(files_ => { for (const file of files_) { files.push(file); @@ -408,6 +415,9 @@ function detachFile(id) { } function updateFileSensitive(file, sensitive) { + if (props.mock) { + emit('fileChangeSensitive', file.id, sensitive); + } files[files.findIndex(x => x.id === file.id)].isSensitive = sensitive; } @@ -420,6 +430,8 @@ function replaceFile(file: Misskey.entities.DriveFile, newFile: Misskey.entities } function upload(file: File, name?: string): void { + if (props.mock) return; + uploadFile(file, defaultStore.state.uploadFolder, name).then(res => { files.push(res); }); @@ -545,6 +557,8 @@ function onCompositionEnd(ev: CompositionEvent) { } async function onPaste(ev: ClipboardEvent) { + if (props.mock) return; + for (const { item, i } of Array.from(ev.clipboardData.items, (item, i) => ({ item, i }))) { if (item.kind === 'file') { const file = item.getAsFile(); @@ -629,7 +643,7 @@ function onDrop(ev): void { } function saveDraft() { - if (props.instant) return; + if (props.instant || props.mock) return; const draftData = JSON.parse(miLocalStorage.getItem('drafts') ?? '{}'); @@ -666,6 +680,8 @@ async function post(ev?: MouseEvent) { os.popup(MkRippleEffect, { x, y }, {}, 'end'); } + if (props.mock) return; + const annoying = text.includes('$[x2') || text.includes('$[x3') || @@ -831,6 +847,8 @@ function showActions(ev) { let postAccount = $ref(null); function openAccountMenu(ev: MouseEvent) { + if (props.mock) return; + openAccountMenu_({ withExtraOperation: false, includeCurrentAccount: true, @@ -861,7 +879,7 @@ onMounted(() => { nextTick(() => { // 書きかけの投稿を復元 - if (!props.instant && !props.mention && !props.specified) { + if (!props.instant && !props.mention && !props.specified && !props.mock) { const draft = JSON.parse(miLocalStorage.getItem('drafts') ?? '{}')[draftKey]; if (draft) { text = draft.data.text; diff --git a/packages/frontend/src/components/MkPostFormAttaches.vue b/packages/frontend/src/components/MkPostFormAttaches.vue index d499a22ed6..ea62262551 100644 --- a/packages/frontend/src/components/MkPostFormAttaches.vue +++ b/packages/frontend/src/components/MkPostFormAttaches.vue @@ -31,6 +31,7 @@ const Sortable = defineAsyncComponent(() => import('vuedraggable').then(x => x.d const props = defineProps<{ modelValue: any[]; detachMediaFn?: (id: string) => void; + mock?: boolean; }>(); const emit = defineEmits<{ @@ -44,6 +45,8 @@ const emit = defineEmits<{ let menuShowing = false; function detachMedia(id: string) { + if (props.mock) return; + if (props.detachMediaFn) { props.detachMediaFn(id); } else { @@ -52,6 +55,11 @@ function detachMedia(id: string) { } function toggleSensitive(file) { + if (props.mock) { + emit('changeSensitive', file, !file.isSensitive); + return; + } + os.api('drive/files/update', { fileId: file.id, isSensitive: !file.isSensitive, @@ -61,6 +69,8 @@ function toggleSensitive(file) { } async function rename(file) { + if (props.mock) return; + const { canceled, result } = await os.inputText({ title: i18n.ts.enterFileName, default: file.name, @@ -77,6 +87,8 @@ async function rename(file) { } async function describe(file) { + if (props.mock) return; + os.popup(defineAsyncComponent(() => import('@/components/MkFileCaptionEditWindow.vue')), { default: file.comment !== null ? file.comment : '', file: file, @@ -94,6 +106,8 @@ async function describe(file) { } async function crop(file: Misskey.entities.DriveFile): Promise { + if (props.mock) return; + const newFile = await os.cropImage(file, { aspectRatio: NaN }); emit('replaceFile', file, newFile); } diff --git a/packages/frontend/src/components/MkUserSetupDialog.NoteTutorial.vue b/packages/frontend/src/components/MkTutorialDialog.Note.vue similarity index 66% rename from packages/frontend/src/components/MkUserSetupDialog.NoteTutorial.vue rename to packages/frontend/src/components/MkTutorialDialog.Note.vue index bf7df105d6..46d35c42df 100644 --- a/packages/frontend/src/components/MkUserSetupDialog.NoteTutorial.vue +++ b/packages/frontend/src/components/MkTutorialDialog.Note.vue @@ -8,25 +8,17 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts._initialTutorial._note.description }}
-
… {{ i18n.ts._initialTutorial._note.date }}
+
{{ i18n.ts._initialTutorial._note.date }}
{{ i18n.ts.reply }} … {{ i18n.ts._initialTutorial._note.reply }}
{{ i18n.ts.renote }} … {{ i18n.ts._initialTutorial._note.renote }}
{{ i18n.ts.reaction }} … {{ i18n.ts._initialTutorial._note.reaction }}
-
-
{{ i18n.ts._initialTutorial._note.howToNote }}
-
-
- {{ i18n.ts.note }} -
-
-
{{ i18n.ts._initialTutorial._reaction.description }}
{{ i18n.ts._initialTutorial._reaction.letsTryReacting }}
-
{{ i18n.ts._initialTutorial.wellDone }} {{ i18n.ts._initialTutorial._reaction.reactDone }}
+
{{ i18n.ts._initialTutorial.wellDone }} {{ i18n.ts._initialTutorial._reaction.reactNotification }}
{{ i18n.ts._initialTutorial._reaction.reactDone }}
@@ -34,6 +26,8 @@ SPDX-License-Identifier: AGPL-3.0-only import * as Misskey from 'misskey-js'; import { ref, reactive } from 'vue'; import { i18n } from '@/i18n.js'; +import { globalEvents } from '@/events.js'; +import { $i } from '@/account.js'; import MkTime from '@/components/global/MkTime.vue'; import MkNote from '@/components/MkNote.vue'; @@ -51,12 +45,12 @@ const exampleNote = reactive({ userId: '0000000001', user: { id: '0000000001', - name: 'しゅいろ', - username: 'syuilo', + name: '藍', + username: 'ai', host: null, avatarDecorations: [], - avatarUrl: 'https://proxy.misskeyusercontent.com/avatar.webp?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-b2dc591e-58b6-4df7-b7c9-1cba199f6619.png&avatar=1', - avatarBlurhash: 'yFF5Kq0L00?a^*IBNG01^j-pV@D*o|xt58WB}@9at7s.Ip~AWB57%Laes:xaOEoLnis:ofIpoJr?NHtRV@oLoeNHNI%1M{kCWCjuxZ', + avatarUrl: './client-assets/tutorial/ai.webp', + avatarBlurhash: 'eiKmhHIByXxZ~qWXs:-pR*NbR*s:xuRjoL-oR*WCt6WWf6WVf6oeWB', isBot: false, isCat: true, emojis: {}, @@ -84,6 +78,24 @@ function addReaction(emoji) { emit('reacted'); exampleNote.reactions[emoji] = 1; exampleNote.myReaction = emoji; + doNotification(emoji); +} + +function doNotification(emoji: string): void { + if (!$i || !emoji) return; + + const notification: Misskey.entities.Notification = { + id: Math.random().toString(), + createdAt: new Date().toUTCString(), + isRead: false, + type: 'reaction', + reaction: emoji, + user: $i, + userId: $i.id, + note: exampleNote, + }; + + globalEvents.emit('clientNotification', notification); } function removeReaction(emoji) { @@ -103,42 +115,4 @@ function removeReaction(emoji) { height: 1px; background: var(--divider); } - -.post { - position: relative; - display: block; - width: 100%; - height: 40px; - color: var(--fgOnAccent); - font-weight: bold; - text-align: left; - - &:before { - content: ""; - display: block; - width: calc(100% - 38px); - height: 100%; - margin: auto; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - border-radius: 999px; - background: linear-gradient(90deg, var(--buttonGradateA), var(--buttonGradateB)); - } - -} - -.postIcon { - position: relative; - margin-left: 30px; - margin-right: 8px; - width: 32px; -} - -.postText { - position: relative; - line-height: 40px; -} diff --git a/packages/frontend/src/components/MkTutorialDialog.PostNote.vue b/packages/frontend/src/components/MkTutorialDialog.PostNote.vue new file mode 100644 index 0000000000..441594e42b --- /dev/null +++ b/packages/frontend/src/components/MkTutorialDialog.PostNote.vue @@ -0,0 +1,135 @@ + + + + + + + diff --git a/packages/frontend/src/components/MkTutorialDialog.Sensitive.vue b/packages/frontend/src/components/MkTutorialDialog.Sensitive.vue new file mode 100644 index 0000000000..659fd7c0fc --- /dev/null +++ b/packages/frontend/src/components/MkTutorialDialog.Sensitive.vue @@ -0,0 +1,156 @@ + + + + + + + diff --git a/packages/frontend/src/components/MkUserSetupDialog.TimelineTutorial.vue b/packages/frontend/src/components/MkTutorialDialog.Timeline.vue similarity index 85% rename from packages/frontend/src/components/MkUserSetupDialog.TimelineTutorial.vue rename to packages/frontend/src/components/MkTutorialDialog.Timeline.vue index a9be4a5991..75b917f33c 100644 --- a/packages/frontend/src/components/MkUserSetupDialog.TimelineTutorial.vue +++ b/packages/frontend/src/components/MkTutorialDialog.Timeline.vue @@ -12,7 +12,12 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts._timelines.social }} … {{ i18n.ts._initialTutorial._timeline.social }}
{{ i18n.ts._timelines.global }} … {{ i18n.ts._initialTutorial._timeline.global }}
- +
+
{{ i18n.ts._initialTutorial._timeline.description2 }}
+ +
+
+ @@ -37,6 +42,11 @@ import { i18n } from '@/i18n.js'; background: var(--divider); } +.image { + max-width: 300px; + margin: 0 auto; +} + .post { position: relative; display: block; diff --git a/packages/frontend/src/components/MkTutorialDialog.vue b/packages/frontend/src/components/MkTutorialDialog.vue new file mode 100644 index 0000000000..54ffb0911e --- /dev/null +++ b/packages/frontend/src/components/MkTutorialDialog.vue @@ -0,0 +1,252 @@ + + + + + + + diff --git a/packages/frontend/src/components/MkUserSetupDialog.vue b/packages/frontend/src/components/MkUserSetupDialog.vue index 0dc0af5853..05b55f77a7 100644 --- a/packages/frontend/src/components/MkUserSetupDialog.vue +++ b/packages/frontend/src/components/MkUserSetupDialog.vue @@ -16,14 +16,11 @@ SPDX-License-Identifier: AGPL-3.0-only - - - - +
-
+
{{ i18n.ts._initialAccountSetting.initialAccountSettingCompleted }}
{{ i18n.t('_initialAccountSetting.youCanContinueTutorial', { name: instance.name ?? host }) }}
- {{ i18n.ts._initialAccountSetting.startTutorial }} + {{ i18n.ts._initialAccountSetting.startTutorial }}
{{ i18n.ts.goBack }} - {{ i18n.ts.close }} -
-
- - - - - - - diff --git a/packages/frontend/src/ui/_common_/common.ts b/packages/frontend/src/ui/_common_/common.ts index 689e28330c..9ffa5b95b5 100644 --- a/packages/frontend/src/ui/_common_/common.ts +++ b/packages/frontend/src/ui/_common_/common.ts @@ -102,9 +102,7 @@ export function openInstanceMenu(ev: MouseEvent) { text: i18n.ts._initialTutorial.launchTutorial, icon: 'ti ti-presentation', action: () => { - os.popup(defineAsyncComponent(() => import('@/components/MkUserSetupDialog.vue')), { - onlyTutorial: true, - }, {}, 'closed'); + os.popup(defineAsyncComponent(() => import('@/components/MkTutorialDialog.vue')), {}, {}, 'closed'); }, } : undefined, { type: 'link',