This commit is contained in:
syuilo 2023-08-13 15:06:32 +09:00
parent dae130c7c5
commit 5dd475f472
4 changed files with 30 additions and 8 deletions

2
locales/index.d.ts vendored
View File

@ -1111,6 +1111,8 @@ export interface Locale {
"needConfirmationToReadDescription": string; "needConfirmationToReadDescription": string;
"end": string; "end": string;
"tooManyActiveAnnouncementDescription": string; "tooManyActiveAnnouncementDescription": string;
"readConfirmTitle": string;
"readConfirmText": string;
}; };
"_initialAccountSetting": { "_initialAccountSetting": {
"accountCreated": string; "accountCreated": string;

View File

@ -1109,6 +1109,8 @@ _announcement:
needConfirmationToReadDescription: "有効にすると、このお知らせを既読にする際に確認ダイアログが表示されます。また、一括既読操作の対象になりません。" needConfirmationToReadDescription: "有効にすると、このお知らせを既読にする際に確認ダイアログが表示されます。また、一括既読操作の対象になりません。"
end: "お知らせを終了" end: "お知らせを終了"
tooManyActiveAnnouncementDescription: "アクティブなお知らせが多いため、UXが低下する可能性があります。終了したお知らせはアーカイブすることを検討してください。" tooManyActiveAnnouncementDescription: "アクティブなお知らせが多いため、UXが低下する可能性があります。終了したお知らせはアーカイブすることを検討してください。"
readConfirmTitle: "既読にしますか?"
readConfirmText: "「{title}」の内容を読み、既読にします。"
_initialAccountSetting: _initialAccountSetting:
accountCreated: "アカウントの作成が完了しました!" accountCreated: "アカウントの作成が完了しました!"

View File

@ -38,7 +38,16 @@ const props = withDefaults(defineProps<{
const rootEl = shallowRef<HTMLDivElement>(); const rootEl = shallowRef<HTMLDivElement>();
const modal = shallowRef<InstanceType<typeof MkModal>>(); const modal = shallowRef<InstanceType<typeof MkModal>>();
function ok() { async function ok() {
if (props.announcement.needConfirmationToRead) {
const confirm = await os.confirm({
type: 'question',
title: i18n.ts._announcement.readConfirmTitle,
text: i18n.t('_announcement.readConfirmText', { title: props.announcement.title }),
});
if (confirm.canceled) return;
}
modal.value.close(); modal.value.close();
os.api('i/read-announcement', { announcementId: props.announcement.id }); os.api('i/read-announcement', { announcementId: props.announcement.id });
updateAccount({ updateAccount({

View File

@ -30,7 +30,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</div> </div>
</div> </div>
<div v-if="tab !== 'past' && $i && !announcement.isRead" :class="$style.footer"> <div v-if="tab !== 'past' && $i && !announcement.isRead" :class="$style.footer">
<MkButton primary @click="read(announcement.id)"><i class="ti ti-check"></i> {{ i18n.ts.gotIt }}</MkButton> <MkButton primary @click="read(announcement)"><i class="ti ti-check"></i> {{ i18n.ts.gotIt }}</MkButton>
</div> </div>
</section> </section>
</MkPagination> </MkPagination>
@ -69,15 +69,24 @@ const paginationEl = ref<InstanceType<typeof MkPagination>>();
const tab = ref('current'); const tab = ref('current');
function read(id: string) { async function read(announcement) {
if (!paginationEl.value) return; if (announcement.needConfirmationToRead) {
paginationEl.value.updateItem(id, announcement => { const confirm = await os.confirm({
announcement.isRead = true; type: 'question',
return announcement; title: i18n.ts._announcement.readConfirmTitle,
text: i18n.t('_announcement.readConfirmText', { title: announcement.title }),
}); });
os.api('i/read-announcement', { announcementId: id }); if (confirm.canceled) return;
}
if (!paginationEl.value) return;
paginationEl.value.updateItem(announcement.id, a => {
a.isRead = true;
return a;
});
os.api('i/read-announcement', { announcementId: announcement.id });
updateAccount({ updateAccount({
unreadAnnouncements: $i!.unreadAnnouncements.filter(a => a.id !== id), unreadAnnouncements: $i!.unreadAnnouncements.filter(a => a.id !== announcement.id),
}); });
} }