0
0
Fork 0
This commit is contained in:
xeltica 2021-09-09 12:58:57 +09:00
parent 440268a24a
commit dc6a53e38c
4 changed files with 140 additions and 44 deletions

View file

@ -0,0 +1,16 @@
import React from 'react';
export type CardProps = {
className?: string;
bodyClassName?: string;
};
export const Card: React.FC<CardProps> = ({children, className, bodyClassName}) => {
return (
<div className={`card ${className}`}>
<div className={`body ${bodyClassName}`}>
{children}
</div>
</div>
);
};

View file

@ -1,9 +1,11 @@
import React, { useEffect, useMemo, useReducer } from 'react';
import React, { useEffect, useMemo, useReducer, useState } from 'react';
import { AlertMode } from '../../common/types/alert-mode';
import { IUser } from '../../common/types/user';
import { Visibility } from '../../common/types/visibility';
import { useGetSessionQuery } from '../services/session';
import { defaultTemplate } from '../../common/default-template';
import { Card } from './Card';
import { Theme } from '../misc/theme';
type SettingDraftType = Pick<IUser,
| 'alertMode'
@ -30,6 +32,24 @@ export const SettingPage: React.VFC = () => {
template: data?.template ?? null,
});
const themes: Array<{ theme: Theme, name: string }> = [
{
theme: 'light',
name: 'ライトテーマ'
},
{
theme: 'dark',
name: 'ダークテーマ'
},
{
theme: 'system',
name: 'システム設定に準じる'
},
];
const [currentTheme, setCurrentTheme] = useState<Theme>('light');
const [currentLang, setCurrentLang] = useState<string>('ja-JP');
useEffect(() => {
if (data) {
dispatchDraft({
@ -52,53 +72,98 @@ export const SettingPage: React.VFC = () => {
<div className="skeleton" style={{width: '100%', height: '128px'}}></div>
) : (
<div className="vstack fade">
<div className="card">
<div className="body vstack">
<h1></h1>
<div>
<select name="alertMode" className="input-field" value={draft.alertMode} onChange={(e) => {
dispatchDraft({ alertMode: e.target.value as AlertMode });
}}>
<option value="note">稿</option>
<option value="notification">Misskeyに通知()</option>
<option value="nothing"></option>
</select>
{draft.alertMode === 'notification' && (
<div className="alert bg-danger mt-2">
<i className="icon bi bi-exclamation-circle"></i>
Misskey Misskeyでは動作しません
</div>
)}
</div>
{ draft.alertMode === 'note' && (
<div>
<label htmlFor="visibility" className="input-field"></label>
<select name="visibility" className="input-field" value={draft.visibility} onChange={(e) => {
dispatchDraft({ visibility: e.target.value as Visibility });
}}>
<option value="public"></option>
<option value="home"></option>
<option value="followers"></option>
</select>
<label className="input-switch mt-2">
<input type="checkbox" />
<div className="switch"></div>
<span></span>
</label>
<Card bodyClassName="vstack">
<h1></h1>
<div>
<select name="alertMode" className="input-field" value={draft.alertMode} onChange={(e) => {
dispatchDraft({ alertMode: e.target.value as AlertMode });
}}>
<option value="note">稿</option>
<option value="notification">Misskeyに通知()</option>
<option value="nothing"></option>
</select>
{draft.alertMode === 'notification' && (
<div className="alert bg-danger mt-2">
<i className="icon bi bi-exclamation-circle"></i>
Misskey Misskeyでは動作しません
</div>
)}
{saveButton}
</div>
</div>
<div className="card">
<div className="body vstack">
<h1></h1>
<textarea className="input-field" value={draft.template ?? defaultTemplate} style={{height: 228}} onChange={(e) => {
dispatchDraft({ template: e.target.value });
}} />
{saveButton}
{ draft.alertMode === 'note' && (
<div>
<label htmlFor="visibility" className="input-field"></label>
<select name="visibility" className="input-field" value={draft.visibility} onChange={(e) => {
dispatchDraft({ visibility: e.target.value as Visibility });
}}>
<option value="public"></option>
<option value="home"></option>
<option value="followers"></option>
</select>
<label className="input-switch mt-2">
<input type="checkbox" />
<div className="switch"></div>
<span></span>
</label>
</div>
)}
{saveButton}
</Card>
<Card bodyClassName="vstack">
<h1></h1>
<h2></h2>
<div>
{
themes.map(({ theme, name }) => (
<label key={theme} className="input-check">
<input type="radio" name={theme} value={theme} checked={theme === currentTheme} onChange={(e) => setCurrentTheme(e.target.value as Theme)} />
<span>{name}</span>
</label>
))
}
</div>
</div>
<h2></h2>
<select name="currentLang" className="input-field" value={currentLang} onChange={e => setCurrentLang(e.target.value)}>
<option value="ja-JP"></option>
<option value="en-US"></option>
</select>
</Card>
<Card bodyClassName="vstack">
<h1></h1>
<p>稿使280</p>
<textarea className="input-field" value={draft.template ?? defaultTemplate} style={{height: 228}} onChange={(e) => {
dispatchDraft({ template: e.target.value });
}} />
<small className="text-dimmed">
#misshaialert
</small>
<details>
<summary></summary>
<ul className="fade">
<li><code>{'{'}notesCount{'}'}</code>稿</li>
</ul>
</details>
{saveButton}
</Card>
<Card bodyClassName="vstack">
<button className="btn block"></button>
<p className="text-dimmed">
</p>
</Card>
<Card bodyClassName="vstack">
<button className="btn block"></button>
<p className="text-dimmed">
</p>
</Card>
<Card bodyClassName="vstack">
<button className="btn danger block"></button>
<p className="text-dimmed">
Misskeyとの連携設定を含むみす廃アラートのアカウントを削除します
</p>
</Card>
</div>
);
};

View file

@ -0,0 +1,3 @@
export type Theme = ActualTheme | 'system';
export type ActualTheme = 'light' | 'dark';

View file

@ -21,3 +21,15 @@ body {
transform: none;
}
}
.block {
display: block !important;
}
.inline {
display: inline !important;
}
small {
font-size: 0.8rem;
}