wip
This commit is contained in:
parent
4cfe4993a1
commit
d8e1caa6cf
7 changed files with 185 additions and 38 deletions
4
crowdin.yml
Normal file
4
crowdin.yml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
files:
|
||||||
|
- source: /src/ja_JP.json5
|
||||||
|
translation: /locales/%locale%.json5
|
||||||
|
update_option: update_as_unapproved
|
|
@ -3,10 +3,10 @@
|
||||||
* @author Xeltica
|
* @author Xeltica
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { Body, CurrentUser, Get, JsonController, OnUndefined, Post, Put } from 'routing-controllers';
|
import { Body, CurrentUser, Delete, Get, JsonController, OnUndefined, Post, Put } from 'routing-controllers';
|
||||||
import { DeepPartial } from 'typeorm';
|
import { DeepPartial } from 'typeorm';
|
||||||
import { getScores } from '../functions/get-scores';
|
import { getScores } from '../functions/get-scores';
|
||||||
import { updateUser } from '../functions/users';
|
import { deleteUser, updateUser } from '../functions/users';
|
||||||
import { User } from '../models/entities/user';
|
import { User } from '../models/entities/user';
|
||||||
import { sendAlert } from '../services/send-alert';
|
import { sendAlert } from '../services/send-alert';
|
||||||
import { UserSetting } from './UserSetting';
|
import { UserSetting } from './UserSetting';
|
||||||
|
@ -38,6 +38,11 @@ export class SessionController {
|
||||||
@Post('/alert') async testAlert(@CurrentUser({ required: true }) user: User) {
|
@Post('/alert') async testAlert(@CurrentUser({ required: true }) user: User) {
|
||||||
await sendAlert(user);
|
await sendAlert(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OnUndefined(204)
|
||||||
|
@Delete() async delete(@CurrentUser({ required: true }) user: User) {
|
||||||
|
await deleteUser(user.username, user.host);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import { config } from '../../config';
|
import { config } from '../../config';
|
||||||
import { User } from '../../backend/models/entities/user';
|
|
||||||
import { Score } from '../types/score';
|
import { Score } from '../types/score';
|
||||||
import { defaultTemplate } from '../../backend/const';
|
import { defaultTemplate } from '../../backend/const';
|
||||||
import { IUser } from '../types/user';
|
import { IUser } from '../types/user';
|
||||||
|
@ -8,7 +7,7 @@ import { IUser } from '../types/user';
|
||||||
* 埋め込み変数の型
|
* 埋め込み変数の型
|
||||||
*/
|
*/
|
||||||
export type Variable = {
|
export type Variable = {
|
||||||
replace?: string | ((score: Score, user: User) => string);
|
replace?: string | ((score: Score, user: IUser) => string);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
import React, { useCallback, useEffect, useReducer } from 'react';
|
import React, { useCallback, useEffect, useReducer } from 'react';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
|
import { useDispatch } from 'react-redux';
|
||||||
|
|
||||||
import { alertModes } from '../../common/types/alert-mode';
|
import { alertModes } from '../../common/types/alert-mode';
|
||||||
import { IUser } from '../../common/types/user';
|
import { IUser } from '../../common/types/user';
|
||||||
import { Visibility } from '../../common/types/visibility';
|
import { Visibility } from '../../common/types/visibility';
|
||||||
|
@ -6,11 +9,22 @@ import { useGetSessionQuery } from '../services/session';
|
||||||
import { Card } from './Card';
|
import { Card } from './Card';
|
||||||
import { Theme, themes } from '../misc/theme';
|
import { Theme, themes } from '../misc/theme';
|
||||||
import { API_ENDPOINT, LOCALSTORAGE_KEY_TOKEN } from '../const';
|
import { API_ENDPOINT, LOCALSTORAGE_KEY_TOKEN } from '../const';
|
||||||
import { useDispatch } from 'react-redux';
|
|
||||||
import { changeLang, changeTheme, showModal } from '../store/slices/screen';
|
import { changeLang, changeTheme, showModal } from '../store/slices/screen';
|
||||||
import { useSelector } from '../store';
|
import { useSelector } from '../store';
|
||||||
import { languageName } from '../langs';
|
import { languageName } from '../langs';
|
||||||
import { useTranslation } from 'react-i18next';
|
|
||||||
|
const variables = [
|
||||||
|
'notesCount',
|
||||||
|
'followingCount',
|
||||||
|
'followersCount',
|
||||||
|
'notesDelta',
|
||||||
|
'followingDelta',
|
||||||
|
'followersDelta',
|
||||||
|
'url',
|
||||||
|
'username',
|
||||||
|
'host',
|
||||||
|
'rating',
|
||||||
|
] as const;
|
||||||
|
|
||||||
type SettingDraftType = Partial<Pick<IUser,
|
type SettingDraftType = Partial<Pick<IUser,
|
||||||
| 'alertMode'
|
| 'alertMode'
|
||||||
|
@ -90,13 +104,41 @@ export const SettingPage: React.VFC = () => {
|
||||||
}
|
}
|
||||||
}, [data]);
|
}, [data]);
|
||||||
|
|
||||||
|
const onClickInsertVariables = useCallback<React.MouseEventHandler>((e) => {
|
||||||
|
dispatch(showModal({
|
||||||
|
type: 'menu',
|
||||||
|
screenX: e.screenX,
|
||||||
|
screenY: e.screenY,
|
||||||
|
items: Object.keys(variables).map(key => ({
|
||||||
|
name: '_template.variables.' + key,
|
||||||
|
onClick: () => { console.log(key); },
|
||||||
|
})),
|
||||||
|
}));
|
||||||
|
}, [dispatch, t, variables]);
|
||||||
|
|
||||||
|
const onClickInsertVariablesHelp = useCallback(() => {
|
||||||
|
dispatch(showModal({
|
||||||
|
type: 'dialog',
|
||||||
|
icon: 'info',
|
||||||
|
message: t('_template.insertVariablesHelp'),
|
||||||
|
}));
|
||||||
|
}, [dispatch, t]);
|
||||||
|
|
||||||
const onClickSendAlert = useCallback(() => {
|
const onClickSendAlert = useCallback(() => {
|
||||||
dispatch(showModal({
|
dispatch(showModal({
|
||||||
type: 'dialog',
|
type: 'dialog',
|
||||||
title: 'アラートをテスト送信しますか?',
|
title: t('_sendTest.title'),
|
||||||
message: '現在の設定でアラートを送信します。設定が保存済みであるかどうか、実行前に必ずご確認ください。',
|
message: t('_sendTest.message'),
|
||||||
icon: 'question',
|
icon: 'question',
|
||||||
buttons: 'yesNo',
|
buttons: [
|
||||||
|
{
|
||||||
|
text: t('_sendTest.yes'),
|
||||||
|
style: 'primary',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: t('_sendTest.no'),
|
||||||
|
},
|
||||||
|
],
|
||||||
onSelect(i) {
|
onSelect(i) {
|
||||||
if (i === 0) {
|
if (i === 0) {
|
||||||
fetch(`${API_ENDPOINT}session/alert`, {
|
fetch(`${API_ENDPOINT}session/alert`, {
|
||||||
|
@ -107,29 +149,37 @@ export const SettingPage: React.VFC = () => {
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
dispatch(showModal({
|
dispatch(showModal({
|
||||||
type: 'dialog',
|
type: 'dialog',
|
||||||
message: '送信しました。',
|
message: t('_logout.success'),
|
||||||
icon: 'info',
|
icon: 'info',
|
||||||
}));
|
}));
|
||||||
}).catch((e) => {
|
}).catch((e) => {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
dispatch(showModal({
|
dispatch(showModal({
|
||||||
type: 'dialog',
|
type: 'dialog',
|
||||||
message: '送信に失敗しました。',
|
message: t('_logout.failure'),
|
||||||
icon: 'error',
|
icon: 'error',
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
}, [dispatch]);
|
}, [dispatch, t]);
|
||||||
|
|
||||||
const onClickLogout = useCallback(() => {
|
const onClickLogout = useCallback(() => {
|
||||||
dispatch(showModal({
|
dispatch(showModal({
|
||||||
type: 'dialog',
|
type: 'dialog',
|
||||||
title: 'ログアウトしてもよろしいですか?',
|
title: t('_logout.title'),
|
||||||
message: 'ログアウトしても、アラート送信や、お使いのMisskeyアカウントのデータ収集といった機能は動作し続けます。Misskey Toolsの利用を停止したい場合は、「アカウント連携を解除する」ボタンを押下して下さい。',
|
message: t('_logout.message'),
|
||||||
icon: 'question',
|
icon: 'question',
|
||||||
buttons: 'yesNo',
|
buttons: [
|
||||||
|
{
|
||||||
|
text: t('_logout.yes'),
|
||||||
|
style: 'primary',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: t('_logout.no'),
|
||||||
|
},
|
||||||
|
],
|
||||||
onSelect(i) {
|
onSelect(i) {
|
||||||
if (i === 0) {
|
if (i === 0) {
|
||||||
localStorage.removeItem(LOCALSTORAGE_KEY_TOKEN);
|
localStorage.removeItem(LOCALSTORAGE_KEY_TOKEN);
|
||||||
|
@ -137,14 +187,52 @@ export const SettingPage: React.VFC = () => {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
}, [dispatch]);
|
}, [dispatch, t]);
|
||||||
|
|
||||||
const onClickDeleteAccount = useCallback(() => {
|
const onClickDeleteAccount = useCallback(() => {
|
||||||
dispatch(showModal({
|
dispatch(showModal({
|
||||||
type: 'dialog',
|
type: 'dialog',
|
||||||
message: 'WIP',
|
title: t('_deactivate.title'),
|
||||||
|
message: t('_deactivate.message'),
|
||||||
|
icon: 'question',
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
text: t('_deactivate.yes'),
|
||||||
|
style: 'danger',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: t('_deactivate.no'),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
primaryClassName: 'danger',
|
||||||
|
onSelect(i) {
|
||||||
|
if (i === 0) {
|
||||||
|
fetch(`${API_ENDPOINT}session`, {
|
||||||
|
method: 'DELETE',
|
||||||
|
headers: {
|
||||||
|
'Authorization': `Bearer ${localStorage[LOCALSTORAGE_KEY_TOKEN]}`,
|
||||||
|
},
|
||||||
|
}).then(() => {
|
||||||
|
dispatch(showModal({
|
||||||
|
type: 'dialog',
|
||||||
|
message: t('_deactivate.success'),
|
||||||
|
icon: 'info',
|
||||||
|
onSelect() {
|
||||||
|
location.reload();
|
||||||
|
}
|
||||||
}));
|
}));
|
||||||
}, [dispatch]);
|
}).catch((e) => {
|
||||||
|
console.error(e);
|
||||||
|
dispatch(showModal({
|
||||||
|
type: 'dialog',
|
||||||
|
message: t('_deactivate.failure'),
|
||||||
|
icon: 'error',
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
}, [dispatch, t]);
|
||||||
|
|
||||||
const defaultTemplate = t('_template.default');
|
const defaultTemplate = t('_template.default');
|
||||||
|
|
||||||
|
@ -221,21 +309,29 @@ export const SettingPage: React.VFC = () => {
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
</select>
|
</select>
|
||||||
|
<div className="alert bg-info mt-2">
|
||||||
|
<i className="icon bi bi-translate" />
|
||||||
|
{t('translatedByTheCommunity')}
|
||||||
|
<a href="#TODO" target="_blank" rel="noopener noreferrer">{t('helpTranslation')}</a>
|
||||||
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
<Card bodyClassName="vstack">
|
<Card bodyClassName="vstack">
|
||||||
<h1>{t('template')}</h1>
|
<h1>{t('template')}</h1>
|
||||||
<p>{t('_template.description')}</p>
|
<p>{t('_template.description')}</p>
|
||||||
|
<div className="hstack dense">
|
||||||
|
<button className="btn" onClick={onClickInsertVariables}>
|
||||||
|
<i className="bi bi-braces" />
|
||||||
|
{t('_template.insertVariables')}
|
||||||
|
</button>
|
||||||
|
<button className="btn link text-info" onClick={onClickInsertVariablesHelp}>
|
||||||
|
<i className="bi bi-question-circle" />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
<textarea className="input-field" value={draft.template ?? defaultTemplate} placeholder={defaultTemplate} style={{height: 228}} onChange={(e) => {
|
<textarea className="input-field" value={draft.template ?? defaultTemplate} placeholder={defaultTemplate} style={{height: 228}} onChange={(e) => {
|
||||||
dispatchDraft({ template: e.target.value });
|
dispatchDraft({ template: e.target.value });
|
||||||
}} />
|
}} />
|
||||||
<small className="text-dimmed">{t('_template.description2')}</small>
|
<small className="text-dimmed">{t('_template.description2')}</small>
|
||||||
<details>
|
|
||||||
<summary>{t('help')}</summary>
|
|
||||||
<ul className="fade">
|
|
||||||
<li><code>{'{'}notesCount{'}'}</code>といった形式のテキストは変数として扱われ、これを含めると投稿時に自動的に値が埋め込まれます。</li>
|
|
||||||
</ul>
|
|
||||||
</details>
|
|
||||||
<div className="hstack" style={{justifyContent: 'flex-end'}}>
|
<div className="hstack" style={{justifyContent: 'flex-end'}}>
|
||||||
<button className="btn danger" onClick={() => dispatchDraft({ template: null })}>{t('resetToDefault')}</button>
|
<button className="btn danger" onClick={() => dispatchDraft({ template: null })}>{t('resetToDefault')}</button>
|
||||||
<button className="btn primary" onClick={() => {
|
<button className="btn primary" onClick={() => {
|
||||||
|
|
|
@ -37,20 +37,17 @@
|
||||||
name: "Name",
|
name: "Name",
|
||||||
resetToDefault: "Reset to default",
|
resetToDefault: "Reset to default",
|
||||||
error: "Error",
|
error: "Error",
|
||||||
|
disclaimerForMisskeyHq: "Misskey Tools is <b>not</b> a official tool by Misskey HQ.",
|
||||||
|
translatedByTheCommunity: "Misskey Tools has been translated by the community.",
|
||||||
|
helpTranslation: "Help translation",
|
||||||
_welcomeMessage: {
|
_welcomeMessage: {
|
||||||
pattern1: "Overnoting Misskey?",
|
pattern1: "Are you overnoting?",
|
||||||
pattern2: "Overusing Misskey?",
|
pattern2: "Are you overusing Misskey?",
|
||||||
pattern3: "How many notes did you write today?",
|
pattern3: "How many notes did you write today?",
|
||||||
pattern4: "Do you really think you're lite-misskist?",
|
pattern4: "Do you really think you're lite-misskist?",
|
||||||
pattern5: "Misskey is my breathing!",
|
pattern5: "Misskey is my breathing!",
|
||||||
pattern6: "I'm Misskey freak!",
|
pattern6: "I'm Misskey freak!",
|
||||||
},
|
},
|
||||||
_sendAlertDialog: {
|
|
||||||
title: "Are you sure you want to send the alert for testing?",
|
|
||||||
message: "Send an alert with the current settings. Be sure to check whether you saved the settings before executing.",
|
|
||||||
success: "Alert sent.",
|
|
||||||
error: "Failed to send alert.",
|
|
||||||
},
|
|
||||||
_nav: {
|
_nav: {
|
||||||
data: "Data",
|
data: "Data",
|
||||||
ranking: "Ranking",
|
ranking: "Ranking",
|
||||||
|
@ -98,6 +95,8 @@
|
||||||
description: "Customize template of your alert.",
|
description: "Customize template of your alert.",
|
||||||
description2: "Hashtag '#misshaialert' will be appended regardless of the template.",
|
description2: "Hashtag '#misshaialert' will be appended regardless of the template.",
|
||||||
default: "My Misskey activity yesterday was:\n\nNotes: {notesCount}({notesDelta})\nFollowing: {followingCount}({followingDelta})\nFollowers: {followersCount}({followersDelta})\n\n{url}",
|
default: "My Misskey activity yesterday was:\n\nNotes: {notesCount}({notesDelta})\nFollowing: {followingCount}({followingDelta})\nFollowers: {followersCount}({followersDelta})\n\n{url}",
|
||||||
|
insertVariables: "Insert variables",
|
||||||
|
insertVariablesHelp: "The string enclosed in { } is called \"variables\" and has a special meaning. If you include this, it will be automatically replaced to the actual value when alerts created.",
|
||||||
},
|
},
|
||||||
_error: {
|
_error: {
|
||||||
sorry: "Something went wrong. Please retry again.",
|
sorry: "Something went wrong. Please retry again.",
|
||||||
|
@ -110,5 +109,27 @@
|
||||||
notAuthorized: "Not authorized.",
|
notAuthorized: "Not authorized.",
|
||||||
other: "None",
|
other: "None",
|
||||||
},
|
},
|
||||||
|
_sendTest: {
|
||||||
|
title: "Are you sure you want to test the alert?",
|
||||||
|
message: "Send an alert with the current settings. Be sure to check that the settings have been saved before sending.",
|
||||||
|
yes: "Send",
|
||||||
|
no: "Cancel",
|
||||||
|
success: "Alert sent.",
|
||||||
|
failure: "Failed to sent the alert.",
|
||||||
|
},
|
||||||
|
_logout: {
|
||||||
|
title: "Are you sure you want to logout?",
|
||||||
|
message: "Even if you log out, features such as sending alerts and collecting data from your Misskey account will continue to work. If you wish to stop using Misskey Tools, click the \"Deactivate account integration\" button.",
|
||||||
|
yes: "Logout",
|
||||||
|
no: "Cancel",
|
||||||
|
},
|
||||||
|
_deactivate: {
|
||||||
|
title: "Do you want to deactivate your accounts?",
|
||||||
|
message: "All data, including collected data and personal settings, will be deleted. You cannot undo this operation. You cannot undo this operation.",
|
||||||
|
yes: "Deactivate",
|
||||||
|
no: "Cancel",
|
||||||
|
success: "Your account has been deactivated. Return to the top screen.",
|
||||||
|
failure: "Failed to delete account.",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,9 @@
|
||||||
resetToDefault: "初期値に戻す",
|
resetToDefault: "初期値に戻す",
|
||||||
error: "エラー",
|
error: "エラー",
|
||||||
retry: "やり直す",
|
retry: "やり直す",
|
||||||
|
disclaimerForMisskeyHq: "Misskey Toolsは、Misskey HQの公式ツールでは<b>ありません</b>。",
|
||||||
|
translatedByTheCommunity: "Misskey Toolsはコミュニティによって翻訳されています。",
|
||||||
|
helpTranslation: "翻訳に協力する",
|
||||||
_welcomeMessage: {
|
_welcomeMessage: {
|
||||||
'pattern1': 'ついついノートしすぎていませんか?',
|
'pattern1': 'ついついノートしすぎていませんか?',
|
||||||
'pattern2': 'Misskey, しすぎていませんか?',
|
'pattern2': 'Misskey, しすぎていませんか?',
|
||||||
|
@ -45,12 +48,6 @@
|
||||||
'pattern5': '息するように Misskey、そんなあなたへ。',
|
'pattern5': '息するように Misskey、そんなあなたへ。',
|
||||||
'pattern6': 'あなたは真の Misskey 廃人ですか?',
|
'pattern6': 'あなたは真の Misskey 廃人ですか?',
|
||||||
},
|
},
|
||||||
_sendAlertDialog: {
|
|
||||||
title: "アラートをテスト送信しますか?",
|
|
||||||
message: "現在の設定でアラートを送信します。設定が保存済みであるかどうか、実行前に必ずご確認ください。",
|
|
||||||
success: "送信しました。",
|
|
||||||
error: "送信に失敗しました。",
|
|
||||||
},
|
|
||||||
_nav: {
|
_nav: {
|
||||||
data: "データ",
|
data: "データ",
|
||||||
ranking: "ランキング",
|
ranking: "ランキング",
|
||||||
|
@ -98,6 +95,8 @@
|
||||||
description: "アラートの自動投稿をカスタマイズできます。",
|
description: "アラートの自動投稿をカスタマイズできます。",
|
||||||
description2: "ハッシュタグ #misshaialert は、テンプレートに関わらず自動付与されます。",
|
description2: "ハッシュタグ #misshaialert は、テンプレートに関わらず自動付与されます。",
|
||||||
default: "昨日のMisskeyの活動は\n\nノート: {notesCount}({notesDelta})\nフォロー : {followingCount}({followingDelta})\nフォロワー :{followersCount}({followersDelta})\n\nでした。\n{url}",
|
default: "昨日のMisskeyの活動は\n\nノート: {notesCount}({notesDelta})\nフォロー : {followingCount}({followingDelta})\nフォロワー :{followersCount}({followersDelta})\n\nでした。\n{url}",
|
||||||
|
insertVariables: "変数を挿入する",
|
||||||
|
insertVariablesHelp: "{ } で囲われた文字列は変数と呼ばれ、特別な意味を持ちます。これを含めると、投稿時に自動的に値が埋め込まれます。",
|
||||||
},
|
},
|
||||||
_error: {
|
_error: {
|
||||||
sorry: "問題が発生しました。お手数ですが、やり直してください。",
|
sorry: "問題が発生しました。お手数ですが、やり直してください。",
|
||||||
|
@ -110,5 +109,27 @@
|
||||||
notAuthorized: "権限がありません。",
|
notAuthorized: "権限がありません。",
|
||||||
other: "なし",
|
other: "なし",
|
||||||
},
|
},
|
||||||
|
_sendTest: {
|
||||||
|
title: "アラートをテスト送信しますか?",
|
||||||
|
message: "現在の設定でアラートを送信します。設定が保存済みであるかどうか、実行前に必ずご確認ください。",
|
||||||
|
yes: "送信する",
|
||||||
|
no: "キャンセル",
|
||||||
|
success: "送信しました。",
|
||||||
|
failure: "送信に失敗しました。",
|
||||||
|
},
|
||||||
|
_logout: {
|
||||||
|
title: "ログアウトしてもよろしいですか?",
|
||||||
|
message: "ログアウトしても、アラート送信や、お使いのMisskeyアカウントのデータ収集といった機能は動作し続けます。Misskey Toolsの利用を停止したい場合は、「アカウント連携を解除する」ボタンを押下して下さい。",
|
||||||
|
yes: "ログアウトする",
|
||||||
|
no: "キャンセル",
|
||||||
|
},
|
||||||
|
_deactivate: {
|
||||||
|
title: "アカウント連携を解除しますか?",
|
||||||
|
message: "収集されたデータや個人設定など、全てのデータが削除されます。この操作は取り消すことができません。",
|
||||||
|
yes: "解除する",
|
||||||
|
no: "キャンセル",
|
||||||
|
success: "アカウントを解除しました。トップ画面に戻ります。",
|
||||||
|
failure: "アカウントを解除できませんでした。",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ export interface ModalTypeDialog {
|
||||||
message: string;
|
message: string;
|
||||||
icon?: DialogIcon;
|
icon?: DialogIcon;
|
||||||
buttons?: DialogButtonType;
|
buttons?: DialogButtonType;
|
||||||
|
primaryClassName?: string;
|
||||||
onSelect?: (clickedButtonIndex: number) => void;
|
onSelect?: (clickedButtonIndex: number) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue