From d77fa3bb089b59e4c079aa2d1fdd56296431c2a7 Mon Sep 17 00:00:00 2001 From: tamaina Date: Sun, 26 Dec 2021 02:17:36 +0900 Subject: wip --- packages/client/src/pizzax.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'packages/client/src') diff --git a/packages/client/src/pizzax.ts b/packages/client/src/pizzax.ts index 396abc2418..6a876c0797 100644 --- a/packages/client/src/pizzax.ts +++ b/packages/client/src/pizzax.ts @@ -1,6 +1,6 @@ import { onUnmounted, Ref, ref, watch } from 'vue'; import { $i } from './account'; -import { api } from './os'; +import { api, stream } from './os'; type StateDef = Record { public readonly state: { [K in keyof T]: T[K]['default'] }; public readonly reactiveState: { [K in keyof T]: Ref }; + private connection = stream.useChannel('main'); + constructor(key: string, def: T) { this.key = key; this.keyForLocalStorage = 'pizzax::' + key; @@ -70,7 +72,14 @@ export class Storage { }); }, 1); - // TODO: streamingのuser storage updateイベントを監視して更新 + // streamingのuser storage updateイベントを監視して更新 + this.connection.on('registryUpdated', ({ scope, key, value }) => { + this.state[key] = value; + this.reactiveState[key].value = value; + const cache = JSON.parse(localStorage.getItem(this.keyForLocalStorage + '::cache::' + $i.id) || '{}'); + cache[key] = value; + localStorage.setItem(this.keyForLocalStorage + '::cache::' + $i.id, JSON.stringify(cache)); + }); } } -- cgit v1.2.3-freya From 2012f4a198f2071d0212af3b2feebecda24d2f37 Mon Sep 17 00:00:00 2001 From: tamaina Date: Sun, 26 Dec 2021 02:24:45 +0900 Subject: wip? --- packages/client/src/pizzax.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'packages/client/src') diff --git a/packages/client/src/pizzax.ts b/packages/client/src/pizzax.ts index 6a876c0797..8672276fe7 100644 --- a/packages/client/src/pizzax.ts +++ b/packages/client/src/pizzax.ts @@ -74,8 +74,9 @@ export class Storage { // streamingのuser storage updateイベントを監視して更新 this.connection.on('registryUpdated', ({ scope, key, value }) => { - this.state[key] = value; + this.state[key] = value as typeof this.state[key]['default']; this.reactiveState[key].value = value; + const cache = JSON.parse(localStorage.getItem(this.keyForLocalStorage + '::cache::' + $i.id) || '{}'); cache[key] = value; localStorage.setItem(this.keyForLocalStorage + '::cache::' + $i.id, JSON.stringify(cache)); -- cgit v1.2.3-freya From f9f64a5e4cadd012e3a6809122a962387029181c Mon Sep 17 00:00:00 2001 From: tamaina Date: Wed, 29 Dec 2021 00:03:44 +0900 Subject: ? --- packages/client/src/pizzax.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'packages/client/src') diff --git a/packages/client/src/pizzax.ts b/packages/client/src/pizzax.ts index 8672276fe7..f405ed855b 100644 --- a/packages/client/src/pizzax.ts +++ b/packages/client/src/pizzax.ts @@ -73,8 +73,10 @@ export class Storage { }, 1); // streamingのuser storage updateイベントを監視して更新 - this.connection.on('registryUpdated', ({ scope, key, value }) => { - this.state[key] = value as typeof this.state[key]['default']; + this.connection.on('registryUpdated', ({ scope, key, value }: { scope: string[], key: keyof T, value: T[typeof key]['default'] }) => { + if (scope[1] !== this.key) return; + + this.state[key] = value; this.reactiveState[key].value = value; const cache = JSON.parse(localStorage.getItem(this.keyForLocalStorage + '::cache::' + $i.id) || '{}'); -- cgit v1.2.3-freya From 40abe3d907c85fa3688f8197246973a021f7d711 Mon Sep 17 00:00:00 2001 From: tamaina Date: Wed, 29 Dec 2021 16:05:25 +0900 Subject: streamingのuser storage updateイベントを監視して更新 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/src/pizzax.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'packages/client/src') diff --git a/packages/client/src/pizzax.ts b/packages/client/src/pizzax.ts index f405ed855b..63abe40b03 100644 --- a/packages/client/src/pizzax.ts +++ b/packages/client/src/pizzax.ts @@ -74,7 +74,7 @@ export class Storage { // streamingのuser storage updateイベントを監視して更新 this.connection.on('registryUpdated', ({ scope, key, value }: { scope: string[], key: keyof T, value: T[typeof key]['default'] }) => { - if (scope[1] !== this.key) return; + if (scope[1] !== this.key || this.state[key] === value) return; this.state[key] = value; this.reactiveState[key].value = value; -- cgit v1.2.3-freya From 54bf2808744a552fca45bdd6a08c351147f3cff2 Mon Sep 17 00:00:00 2001 From: tamaina Date: Wed, 29 Dec 2021 16:13:42 +0900 Subject: 必要な時以外はストレージを更新しない MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/src/pizzax.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'packages/client/src') diff --git a/packages/client/src/pizzax.ts b/packages/client/src/pizzax.ts index 63abe40b03..7bfa6a2ab5 100644 --- a/packages/client/src/pizzax.ts +++ b/packages/client/src/pizzax.ts @@ -80,8 +80,10 @@ export class Storage { this.reactiveState[key].value = value; const cache = JSON.parse(localStorage.getItem(this.keyForLocalStorage + '::cache::' + $i.id) || '{}'); - cache[key] = value; - localStorage.setItem(this.keyForLocalStorage + '::cache::' + $i.id, JSON.stringify(cache)); + if (cache[key] !== value) { + cache[key] = value; + localStorage.setItem(this.keyForLocalStorage + '::cache::' + $i.id, JSON.stringify(cache)); + } }); } } -- cgit v1.2.3-freya From 6836c8e98e46dbf3129b4e8fb3a799070454f356 Mon Sep 17 00:00:00 2001 From: tamaina Date: Wed, 29 Dec 2021 16:42:28 +0900 Subject: fix? --- packages/client/src/pizzax.ts | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'packages/client/src') diff --git a/packages/client/src/pizzax.ts b/packages/client/src/pizzax.ts index 7bfa6a2ab5..8a742e85fe 100644 --- a/packages/client/src/pizzax.ts +++ b/packages/client/src/pizzax.ts @@ -70,21 +70,21 @@ export class Storage { } localStorage.setItem(this.keyForLocalStorage + '::cache::' + $i.id, JSON.stringify(cache)); }); - }, 1); - // streamingのuser storage updateイベントを監視して更新 - this.connection.on('registryUpdated', ({ scope, key, value }: { scope: string[], key: keyof T, value: T[typeof key]['default'] }) => { - if (scope[1] !== this.key || this.state[key] === value) return; + // streamingのuser storage updateイベントを監視して更新 + this.connection.on('registryUpdated', ({ scope, key, value }: { scope: string[], key: keyof T, value: T[typeof key]['default'] }) => { + if (scope[1] !== this.key || this.state[key] === value) return; - this.state[key] = value; - this.reactiveState[key].value = value; + this.state[key] = value; + this.reactiveState[key].value = value; - const cache = JSON.parse(localStorage.getItem(this.keyForLocalStorage + '::cache::' + $i.id) || '{}'); - if (cache[key] !== value) { - cache[key] = value; - localStorage.setItem(this.keyForLocalStorage + '::cache::' + $i.id, JSON.stringify(cache)); - } - }); + const cache = JSON.parse(localStorage.getItem(this.keyForLocalStorage + '::cache::' + $i.id) || '{}'); + if (cache[key] !== value) { + cache[key] = value; + localStorage.setItem(this.keyForLocalStorage + '::cache::' + $i.id, JSON.stringify(cache)); + } + }); + }, 1); } } -- cgit v1.2.3-freya From 39b377c06fd15b8402bb2015b347694ac01cda2f Mon Sep 17 00:00:00 2001 From: tamaina Date: Wed, 29 Dec 2021 17:40:39 +0900 Subject: wip --- packages/client/src/components/drive.vue | 3 ++- packages/client/src/components/follow-button.vue | 3 ++- packages/client/src/components/note-detailed.vue | 3 ++- packages/client/src/components/note.vue | 3 ++- packages/client/src/components/notification.vue | 5 ++-- packages/client/src/components/notifications.vue | 5 ++-- packages/client/src/components/post-form.vue | 4 ++-- packages/client/src/components/taskmanager.vue | 9 +++---- packages/client/src/components/timeline.vue | 21 ++++++++-------- packages/client/src/os.ts | 2 -- packages/client/src/pages/admin/metrics.vue | 5 ++-- packages/client/src/pages/admin/overview.vue | 3 ++- packages/client/src/pages/admin/queue.vue | 3 ++- packages/client/src/pages/messaging/index.vue | 3 ++- .../src/pages/messaging/messaging-room.form.vue | 3 ++- .../client/src/pages/messaging/messaging-room.vue | 3 ++- packages/client/src/pages/reversi/game.vue | 3 ++- packages/client/src/pages/reversi/index.vue | 3 ++- packages/client/src/pizzax.ts | 28 +++++++++++----------- packages/client/src/scripts/select-file.ts | 3 ++- packages/client/src/stream.ts | 6 +++++ .../client/src/ui/_common_/stream-indicator.vue | 7 +++--- packages/client/src/ui/chat/note.vue | 3 ++- packages/client/src/ui/chat/pages/channel.vue | 3 ++- packages/client/src/ui/chat/pages/timeline.vue | 11 +++++---- packages/client/src/ui/chat/post-form.vue | 3 ++- packages/client/src/widgets/job-queue.vue | 3 ++- packages/client/src/widgets/photos.vue | 3 ++- .../client/src/widgets/server-metric/index.vue | 3 ++- 29 files changed, 93 insertions(+), 64 deletions(-) create mode 100644 packages/client/src/stream.ts (limited to 'packages/client/src') diff --git a/packages/client/src/components/drive.vue b/packages/client/src/components/drive.vue index 46bcd42558..f8d3d810b7 100644 --- a/packages/client/src/components/drive.vue +++ b/packages/client/src/components/drive.vue @@ -53,6 +53,7 @@ import XFolder from './drive.folder.vue'; import XFile from './drive.file.vue'; import MkButton from './ui/button.vue'; import * as os from '@/os'; +import { stream } from '@/stream'; export default defineComponent({ components: { @@ -140,7 +141,7 @@ export default defineComponent({ }); } - this.connection = markRaw(os.stream.useChannel('drive')); + this.connection = markRaw(stream.useChannel('drive')); this.connection.on('fileCreated', this.onStreamDriveFileCreated); this.connection.on('fileUpdated', this.onStreamDriveFileUpdated); diff --git a/packages/client/src/components/follow-button.vue b/packages/client/src/components/follow-button.vue index 7136261914..b16b22f26f 100644 --- a/packages/client/src/components/follow-button.vue +++ b/packages/client/src/components/follow-button.vue @@ -30,6 +30,7 @@ diff --git a/packages/client/src/pages/settings/index.vue b/packages/client/src/pages/settings/index.vue index 3786cf60f6..68be795008 100644 --- a/packages/client/src/pages/settings/index.vue +++ b/packages/client/src/pages/settings/index.vue @@ -9,15 +9,15 @@
{{ childInfo.title }}
-
{{ ts._preferencesRegistry.noRegistries }} -- cgit v1.2.3-freya From 0da0980f94692249f32031b866f2e6b999aafc14 Mon Sep 17 00:00:00 2001 From: tamaina Date: Sun, 17 Apr 2022 05:32:44 +0900 Subject: remove console.log --- packages/client/src/pages/settings/preferences-registry.vue | 2 -- 1 file changed, 2 deletions(-) (limited to 'packages/client/src') diff --git a/packages/client/src/pages/settings/preferences-registry.vue b/packages/client/src/pages/settings/preferences-registry.vue index fbf38520b2..26ddd1fd1f 100644 --- a/packages/client/src/pages/settings/preferences-registry.vue +++ b/packages/client/src/pages/settings/preferences-registry.vue @@ -65,7 +65,6 @@ let registries = $ref(null); os.api('i/registry/get-all', { scope }) .then(res => { registries = res || {}; - console.log(registries); }); function getDefaultStoreValues() { @@ -120,7 +119,6 @@ async function applyRegistry(id: string) { // defaultStore for (const [key, value] of Object.entries(registry.defaultStore)) { if (key in defaultStore.def && defaultStore.def[key].where !== 'account') { - console.log(key); defaultStore.set(key as keyof Registry['defaultStore'], value); } } -- cgit v1.2.3-freya From 3d4c09510b875ac995661c3371fd110314a578b2 Mon Sep 17 00:00:00 2001 From: tamaina Date: Sun, 17 Apr 2022 06:31:35 +0900 Subject: add wallpaper --- packages/client/src/pages/settings/preferences-registry.vue | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'packages/client/src') diff --git a/packages/client/src/pages/settings/preferences-registry.vue b/packages/client/src/pages/settings/preferences-registry.vue index 26ddd1fd1f..8b5b1c00a5 100644 --- a/packages/client/src/pages/settings/preferences-registry.vue +++ b/packages/client/src/pages/settings/preferences-registry.vue @@ -54,6 +54,7 @@ type Registry = { coldDeviceStorage: Partial; fontSize: string | null; useSystemFont: 't' | null; + wallpaper: string | null; }; type Registries = { @@ -99,6 +100,7 @@ async function saveNew() { coldDeviceStorage: ColdDeviceStorage.getAll(), fontSize: localStorage.getItem('fontSize'), useSystemFont: localStorage.getItem('useSystemFont') as 't' | null, + wallpaper: localStorage.getItem('wallpaper'), }; await os.api('i/registry/set', { scope, key: id, value: registry }); registries[id] = registry; @@ -142,6 +144,13 @@ async function applyRegistry(id: string) { localStorage.removeItem('useSystemFont'); } + // wallpaper + if (registry.wallpaper != null) { + localStorage.setItem('wallpaper', registry.wallpaper); + } else { + localStorage.removeItem('wallpaper'); + } + const { canceled: cancel2 } = await os.confirm({ type: 'info', text: ts.reloadToApplySetting, @@ -183,6 +192,9 @@ async function save(id: string) { updatedAt: (new Date()).toISOString(), defaultStore: getDefaultStoreValues(), coldDeviceStorage: ColdDeviceStorage.getAll(), + fontSize: localStorage.getItem('fontSize'), + useSystemFont: localStorage.getItem('useSystemFont') as 't' | null, + wallpaper: localStorage.getItem('wallpaper'), }; await os.api('i/registry/set', { scope, key: id, value: registry }); registries[id] = registry; -- cgit v1.2.3-freya From 426885bff5dac12298224985bfd833bec79a8b0f Mon Sep 17 00:00:00 2001 From: tamaina Date: Sun, 17 Apr 2022 21:10:50 +0900 Subject: ローカルのjsonファイルを保存・読み込みできるように MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja-JP.yml | 4 + .../src/pages/settings/preferences-registry.vue | 98 +++++++++++++++++++++- 2 files changed, 99 insertions(+), 3 deletions(-) (limited to 'packages/client/src') diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 18d8b3d9e3..a52c67d34b 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -899,10 +899,12 @@ _plugin: _preferencesRegistry: list: "一覧" saveNew: "新規保存" + loadFile: "ファイルを読み込み" apply: "このデバイスに適用" delete: "削除" save: "上書き保存" rename: "名称変更" + download: "ダウンロード" saveNewDescription: "現在のデバイスの状態をサーバーに保存します。" inputName: "レジストリ名を入力" cannotSave: "保存できません" @@ -914,6 +916,8 @@ _preferencesRegistry: noRegistries: "レジストリは登録されていません。「新規保存」で現在のクライアント設定をサーバーに保存できます。" createdAt: "作成日時: {date} {time}" updatedAt: "更新日時: {date} {time}" + cannotLoad: "読み込みできません" + invalidFile: "ファイル形式が違います。" _registry: scope: "スコープ" diff --git a/packages/client/src/pages/settings/preferences-registry.vue b/packages/client/src/pages/settings/preferences-registry.vue index 8b5b1c00a5..c01e4ee83d 100644 --- a/packages/client/src/pages/settings/preferences-registry.vue +++ b/packages/client/src/pages/settings/preferences-registry.vue @@ -1,6 +1,9 @@ + + -- cgit v1.2.3-freya From 0f7cbb59228d3dfc86c153d25d8fcbf8e2a244e3 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 24 Sep 2022 10:39:17 +0900 Subject: fix type --- .../backend/src/server/api/endpoints/notes/state.ts | 4 ---- packages/client/src/scripts/get-note-menu.ts | 19 ++----------------- 2 files changed, 2 insertions(+), 21 deletions(-) (limited to 'packages/client/src') diff --git a/packages/backend/src/server/api/endpoints/notes/state.ts b/packages/backend/src/server/api/endpoints/notes/state.ts index a02b8d2559..d0036f0fb7 100644 --- a/packages/backend/src/server/api/endpoints/notes/state.ts +++ b/packages/backend/src/server/api/endpoints/notes/state.ts @@ -16,10 +16,6 @@ export const meta = { type: 'boolean', optional: false, nullable: false, }, - isWatching: { - type: 'boolean', - optional: false, nullable: false, - }, isMutedThread: { type: 'boolean', optional: false, nullable: false, diff --git a/packages/client/src/scripts/get-note-menu.ts b/packages/client/src/scripts/get-note-menu.ts index a5cf982066..692986cd55 100644 --- a/packages/client/src/scripts/get-note-menu.ts +++ b/packages/client/src/scripts/get-note-menu.ts @@ -60,12 +60,6 @@ export function getNoteMenu(props: { }); } - function toggleWatch(watch: boolean): void { - os.apiWithDialog(watch ? 'notes/watching/create' : 'notes/watching/delete', { - noteId: appearNote.id, - }); - } - function toggleThreadMute(mute: boolean): void { os.apiWithDialog(mute ? 'notes/thread-muting/create' : 'notes/thread-muting/delete', { noteId: appearNote.id, @@ -245,15 +239,6 @@ export function getNoteMenu(props: { text: i18n.ts.clip, action: () => clip(), }, - (appearNote.userId !== $i.id) ? statePromise.then(state => state.isWatching ? { - icon: 'fas fa-eye-slash', - text: i18n.ts.unwatch, - action: () => toggleWatch(false), - } : { - icon: 'fas fa-eye', - text: i18n.ts.watch, - action: () => toggleWatch(true), - }) : undefined, statePromise.then(state => state.isMutedThread ? { icon: 'fas fa-comment-slash', text: i18n.ts.unmuteThread, @@ -312,7 +297,7 @@ export function getNoteMenu(props: { }] : [] )] - .filter(x => x !== undefined); + .filter(x => x !== undefined); } else { menu = [{ icon: 'fas fa-copy', @@ -329,7 +314,7 @@ export function getNoteMenu(props: { window.open(appearNote.url || appearNote.uri, '_blank'); }, } : undefined] - .filter(x => x !== undefined); + .filter(x => x !== undefined); } if (noteActions.length > 0) { -- cgit v1.2.3-freya From 56a719f0d4725bce710337b07784cb186c763951 Mon Sep 17 00:00:00 2001 From: "Acid Chicken (硫酸鶏)" Date: Sun, 2 Oct 2022 20:57:17 +0900 Subject: fix: typo --- packages/client/src/components/MkYoutubePlayer.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'packages/client/src') diff --git a/packages/client/src/components/MkYoutubePlayer.vue b/packages/client/src/components/MkYoutubePlayer.vue index 0d8eb75b87..a6840ce647 100644 --- a/packages/client/src/components/MkYoutubePlayer.vue +++ b/packages/client/src/components/MkYoutubePlayer.vue @@ -2,7 +2,7 @@
-- cgit v1.2.3-freya From dae82514dc7fd6600650bbf29945691da1c256a5 Mon Sep 17 00:00:00 2001 From: hayabusa <10593623+m-hayabusa@users.noreply.github.com> Date: Thu, 13 Oct 2022 08:34:23 +0900 Subject: fix: 一部の状態のファイルをドロップしてアップロードできない場合がある問題を修正 (投稿フォーム以外についても) (#9114) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * dropEffectとeffectAllowedの関連付けを投稿フォームと同様に修正 * 文字列をDropできるようにしてしまったのを修正 --- packages/client/src/components/MkDrive.folder.vue | 17 ++++++++++++++++- packages/client/src/components/MkDrive.navFolder.vue | 17 ++++++++++++++++- packages/client/src/components/MkDrive.vue | 17 ++++++++++++++++- .../client/src/pages/messaging/messaging-room.form.vue | 17 ++++++++++++++++- packages/client/src/pages/messaging/messaging-room.vue | 17 ++++++++++++++++- 5 files changed, 80 insertions(+), 5 deletions(-) (limited to 'packages/client/src') diff --git a/packages/client/src/components/MkDrive.folder.vue b/packages/client/src/components/MkDrive.folder.vue index e55fa4f0f2..6c522c0862 100644 --- a/packages/client/src/components/MkDrive.folder.vue +++ b/packages/client/src/components/MkDrive.folder.vue @@ -90,7 +90,22 @@ function onDragover(ev: DragEvent) { const isDriveFolder = ev.dataTransfer.types[0] === _DATA_TRANSFER_DRIVE_FOLDER_; if (isFile || isDriveFile || isDriveFolder) { - ev.dataTransfer.dropEffect = ev.dataTransfer.effectAllowed === 'all' ? 'copy' : 'move'; + switch (ev.dataTransfer.effectAllowed) { + case 'all': + case 'uninitialized': + case 'copy': + case 'copyLink': + case 'copyMove': + ev.dataTransfer.dropEffect = 'copy'; + break; + case 'linkMove': + case 'move': + ev.dataTransfer.dropEffect = 'move'; + break; + default: + ev.dataTransfer.dropEffect = 'none'; + break; + } } else { ev.dataTransfer.dropEffect = 'none'; } diff --git a/packages/client/src/components/MkDrive.navFolder.vue b/packages/client/src/components/MkDrive.navFolder.vue index 5482703317..455c14f95e 100644 --- a/packages/client/src/components/MkDrive.navFolder.vue +++ b/packages/client/src/components/MkDrive.navFolder.vue @@ -58,7 +58,22 @@ function onDragover(ev: DragEvent) { const isDriveFolder = ev.dataTransfer.types[0] === _DATA_TRANSFER_DRIVE_FOLDER_; if (isFile || isDriveFile || isDriveFolder) { - ev.dataTransfer.dropEffect = ev.dataTransfer.effectAllowed === 'all' ? 'copy' : 'move'; + switch (ev.dataTransfer.effectAllowed) { + case 'all': + case 'uninitialized': + case 'copy': + case 'copyLink': + case 'copyMove': + ev.dataTransfer.dropEffect = 'copy'; + break; + case 'linkMove': + case 'move': + ev.dataTransfer.dropEffect = 'move'; + break; + default: + ev.dataTransfer.dropEffect = 'none'; + break; + } } else { ev.dataTransfer.dropEffect = 'none'; } diff --git a/packages/client/src/components/MkDrive.vue b/packages/client/src/components/MkDrive.vue index 002ca58d04..c79ab97000 100644 --- a/packages/client/src/components/MkDrive.vue +++ b/packages/client/src/components/MkDrive.vue @@ -196,7 +196,22 @@ function onDragover(ev: DragEvent): any { const isDriveFile = ev.dataTransfer.types[0] === _DATA_TRANSFER_DRIVE_FILE_; const isDriveFolder = ev.dataTransfer.types[0] === _DATA_TRANSFER_DRIVE_FOLDER_; if (isFile || isDriveFile || isDriveFolder) { - ev.dataTransfer.dropEffect = ev.dataTransfer.effectAllowed === 'all' ? 'copy' : 'move'; + switch (ev.dataTransfer.effectAllowed) { + case 'all': + case 'uninitialized': + case 'copy': + case 'copyLink': + case 'copyMove': + ev.dataTransfer.dropEffect = 'copy'; + break; + case 'linkMove': + case 'move': + ev.dataTransfer.dropEffect = 'move'; + break; + default: + ev.dataTransfer.dropEffect = 'none'; + break; + } } else { ev.dataTransfer.dropEffect = 'none'; } diff --git a/packages/client/src/pages/messaging/messaging-room.form.vue b/packages/client/src/pages/messaging/messaging-room.form.vue index 38bab90502..4589069df0 100644 --- a/packages/client/src/pages/messaging/messaging-room.form.vue +++ b/packages/client/src/pages/messaging/messaging-room.form.vue @@ -93,7 +93,22 @@ function onDragover(ev: DragEvent) { const isDriveFile = ev.dataTransfer.types[0] === _DATA_TRANSFER_DRIVE_FILE_; if (isFile || isDriveFile) { ev.preventDefault(); - ev.dataTransfer.dropEffect = ev.dataTransfer.effectAllowed === 'all' ? 'copy' : 'move'; + switch (ev.dataTransfer.effectAllowed) { + case 'all': + case 'uninitialized': + case 'copy': + case 'copyLink': + case 'copyMove': + ev.dataTransfer.dropEffect = 'copy'; + break; + case 'linkMove': + case 'move': + ev.dataTransfer.dropEffect = 'move'; + break; + default: + ev.dataTransfer.dropEffect = 'none'; + break; + } } } diff --git a/packages/client/src/pages/messaging/messaging-room.vue b/packages/client/src/pages/messaging/messaging-room.vue index a9da89ed95..37d4145ee8 100644 --- a/packages/client/src/pages/messaging/messaging-room.vue +++ b/packages/client/src/pages/messaging/messaging-room.vue @@ -154,7 +154,22 @@ function onDragover(ev: DragEvent) { const isDriveFile = ev.dataTransfer.types[0] === _DATA_TRANSFER_DRIVE_FILE_; if (isFile || isDriveFile) { - ev.dataTransfer.dropEffect = ev.dataTransfer.effectAllowed === 'all' ? 'copy' : 'move'; + switch (ev.dataTransfer.effectAllowed) { + case 'all': + case 'uninitialized': + case 'copy': + case 'copyLink': + case 'copyMove': + ev.dataTransfer.dropEffect = 'copy'; + break; + case 'linkMove': + case 'move': + ev.dataTransfer.dropEffect = 'move'; + break; + default: + ev.dataTransfer.dropEffect = 'none'; + break; + } } else { ev.dataTransfer.dropEffect = 'none'; } -- cgit v1.2.3-freya From 166067f746647242860ced48e05abb7b1fe971eb Mon Sep 17 00:00:00 2001 From: hayabusa <10593623+m-hayabusa@users.noreply.github.com> Date: Thu, 13 Oct 2022 08:34:57 +0900 Subject: add webhookId to api request (#9113) --- packages/client/src/pages/settings/webhook.edit.vue | 1 + 1 file changed, 1 insertion(+) (limited to 'packages/client/src') diff --git a/packages/client/src/pages/settings/webhook.edit.vue b/packages/client/src/pages/settings/webhook.edit.vue index 35f3cb1dab..5d41f3d087 100644 --- a/packages/client/src/pages/settings/webhook.edit.vue +++ b/packages/client/src/pages/settings/webhook.edit.vue @@ -78,6 +78,7 @@ async function save(): Promise { name, url, secret, + webhookId: props.webhookId, on: events, active, }); -- cgit v1.2.3-freya From 1309367884197f4f4d94686fddfbd99fa20262bc Mon Sep 17 00:00:00 2001 From: CyberRex Date: Thu, 13 Oct 2022 09:19:57 +0900 Subject: Add Cloudflare Turnstile CAPTCHA support (#9111) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add Cloudflare Turnstile CAPTCHA support * Update packages/client/src/components/MkCaptcha.vue Co-authored-by: Acid Chicken (硫酸鶏) Co-authored-by: Acid Chicken (硫酸鶏) --- locales/ja-JP.yml | 4 ++++ .../backend/migration/1664694635394-turnstile.js | 15 ++++++++++++++ packages/backend/src/core/CaptchaService.ts | 11 ++++++++++ packages/backend/src/models/entities/Meta.ts | 17 +++++++++++++++ .../backend/src/server/api/SignupApiService.ts | 6 ++++++ .../backend/src/server/api/endpoints/admin/meta.ts | 15 ++++++++++++++ .../src/server/api/endpoints/admin/update-meta.ts | 15 ++++++++++++++ packages/backend/src/server/api/endpoints/meta.ts | 11 ++++++++++ packages/client/src/components/MkCaptcha.vue | 4 +++- packages/client/src/components/MkSignup.vue | 6 ++++++ packages/client/src/pages/admin/bot-protection.vue | 24 +++++++++++++++++++++- packages/client/src/pages/admin/index.vue | 2 +- packages/client/src/pages/admin/security.vue | 3 +++ 13 files changed, 130 insertions(+), 3 deletions(-) create mode 100644 packages/backend/migration/1664694635394-turnstile.js (limited to 'packages/client/src') diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index cedfe7b1b2..2fd44588c0 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -349,6 +349,10 @@ recaptcha: "reCAPTCHA" enableRecaptcha: "reCAPTCHAを有効にする" recaptchaSiteKey: "サイトキー" recaptchaSecretKey: "シークレットキー" +turnstile: "Turnstile" +enableTurnstile: "Turnstileを有効にする" +turnstileSiteKey: "サイトキー" +turnstileSecretKey: "シークレットキー" avoidMultiCaptchaConfirm: "複数のCaptchaを使用すると干渉を起こす可能性があります。他のCaptchaを無効にしますか?キャンセルして複数のCaptchaを有効化したままにすることも可能です。" antennas: "アンテナ" manageAntennas: "アンテナの管理" diff --git a/packages/backend/migration/1664694635394-turnstile.js b/packages/backend/migration/1664694635394-turnstile.js new file mode 100644 index 0000000000..4a33443950 --- /dev/null +++ b/packages/backend/migration/1664694635394-turnstile.js @@ -0,0 +1,15 @@ +export class turnstile1664694635394 { + name = 'turnstile1664694635394' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "meta" ADD "enableTurnstile" boolean NOT NULL DEFAULT false`); + await queryRunner.query(`ALTER TABLE "meta" ADD "turnstileSiteKey" character varying(64)`); + await queryRunner.query(`ALTER TABLE "meta" ADD "turnstileSecretKey" character varying(64)`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "turnstileSecretKey"`); + await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "turnstileSiteKey"`); + await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "enableTurnstile"`); + } +} diff --git a/packages/backend/src/core/CaptchaService.ts b/packages/backend/src/core/CaptchaService.ts index 67b4b90061..acfa7d5910 100644 --- a/packages/backend/src/core/CaptchaService.ts +++ b/packages/backend/src/core/CaptchaService.ts @@ -66,5 +66,16 @@ export class CaptchaService { throw `hcaptcha-failed: ${errorCodes}`; } } + + public async verifyTurnstile(secret: string, response: string): Promise { + const result = await this.getCaptchaResponse('https://challenges.cloudflare.com/turnstile/v0/siteverify', secret, response).catch(e => { + throw `turnstile-request-failed: ${e}`; + }); + + if (result.success !== true) { + const errorCodes = result['error-codes'] ? result['error-codes'].join(', ') : ''; + throw `turnstile-failed: ${errorCodes}`; + } + } } diff --git a/packages/backend/src/models/entities/Meta.ts b/packages/backend/src/models/entities/Meta.ts index f528b7ac08..fb25e370d2 100644 --- a/packages/backend/src/models/entities/Meta.ts +++ b/packages/backend/src/models/entities/Meta.ts @@ -188,6 +188,23 @@ export class Meta { }) public recaptchaSecretKey: string | null; + @Column('boolean', { + default: false, + }) + public enableTurnstile: boolean; + + @Column('varchar', { + length: 64, + nullable: true, + }) + public turnstileSiteKey: string | null; + + @Column('varchar', { + length: 64, + nullable: true, + }) + public turnstileSecretKey: string | null; + @Column('enum', { enum: ['none', 'all', 'local', 'remote'], default: 'none', diff --git a/packages/backend/src/server/api/SignupApiService.ts b/packages/backend/src/server/api/SignupApiService.ts index 6552dac4bf..edb8e4e8e6 100644 --- a/packages/backend/src/server/api/SignupApiService.ts +++ b/packages/backend/src/server/api/SignupApiService.ts @@ -61,6 +61,12 @@ export class SignupApiService { ctx.throw(400, e); }); } + + if (instance.enableTurnstile && instance.turnstileSecretKey) { + await this.captchaService.verifyTurnstile(instance.turnstileSecretKey, body['turnstile-response']).catch(e => { + ctx.throw(400, e); + }); + } } const username = body['username']; diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts index 5b43c180d8..e5b8b6f8fe 100644 --- a/packages/backend/src/server/api/endpoints/admin/meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/meta.ts @@ -47,6 +47,14 @@ export const meta = { type: 'string', optional: false, nullable: true, }, + enableTurnstile: { + type: 'boolean', + optional: false, nullable: false, + }, + turnstileSiteKey: { + type: 'string', + optional: false, nullable: true, + }, swPublickey: { type: 'string', optional: false, nullable: true, @@ -197,6 +205,10 @@ export const meta = { type: 'string', optional: true, nullable: true, }, + turnstileSecretKey: { + type: 'string', + optional: true, nullable: true, + } sensitiveMediaDetection: { type: 'string', optional: true, nullable: false, @@ -374,6 +386,8 @@ export default class extends Endpoint { hcaptchaSiteKey: instance.hcaptchaSiteKey, enableRecaptcha: instance.enableRecaptcha, recaptchaSiteKey: instance.recaptchaSiteKey, + enableTurnstile: instance.enableTurnstile, + turnstileSiteKey: instance.turnstileSiteKey, swPublickey: instance.swPublicKey, themeColor: instance.themeColor, mascotImageUrl: instance.mascotImageUrl, @@ -400,6 +414,7 @@ export default class extends Endpoint { blockedHosts: instance.blockedHosts, hcaptchaSecretKey: instance.hcaptchaSecretKey, recaptchaSecretKey: instance.recaptchaSecretKey, + turnstileSecretKey: instance.turnstileSecretKey, sensitiveMediaDetection: instance.sensitiveMediaDetection, sensitiveMediaDetectionSensitivity: instance.sensitiveMediaDetectionSensitivity, setSensitiveFlagAutomatically: instance.setSensitiveFlagAutomatically, diff --git a/packages/backend/src/server/api/endpoints/admin/update-meta.ts b/packages/backend/src/server/api/endpoints/admin/update-meta.ts index 48fae9b947..2a19b1df5f 100644 --- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts @@ -52,6 +52,9 @@ export const paramDef = { enableRecaptcha: { type: 'boolean' }, recaptchaSiteKey: { type: 'string', nullable: true }, recaptchaSecretKey: { type: 'string', nullable: true }, + enableTurnstile: { type: 'boolean' }, + turnstileSiteKey: { type: 'string', nullable: true }, + turnstileSecretKey: { type: 'string', nullable: true }, sensitiveMediaDetection: { type: 'string', enum: ['none', 'all', 'local', 'remote'] }, sensitiveMediaDetectionSensitivity: { type: 'string', enum: ['medium', 'low', 'high', 'veryLow', 'veryHigh'] }, setSensitiveFlagAutomatically: { type: 'boolean' }, @@ -231,6 +234,18 @@ export default class extends Endpoint { set.recaptchaSecretKey = ps.recaptchaSecretKey; } + if (ps.enableTurnstile !== undefined) { + set.enableTurnstile = ps.enableTurnstile; + } + + if (ps.turnstileSiteKey !== undefined) { + set.turnstileSiteKey = ps.turnstileSiteKey; + } + + if (ps.turnstileSecretKey !== undefined) { + set.turnstileSecretKey = ps.turnstileSecretKey; + } + if (ps.sensitiveMediaDetection !== undefined) { set.sensitiveMediaDetection = ps.sensitiveMediaDetection; } diff --git a/packages/backend/src/server/api/endpoints/meta.ts b/packages/backend/src/server/api/endpoints/meta.ts index 5c09c33941..f2e6e6aea8 100644 --- a/packages/backend/src/server/api/endpoints/meta.ts +++ b/packages/backend/src/server/api/endpoints/meta.ts @@ -119,6 +119,14 @@ export const meta = { type: 'string', optional: false, nullable: true, }, + enableTurnstile: { + type: 'boolean', + optional: false, nullable: false, + }, + turnstileSiteKey: { + type: 'string', + optional: false, nullable: true, + }, swPublickey: { type: 'string', optional: false, nullable: true, @@ -372,6 +380,8 @@ export default class extends Endpoint { hcaptchaSiteKey: instance.hcaptchaSiteKey, enableRecaptcha: instance.enableRecaptcha, recaptchaSiteKey: instance.recaptchaSiteKey, + enableTurnstile: instance.enableTurnstile, + turnstileSiteKey: instance.turnstileSiteKey, swPublickey: instance.swPublicKey, themeColor: instance.themeColor, mascotImageUrl: instance.mascotImageUrl, @@ -423,6 +433,7 @@ export default class extends Endpoint { elasticsearch: this.config.elasticsearch ? true : false, hcaptcha: instance.enableHcaptcha, recaptcha: instance.enableRecaptcha, + turnstile: instance.enableTurnstile, objectStorage: instance.useObjectStorage, twitter: instance.enableTwitterIntegration, github: instance.enableGithubIntegration, diff --git a/packages/client/src/components/MkCaptcha.vue b/packages/client/src/components/MkCaptcha.vue index 7360734914..b399bb8921 100644 --- a/packages/client/src/components/MkCaptcha.vue +++ b/packages/client/src/components/MkCaptcha.vue @@ -20,7 +20,7 @@ type Captcha = { getResponse(id: string): string; }; -type CaptchaProvider = 'hcaptcha' | 'recaptcha'; +type CaptchaProvider = 'hcaptcha' | 'recaptcha' | 'turnstile'; type CaptchaContainer = { readonly [_ in CaptchaProvider]?: Captcha; @@ -48,6 +48,7 @@ const variable = computed(() => { switch (props.provider) { case 'hcaptcha': return 'hcaptcha'; case 'recaptcha': return 'grecaptcha'; + case 'turnstile': return 'turnstile'; } }); @@ -57,6 +58,7 @@ const src = computed(() => { switch (props.provider) { case 'hcaptcha': return 'https://js.hcaptcha.com/1/api.js?render=explicit&recaptchacompat=off'; case 'recaptcha': return 'https://www.recaptcha.net/recaptcha/api.js?render=explicit'; + case 'turnstile': return 'https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit'; } }); diff --git a/packages/client/src/components/MkSignup.vue b/packages/client/src/components/MkSignup.vue index a324bb6f5a..c1f91b18c2 100644 --- a/packages/client/src/components/MkSignup.vue +++ b/packages/client/src/components/MkSignup.vue @@ -59,6 +59,7 @@ + {{ i18n.ts.start }} @@ -92,6 +93,7 @@ const host = toUnicode(config.host); let hcaptcha = $ref(); let recaptcha = $ref(); +let turnstile = $ref(); let username: string = $ref(''); let password: string = $ref(''); @@ -106,12 +108,14 @@ let submitting: boolean = $ref(false); let ToSAgreement: boolean = $ref(false); let hCaptchaResponse = $ref(null); let reCaptchaResponse = $ref(null); +let turnstileResponse = $ref(null); const shouldDisableSubmitting = $computed((): boolean => { return submitting || instance.tosUrl && !ToSAgreement || instance.enableHcaptcha && !hCaptchaResponse || instance.enableRecaptcha && !reCaptchaResponse || + instance.enableTurnstile && !turnstileResponse || passwordRetypeState === 'not-match'; }); @@ -198,6 +202,7 @@ function onSubmit(): void { invitationCode, 'hcaptcha-response': hCaptchaResponse, 'g-recaptcha-response': reCaptchaResponse, + 'turnstile-response': turnstileResponse, }).then(() => { if (instance.emailRequiredForSignup) { os.alert({ @@ -222,6 +227,7 @@ function onSubmit(): void { submitting = false; hcaptcha.reset?.(); recaptcha.reset?.(); + turnstile.reset?.(); os.alert({ type: 'error', diff --git a/packages/client/src/pages/admin/bot-protection.vue b/packages/client/src/pages/admin/bot-protection.vue index 72d5e379de..484a9d1a1a 100644 --- a/packages/client/src/pages/admin/bot-protection.vue +++ b/packages/client/src/pages/admin/bot-protection.vue @@ -6,6 +6,7 @@ + + {{ i18n.ts.save }}
@@ -61,6 +76,8 @@ let hcaptchaSiteKey: string | null = $ref(null); let hcaptchaSecretKey: string | null = $ref(null); let recaptchaSiteKey: string | null = $ref(null); let recaptchaSecretKey: string | null = $ref(null); +let turnstileSiteKey: string | null = $ref(null); +let turnstileSecretKey: string | null = $ref(null); async function init() { const meta = await os.api('admin/meta'); @@ -68,8 +85,10 @@ async function init() { hcaptchaSecretKey = meta.hcaptchaSecretKey; recaptchaSiteKey = meta.recaptchaSiteKey; recaptchaSecretKey = meta.recaptchaSecretKey; + turnstileSiteKey = meta.turnstileSiteKey; + turnstileSecretKey = meta.turnstileSecretKey; - provider = meta.enableHcaptcha ? 'hcaptcha' : meta.enableRecaptcha ? 'recaptcha' : null; + provider = meta.enableHcaptcha ? 'hcaptcha' : meta.enableRecaptcha ? 'recaptcha' : meta.enableTurnstile ? 'turnstile' : null; } function save() { @@ -80,6 +99,9 @@ function save() { enableRecaptcha: provider === 'recaptcha', recaptchaSiteKey, recaptchaSecretKey, + enableTurnstile: provider === 'turnstile', + turnstileSiteKey, + turnstileSecretKey, }).then(() => { fetchInstance(); }); diff --git a/packages/client/src/pages/admin/index.vue b/packages/client/src/pages/admin/index.vue index 9200b5d547..20f82bba28 100644 --- a/packages/client/src/pages/admin/index.vue +++ b/packages/client/src/pages/admin/index.vue @@ -53,7 +53,7 @@ let view = $ref(null); let el = $ref(null); let pageProps = $ref({}); let noMaintainerInformation = isEmpty(instance.maintainerName) || isEmpty(instance.maintainerEmail); -let noBotProtection = !instance.disableRegistration && !instance.enableHcaptcha && !instance.enableRecaptcha; +let noBotProtection = !instance.disableRegistration && !instance.enableHcaptcha && !instance.enableRecaptcha && !instance.enableTurnstile; let noEmailServer = !instance.enableEmail; let thereIsUnresolvedAbuseReport = $ref(false); let currentPage = $computed(() => router.currentRef.value.child); diff --git a/packages/client/src/pages/admin/security.vue b/packages/client/src/pages/admin/security.vue index c36cedb312..65d079c2cf 100644 --- a/packages/client/src/pages/admin/security.vue +++ b/packages/client/src/pages/admin/security.vue @@ -9,6 +9,7 @@ + @@ -120,6 +121,7 @@ import { definePageMetadata } from '@/scripts/page-metadata'; let summalyProxy: string = $ref(''); let enableHcaptcha: boolean = $ref(false); let enableRecaptcha: boolean = $ref(false); +let enableTurnstile: boolean = $ref(false); let sensitiveMediaDetection: string = $ref('none'); let sensitiveMediaDetectionSensitivity: number = $ref(0); let setSensitiveFlagAutomatically: boolean = $ref(false); @@ -132,6 +134,7 @@ async function init() { summalyProxy = meta.summalyProxy; enableHcaptcha = meta.enableHcaptcha; enableRecaptcha = meta.enableRecaptcha; + enableTurnstile = meta.enableTurnstile; sensitiveMediaDetection = meta.sensitiveMediaDetection; sensitiveMediaDetectionSensitivity = meta.sensitiveMediaDetectionSensitivity === 'veryLow' ? 0 : -- cgit v1.2.3-freya From 24d18a7b19d6ee803578fc0e044fd377fcf587ef Mon Sep 17 00:00:00 2001 From: futchitwo <74236683+futchitwo@users.noreply.github.com> Date: Fri, 4 Nov 2022 22:02:35 +0900 Subject: fix(client): clarify to use props.url (#9143) --- packages/client/src/components/global/MkUrl.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'packages/client/src') diff --git a/packages/client/src/components/global/MkUrl.vue b/packages/client/src/components/global/MkUrl.vue index 37c0212eaa..740ce29080 100644 --- a/packages/client/src/components/global/MkUrl.vue +++ b/packages/client/src/components/global/MkUrl.vue @@ -1,6 +1,6 @@
diff --git a/packages/client/src/pages/timeline.vue b/packages/client/src/pages/timeline.vue index 9d42997025..8c2dc92ccd 100644 --- a/packages/client/src/pages/timeline.vue +++ b/packages/client/src/pages/timeline.vue @@ -114,22 +114,22 @@ const headerActions = $computed(() => []); const headerTabs = $computed(() => [{ key: 'home', title: i18n.ts._timelines.home, - icon: 'fas fa-home', + icon: 'ti ti-home-2', iconOnly: true, }, ...(isLocalTimelineAvailable ? [{ key: 'local', title: i18n.ts._timelines.local, - icon: 'fas fa-comments', + icon: 'ti ti-messages', iconOnly: true, }, { key: 'social', title: i18n.ts._timelines.social, - icon: 'fas fa-share-alt', + icon: 'ti ti-share', iconOnly: true, }] : []), ...(isGlobalTimelineAvailable ? [{ key: 'global', title: i18n.ts._timelines.global, - icon: 'fas fa-globe', + icon: 'ti ti-world', iconOnly: true, }] : []), { icon: 'fas fa-list-ul', @@ -150,7 +150,7 @@ const headerTabs = $computed(() => [{ definePageMetadata(computed(() => ({ title: i18n.ts.timeline, - icon: src === 'local' ? 'fas fa-comments' : src === 'social' ? 'fas fa-share-alt' : src === 'global' ? 'fas fa-globe' : 'fas fa-home', + icon: src === 'local' ? 'ti ti-messages' : src === 'social' ? 'ti ti-share' : src === 'global' ? 'ti ti-world' : 'ti ti-home-2', }))); diff --git a/packages/client/src/pages/user-list-timeline.vue b/packages/client/src/pages/user-list-timeline.vue index 4a534e47ba..773b20d80c 100644 --- a/packages/client/src/pages/user-list-timeline.vue +++ b/packages/client/src/pages/user-list-timeline.vue @@ -69,7 +69,7 @@ const headerActions = $computed(() => list ? [{ text: i18n.ts.jumpToSpecifiedDate, handler: timetravel, }, { - icon: 'fas fa-cog', + icon: 'ti ti-settings', text: i18n.ts.settings, handler: settings, }] : []); diff --git a/packages/client/src/pages/user/home.vue b/packages/client/src/pages/user/home.vue index 352db4616e..98c7e9d116 100644 --- a/packages/client/src/pages/user/home.vue +++ b/packages/client/src/pages/user/home.vue @@ -25,7 +25,7 @@ {{ i18n.ts.followsYou }}
- +
diff --git a/packages/client/src/pages/user/index.activity.vue b/packages/client/src/pages/user/index.activity.vue index 630a2cea7d..7f25176e82 100644 --- a/packages/client/src/pages/user/index.activity.vue +++ b/packages/client/src/pages/user/index.activity.vue @@ -3,7 +3,7 @@ diff --git a/packages/client/src/pages/user/index.vue b/packages/client/src/pages/user/index.vue index 7e635f8b2e..21f1d25dfd 100644 --- a/packages/client/src/pages/user/index.vue +++ b/packages/client/src/pages/user/index.vue @@ -69,7 +69,7 @@ const headerActions = $computed(() => []); const headerTabs = $computed(() => user ? [{ key: 'home', title: i18n.ts.overview, - icon: 'fas fa-home', + icon: 'ti ti-home-2', }, ...($i && ($i.id === user.id)) || user.publicReactions ? [{ key: 'reactions', title: i18n.ts.reaction, @@ -77,7 +77,7 @@ const headerTabs = $computed(() => user ? [{ }] : [], { key: 'clips', title: i18n.ts.clips, - icon: 'fas fa-paperclip', + icon: 'ti ti-paperclip', }, { key: 'pages', title: i18n.ts.pages, diff --git a/packages/client/src/pages/welcome.entrance.a.vue b/packages/client/src/pages/welcome.entrance.a.vue index 827162a0c0..119ba96ec9 100644 --- a/packages/client/src/pages/welcome.entrance.a.vue +++ b/packages/client/src/pages/welcome.entrance.a.vue @@ -15,7 +15,7 @@
- +

diff --git a/packages/client/src/pages/welcome.entrance.c.vue b/packages/client/src/pages/welcome.entrance.c.vue index a590834a4c..535580e723 100644 --- a/packages/client/src/pages/welcome.entrance.c.vue +++ b/packages/client/src/pages/welcome.entrance.c.vue @@ -41,7 +41,7 @@

- +