add: クライアント側に実装
This commit is contained in:
parent
f4972bb1ae
commit
a282fdb397
|
@ -1158,6 +1158,9 @@ export interface Locale {
|
||||||
"pullDownToRefresh": string;
|
"pullDownToRefresh": string;
|
||||||
"disableStreamingTimeline": string;
|
"disableStreamingTimeline": string;
|
||||||
"useGroupedNotifications": string;
|
"useGroupedNotifications": string;
|
||||||
|
"emailVerificationExpiresIn": string;
|
||||||
|
"emailVerificationExpiresInDescription": string;
|
||||||
|
"signupPendingError": string;
|
||||||
"_announcement": {
|
"_announcement": {
|
||||||
"forExistingUsers": string;
|
"forExistingUsers": string;
|
||||||
"forExistingUsersDescription": string;
|
"forExistingUsersDescription": string;
|
||||||
|
@ -1635,6 +1638,7 @@ export interface Locale {
|
||||||
"almostThere": string;
|
"almostThere": string;
|
||||||
"emailAddressInfo": string;
|
"emailAddressInfo": string;
|
||||||
"emailSent": string;
|
"emailSent": string;
|
||||||
|
"expiresTime": string;
|
||||||
};
|
};
|
||||||
"_accountDelete": {
|
"_accountDelete": {
|
||||||
"accountDelete": string;
|
"accountDelete": string;
|
||||||
|
|
|
@ -1155,6 +1155,9 @@ refreshing: "リロード中"
|
||||||
pullDownToRefresh: "引っ張ってリロード"
|
pullDownToRefresh: "引っ張ってリロード"
|
||||||
disableStreamingTimeline: "タイムラインのリアルタイム更新を無効にする"
|
disableStreamingTimeline: "タイムラインのリアルタイム更新を無効にする"
|
||||||
useGroupedNotifications: "通知をグルーピングして表示する"
|
useGroupedNotifications: "通知をグルーピングして表示する"
|
||||||
|
emailVerificationExpiresIn: "メール認証の有効期限"
|
||||||
|
emailVerificationExpiresInDescription: "指定した有効期限を超えた場合はアカウントのサインアップが無効になりますが、サインアップ時に使用した招待コードが再度使用できるようになるなどのメリットがあります。0で無効になります。"
|
||||||
|
signupPendingError: "メールアドレスの確認中に問題が発生しました。リンクの有効期限が切れている可能性があります。"
|
||||||
|
|
||||||
_announcement:
|
_announcement:
|
||||||
forExistingUsers: "既存ユーザーのみ"
|
forExistingUsers: "既存ユーザーのみ"
|
||||||
|
@ -1554,6 +1557,7 @@ _signup:
|
||||||
almostThere: "ほとんど完了です"
|
almostThere: "ほとんど完了です"
|
||||||
emailAddressInfo: "あなたが使っているメールアドレスを入力してください。メールアドレスが公開されることはありません。"
|
emailAddressInfo: "あなたが使っているメールアドレスを入力してください。メールアドレスが公開されることはありません。"
|
||||||
emailSent: "入力されたメールアドレス({email})宛に確認のメールが送信されました。メールに記載されたリンクにアクセスすると、アカウントの作成が完了します。"
|
emailSent: "入力されたメールアドレス({email})宛に確認のメールが送信されました。メールに記載されたリンクにアクセスすると、アカウントの作成が完了します。"
|
||||||
|
expiresTime: "メールに記載されているリンクの有効期限は{time}です。"
|
||||||
|
|
||||||
_accountDelete:
|
_accountDelete:
|
||||||
accountDelete: "アカウントの削除"
|
accountDelete: "アカウントの削除"
|
||||||
|
|
|
@ -254,10 +254,25 @@ async function onSubmit(): Promise<void> {
|
||||||
'turnstile-response': turnstileResponse,
|
'turnstile-response': turnstileResponse,
|
||||||
});
|
});
|
||||||
if (instance.emailRequiredForSignup) {
|
if (instance.emailRequiredForSignup) {
|
||||||
|
const text = [i18n.t('_signup.emailSent', { email })];
|
||||||
|
|
||||||
|
if (instance.emailVerificationExpiresIn) {
|
||||||
|
let time = '';
|
||||||
|
const hours = Math.floor(instance.emailVerificationExpiresIn / 60);
|
||||||
|
const minutes = instance.emailVerificationExpiresIn % 60;
|
||||||
|
if (hours > 0) {
|
||||||
|
time += hours + i18n.t('_time.hour');
|
||||||
|
}
|
||||||
|
if (minutes > 0) {
|
||||||
|
time += minutes + i18n.t('_time.minute');
|
||||||
|
}
|
||||||
|
text.push(i18n.t('_signup.expiresTime', { time }));
|
||||||
|
}
|
||||||
|
|
||||||
os.alert({
|
os.alert({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
title: i18n.ts._signup.almostThere,
|
title: i18n.ts._signup.almostThere,
|
||||||
text: i18n.t('_signup.emailSent', { email }),
|
text: text.join('\n'),
|
||||||
});
|
});
|
||||||
emit('signupEmailPending');
|
emit('signupEmailPending');
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -18,6 +18,12 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<template #label>{{ i18n.ts.emailRequiredForSignup }}</template>
|
<template #label>{{ i18n.ts.emailRequiredForSignup }}</template>
|
||||||
</MkSwitch>
|
</MkSwitch>
|
||||||
|
|
||||||
|
<MkInput v-if="emailRequiredForSignup" v-model="emailVerificationExpiresIn" type="number" :min="0">
|
||||||
|
<template #label>{{ i18n.ts.emailVerificationExpiresIn }}</template>
|
||||||
|
<template #suffix>{{ i18n.ts._time.minute }}</template>
|
||||||
|
<template #caption>{{ i18n.ts.emailVerificationExpiresInDescription }}</template>
|
||||||
|
</MkInput>
|
||||||
|
|
||||||
<FormLink to="/admin/server-rules">{{ i18n.ts.serverRules }}</FormLink>
|
<FormLink to="/admin/server-rules">{{ i18n.ts.serverRules }}</FormLink>
|
||||||
|
|
||||||
<MkInput v-model="tosUrl" type="url">
|
<MkInput v-model="tosUrl" type="url">
|
||||||
|
@ -71,6 +77,7 @@ import FormLink from '@/components/form/link.vue';
|
||||||
|
|
||||||
let enableRegistration: boolean = $ref(false);
|
let enableRegistration: boolean = $ref(false);
|
||||||
let emailRequiredForSignup: boolean = $ref(false);
|
let emailRequiredForSignup: boolean = $ref(false);
|
||||||
|
let emailVerificationExpiresIn: number = $ref(0);
|
||||||
let sensitiveWords: string = $ref('');
|
let sensitiveWords: string = $ref('');
|
||||||
let preservedUsernames: string = $ref('');
|
let preservedUsernames: string = $ref('');
|
||||||
let tosUrl: string | null = $ref(null);
|
let tosUrl: string | null = $ref(null);
|
||||||
|
@ -80,6 +87,7 @@ async function init() {
|
||||||
const meta = await os.api('admin/meta');
|
const meta = await os.api('admin/meta');
|
||||||
enableRegistration = !meta.disableRegistration;
|
enableRegistration = !meta.disableRegistration;
|
||||||
emailRequiredForSignup = meta.emailRequiredForSignup;
|
emailRequiredForSignup = meta.emailRequiredForSignup;
|
||||||
|
emailVerificationExpiresIn = meta.emailVerificationExpiresIn;
|
||||||
sensitiveWords = meta.sensitiveWords.join('\n');
|
sensitiveWords = meta.sensitiveWords.join('\n');
|
||||||
preservedUsernames = meta.preservedUsernames.join('\n');
|
preservedUsernames = meta.preservedUsernames.join('\n');
|
||||||
tosUrl = meta.tosUrl;
|
tosUrl = meta.tosUrl;
|
||||||
|
@ -90,6 +98,7 @@ function save() {
|
||||||
os.apiWithDialog('admin/update-meta', {
|
os.apiWithDialog('admin/update-meta', {
|
||||||
disableRegistration: !enableRegistration,
|
disableRegistration: !enableRegistration,
|
||||||
emailRequiredForSignup,
|
emailRequiredForSignup,
|
||||||
|
emailVerificationExpiresIn,
|
||||||
tosUrl,
|
tosUrl,
|
||||||
privacyPolicyUrl,
|
privacyPolicyUrl,
|
||||||
sensitiveWords: sensitiveWords.split('\n'),
|
sensitiveWords: sensitiveWords.split('\n'),
|
||||||
|
|
|
@ -51,7 +51,8 @@ function submit() {
|
||||||
|
|
||||||
os.alert({
|
os.alert({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
text: i18n.ts.somethingHappened,
|
title: i18n.ts.somethingHappened,
|
||||||
|
text: i18n.ts.signupPendingError,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue