常にサーバー下書きに保存し、上限を超えた場合のみ尋ねるように
This commit is contained in:
parent
6bd0d89ef9
commit
2f7cfde739
|
@ -11916,13 +11916,13 @@ export interface Locale extends ILocale {
|
|||
*/
|
||||
"select": string;
|
||||
/**
|
||||
* サーバーに下書きを保存しますか?
|
||||
* 下書きの作成可能数を超えています。
|
||||
*/
|
||||
"saveConfirm": string;
|
||||
"cannotCreateDraftAnymore": string;
|
||||
/**
|
||||
* ここで「保存しない」を選択しても、下書きは端末内に保存されます。
|
||||
* サーバーに下書きを保存するには、下書きを削除する必要があります。ここで「保存しない」を選択しても、下書きは端末内に保存されます。
|
||||
*/
|
||||
"saveConfirmDescription": string;
|
||||
"cannotCreateDraftAnymoreDescription": string;
|
||||
/**
|
||||
* 下書きを削除
|
||||
*/
|
||||
|
|
|
@ -3187,8 +3187,8 @@ _serverSetupWizard:
|
|||
|
||||
_drafts:
|
||||
select: "下書きを選択"
|
||||
saveConfirm: "サーバーに下書きを保存しますか?"
|
||||
saveConfirmDescription: "ここで「保存しない」を選択しても、下書きは端末内に保存されます。"
|
||||
cannotCreateDraftAnymore: "下書きの作成可能数を超えています。"
|
||||
cannotCreateDraftAnymoreDescription: "サーバーに下書きを保存するには、下書きを削除する必要があります。ここで「保存しない」を選択しても、下書きは端末内に保存されます。"
|
||||
delete: "下書きを削除"
|
||||
deleteAreYouSure: "下書きを削除しますか?"
|
||||
noDrafts: "下書きはありません"
|
||||
|
|
|
@ -310,6 +310,7 @@ export * as 'notes/drafts' from './endpoints/notes/drafts/list.js';
|
|||
export * as 'notes/drafts/create' from './endpoints/notes/drafts/create.js';
|
||||
export * as 'notes/drafts/delete' from './endpoints/notes/drafts/delete.js';
|
||||
export * as 'notes/drafts/update' from './endpoints/notes/drafts/update.js';
|
||||
export * as 'notes/drafts/count' from './endpoints/notes/drafts/count.js';
|
||||
export * as 'notes/favorites/create' from './endpoints/notes/favorites/create.js';
|
||||
export * as 'notes/favorites/delete' from './endpoints/notes/favorites/delete.js';
|
||||
export * as 'notes/featured' from './endpoints/notes/featured.js';
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
import { Inject, Injectable } from '@nestjs/common';
|
||||
import { Endpoint } from '@/server/api/endpoint-base.js';
|
||||
import type { NoteDraftsRepository } from '@/models/_.js';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
|
||||
export const meta = {
|
||||
tags: ['notes', 'drafts'],
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
prohibitMoved: true,
|
||||
|
||||
kind: 'read:account',
|
||||
|
||||
res: {
|
||||
type: 'number',
|
||||
optional: false, nullable: false,
|
||||
description: 'The number of drafts',
|
||||
},
|
||||
|
||||
errors: {
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
type: 'object',
|
||||
properties: {
|
||||
},
|
||||
required: [],
|
||||
} as const;
|
||||
|
||||
@Injectable()
|
||||
export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
|
||||
constructor(
|
||||
@Inject(DI.noteDraftsRepository)
|
||||
private noteDraftsRepository: NoteDraftsRepository,
|
||||
) {
|
||||
super(meta, paramDef, async (ps, me) => {
|
||||
const count = await this.noteDraftsRepository.createQueryBuilder('drafts')
|
||||
.where('drafts.userId = :meId', { meId: me.id })
|
||||
.getCount();
|
||||
|
||||
return count;
|
||||
});
|
||||
}
|
||||
}
|
|
@ -996,19 +996,19 @@ async function post(ev?: MouseEvent) {
|
|||
});
|
||||
}
|
||||
|
||||
async function confirmSavingServerDraft(ev?: Event) {
|
||||
if (canSaveAsServerDraft.value) {
|
||||
async function handleSavingServerDraft(ev?: Event) {
|
||||
const draftCount = await misskeyApi('notes/drafts/count');
|
||||
const isOver = draftCount >= $i.policies.noteDraftLimit;
|
||||
if (canSaveAsServerDraft.value && !isOver) {
|
||||
return await saveServerDraft(true);
|
||||
} else if (canSaveAsServerDraft.value) {
|
||||
ev?.stopPropagation();
|
||||
|
||||
const { canceled, result } = await os.actions({
|
||||
type: 'question',
|
||||
title: i18n.ts._drafts.saveConfirm,
|
||||
text: i18n.ts._drafts.saveConfirmDescription,
|
||||
title: i18n.ts._drafts.cannotCreateDraftAnymore,
|
||||
text: i18n.ts._drafts.cannotCreateDraftAnymoreDescription,
|
||||
actions: [{
|
||||
value: 'save' as const,
|
||||
text: i18n.ts.save,
|
||||
primary: true,
|
||||
}, {
|
||||
value: 'discard' as const,
|
||||
text: i18n.ts.dontSave,
|
||||
}, {
|
||||
|
@ -1019,8 +1019,6 @@ async function confirmSavingServerDraft(ev?: Event) {
|
|||
|
||||
if (canceled || result === 'cancel') {
|
||||
return { canClosePostForm: false };
|
||||
} else if (result === 'save') {
|
||||
return await saveServerDraft(true);
|
||||
} else {
|
||||
return { canClosePostForm: true };
|
||||
}
|
||||
|
@ -1030,14 +1028,14 @@ async function confirmSavingServerDraft(ev?: Event) {
|
|||
}
|
||||
|
||||
async function esc(ev: Event) {
|
||||
const { canClosePostForm } = await confirmSavingServerDraft(ev);
|
||||
const { canClosePostForm } = await handleSavingServerDraft(ev);
|
||||
if (canClosePostForm) {
|
||||
emit('esc');
|
||||
}
|
||||
}
|
||||
|
||||
async function cancel() {
|
||||
const { canClosePostForm } = await confirmSavingServerDraft();
|
||||
const { canClosePostForm } = await handleSavingServerDraft();
|
||||
if (canClosePostForm) {
|
||||
emit('cancel');
|
||||
}
|
||||
|
|
|
@ -1935,6 +1935,7 @@ declare namespace entities {
|
|||
NotesDeleteRequest,
|
||||
NotesDraftsRequest,
|
||||
NotesDraftsResponse,
|
||||
NotesDraftsCountResponse,
|
||||
NotesDraftsCreateRequest,
|
||||
NotesDraftsCreateResponse,
|
||||
NotesDraftsDeleteRequest,
|
||||
|
@ -2984,6 +2985,9 @@ type NotesCreateResponse = operations['notes___create']['responses']['200']['con
|
|||
// @public (undocumented)
|
||||
type NotesDeleteRequest = operations['notes___delete']['requestBody']['content']['application/json'];
|
||||
|
||||
// @public (undocumented)
|
||||
type NotesDraftsCountResponse = operations['notes___drafts___count']['responses']['200']['content']['application/json'];
|
||||
|
||||
// @public (undocumented)
|
||||
type NotesDraftsCreateRequest = operations['notes___drafts___create']['requestBody']['content']['application/json'];
|
||||
|
||||
|
|
|
@ -3582,6 +3582,17 @@ declare module '../api.js' {
|
|||
credential?: string | null,
|
||||
): Promise<SwitchCaseResponseType<E, P>>;
|
||||
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:account*
|
||||
*/
|
||||
request<E extends 'notes/drafts/count', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
params: P,
|
||||
credential?: string | null,
|
||||
): Promise<SwitchCaseResponseType<E, P>>;
|
||||
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
|
|
|
@ -485,6 +485,7 @@ import type {
|
|||
NotesDeleteRequest,
|
||||
NotesDraftsRequest,
|
||||
NotesDraftsResponse,
|
||||
NotesDraftsCountResponse,
|
||||
NotesDraftsCreateRequest,
|
||||
NotesDraftsCreateResponse,
|
||||
NotesDraftsDeleteRequest,
|
||||
|
@ -964,6 +965,7 @@ export type Endpoints = {
|
|||
'notes/create': { req: NotesCreateRequest; res: NotesCreateResponse };
|
||||
'notes/delete': { req: NotesDeleteRequest; res: EmptyResponse };
|
||||
'notes/drafts': { req: NotesDraftsRequest; res: NotesDraftsResponse };
|
||||
'notes/drafts/count': { req: EmptyRequest; res: NotesDraftsCountResponse };
|
||||
'notes/drafts/create': { req: NotesDraftsCreateRequest; res: NotesDraftsCreateResponse };
|
||||
'notes/drafts/delete': { req: NotesDraftsDeleteRequest; res: EmptyResponse };
|
||||
'notes/drafts/update': { req: NotesDraftsUpdateRequest; res: NotesDraftsUpdateResponse };
|
||||
|
|
|
@ -488,6 +488,7 @@ export type NotesCreateResponse = operations['notes___create']['responses']['200
|
|||
export type NotesDeleteRequest = operations['notes___delete']['requestBody']['content']['application/json'];
|
||||
export type NotesDraftsRequest = operations['notes___drafts']['requestBody']['content']['application/json'];
|
||||
export type NotesDraftsResponse = operations['notes___drafts']['responses']['200']['content']['application/json'];
|
||||
export type NotesDraftsCountResponse = operations['notes___drafts___count']['responses']['200']['content']['application/json'];
|
||||
export type NotesDraftsCreateRequest = operations['notes___drafts___create']['requestBody']['content']['application/json'];
|
||||
export type NotesDraftsCreateResponse = operations['notes___drafts___create']['responses']['200']['content']['application/json'];
|
||||
export type NotesDraftsDeleteRequest = operations['notes___drafts___delete']['requestBody']['content']['application/json'];
|
||||
|
|
|
@ -3089,6 +3089,15 @@ export type paths = {
|
|||
*/
|
||||
post: operations['notes___drafts'];
|
||||
};
|
||||
'/notes/drafts/count': {
|
||||
/**
|
||||
* notes/drafts/count
|
||||
* @description No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:account*
|
||||
*/
|
||||
post: operations['notes___drafts___count'];
|
||||
};
|
||||
'/notes/drafts/create': {
|
||||
/**
|
||||
* notes/drafts/create
|
||||
|
@ -24874,6 +24883,52 @@ export type operations = {
|
|||
};
|
||||
};
|
||||
};
|
||||
/**
|
||||
* notes/drafts/count
|
||||
* @description No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:account*
|
||||
*/
|
||||
notes___drafts___count: {
|
||||
responses: {
|
||||
/** @description OK (with results) */
|
||||
200: {
|
||||
content: {
|
||||
'application/json': number;
|
||||
};
|
||||
};
|
||||
/** @description Client error */
|
||||
400: {
|
||||
content: {
|
||||
'application/json': components['schemas']['Error'];
|
||||
};
|
||||
};
|
||||
/** @description Authentication error */
|
||||
401: {
|
||||
content: {
|
||||
'application/json': components['schemas']['Error'];
|
||||
};
|
||||
};
|
||||
/** @description Forbidden error */
|
||||
403: {
|
||||
content: {
|
||||
'application/json': components['schemas']['Error'];
|
||||
};
|
||||
};
|
||||
/** @description I'm Ai */
|
||||
418: {
|
||||
content: {
|
||||
'application/json': components['schemas']['Error'];
|
||||
};
|
||||
};
|
||||
/** @description Internal server error */
|
||||
500: {
|
||||
content: {
|
||||
'application/json': components['schemas']['Error'];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
/**
|
||||
* notes/drafts/create
|
||||
* @description No description provided.
|
||||
|
|
Loading…
Reference in New Issue