summaryrefslogtreecommitdiff
path: root/packages/frontend/src
diff options
context:
space:
mode:
authorかっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>2023-10-08 17:56:44 +0900
committerGitHub <noreply@github.com>2023-10-08 17:56:44 +0900
commit4bbfc98883c5d26a8958f37928909579b888143d (patch)
tree4b3bc796c96b8b2c5c541f2c37eae2433046e195 /packages/frontend/src
parentperf(backend): improve hybrid-timeline performance (diff)
downloadmisskey-4bbfc98883c5d26a8958f37928909579b888143d.tar.gz
misskey-4bbfc98883c5d26a8958f37928909579b888143d.tar.bz2
misskey-4bbfc98883c5d26a8958f37928909579b888143d.zip
Feat: タイムライン更新中に広告を挿入 (#11989)
* Feat: タイムライン更新中に広告を挿入 * 翻訳を変更 * Run api extractor * fix api extractor * Update locales/ja-JP.yml Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> * confirm -> mkinfo * MkInputにmin, maxを指定できるように * 負の値が指定されたら何もしない --------- Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
Diffstat (limited to 'packages/frontend/src')
-rw-r--r--packages/frontend/src/components/MkInput.vue4
-rw-r--r--packages/frontend/src/components/MkTimeline.vue9
-rw-r--r--packages/frontend/src/pages/admin/settings.vue28
3 files changed, 37 insertions, 4 deletions
diff --git a/packages/frontend/src/components/MkInput.vue b/packages/frontend/src/components/MkInput.vue
index 315ce958c5..9490d80428 100644
--- a/packages/frontend/src/components/MkInput.vue
+++ b/packages/frontend/src/components/MkInput.vue
@@ -23,6 +23,8 @@ SPDX-License-Identifier: AGPL-3.0-only
:spellcheck="spellcheck"
:step="step"
:list="id"
+ :min="min"
+ :max="max"
@focus="focused = true"
@blur="focused = false"
@keydown="onKeydown($event)"
@@ -59,6 +61,8 @@ const props = defineProps<{
spellcheck?: boolean;
step?: any;
datalist?: string[];
+ min?: string;
+ max?: string;
inline?: boolean;
debounce?: boolean;
manualSave?: boolean;
diff --git a/packages/frontend/src/components/MkTimeline.vue b/packages/frontend/src/components/MkTimeline.vue
index c4a34667ef..4e71c048b2 100644
--- a/packages/frontend/src/components/MkTimeline.vue
+++ b/packages/frontend/src/components/MkTimeline.vue
@@ -13,6 +13,7 @@ import MkNotes from '@/components/MkNotes.vue';
import { useStream } from '@/stream.js';
import * as sound from '@/scripts/sound.js';
import { $i } from '@/account.js';
+import { instance } from '@/instance.js';
import { defaultStore } from '@/store.js';
const props = withDefaults(defineProps<{
@@ -38,7 +39,15 @@ provide('inChannel', computed(() => props.src === 'channel'));
const tlComponent: InstanceType<typeof MkNotes> = $ref();
+let tlNotesCount = 0;
+
const prepend = note => {
+ tlNotesCount++;
+
+ if (instance.notesPerOneAd > 0 && tlNotesCount % instance.notesPerOneAd === 0) {
+ note._shouldInsertAd_ = true;
+ }
+
tlComponent.pagingComponent?.prepend(note);
emit('note');
diff --git a/packages/frontend/src/pages/admin/settings.vue b/packages/frontend/src/pages/admin/settings.vue
index 2e3f1611dc..2db0dd5c3a 100644
--- a/packages/frontend/src/pages/admin/settings.vue
+++ b/packages/frontend/src/pages/admin/settings.vue
@@ -107,6 +107,22 @@ SPDX-License-Identifier: AGPL-3.0-only
</MkInput>
</div>
</FormSection>
+
+ <FormSection>
+ <template #label>{{ i18n.ts._ad.adsSettings }}</template>
+
+ <div class="_gaps_m">
+ <div class="_gaps_s">
+ <MkInput v-model="notesPerOneAd" min="0" type="number">
+ <template #label>{{ i18n.ts._ad.notesPerOneAd }}</template>
+ <template #caption>{{ i18n.ts._ad.setZeroToDisable }}</template>
+ </MkInput>
+ <MkInfo v-if="notesPerOneAd > 0 && notesPerOneAd < 20" :warn="true">
+ {{ i18n.ts._ad.adsTooClose }}
+ </MkInfo>
+ </div>
+ </div>
+ </FormSection>
</div>
</FormSuspense>
</MkSpacer>
@@ -127,6 +143,7 @@ import XHeader from './_header_.vue';
import MkSwitch from '@/components/MkSwitch.vue';
import MkInput from '@/components/MkInput.vue';
import MkTextarea from '@/components/MkTextarea.vue';
+import MkInfo from '@/components/MkInfo.vue';
import FormSection from '@/components/form/section.vue';
import FormSplit from '@/components/form/split.vue';
import FormSuspense from '@/components/form/suspense.vue';
@@ -152,6 +169,7 @@ let perLocalUserUserTimelineCacheMax: number = $ref(0);
let perRemoteUserUserTimelineCacheMax: number = $ref(0);
let perUserHomeTimelineCacheMax: number = $ref(0);
let perUserListTimelineCacheMax: number = $ref(0);
+let notesPerOneAd: number = $ref(0);
async function init(): Promise<void> {
const meta = await os.api('admin/meta');
@@ -171,10 +189,11 @@ async function init(): Promise<void> {
perRemoteUserUserTimelineCacheMax = meta.perRemoteUserUserTimelineCacheMax;
perUserHomeTimelineCacheMax = meta.perUserHomeTimelineCacheMax;
perUserListTimelineCacheMax = meta.perUserListTimelineCacheMax;
+ notesPerOneAd = meta.notesPerOneAd;
}
-function save(): void {
- os.apiWithDialog('admin/update-meta', {
+async function save(): void {
+ await os.apiWithDialog('admin/update-meta', {
name,
shortName: shortName === '' ? null : shortName,
description,
@@ -191,9 +210,10 @@ function save(): void {
perRemoteUserUserTimelineCacheMax,
perUserHomeTimelineCacheMax,
perUserListTimelineCacheMax,
- }).then(() => {
- fetchInstance();
+ notesPerOneAd,
});
+
+ fetchInstance();
}
const headerTabs = $computed(() => []);