@@ -65,30 +65,30 @@ export default () => { | |||||
switch (status) | switch (status) | ||||
{ | { | ||||
case 503: | case 503: | ||||
return <ServiceUnavailable /> | |||||
return <ServiceUnavailable/> | |||||
} | } | ||||
return ( | return ( | ||||
<BrowserRouter> | <BrowserRouter> | ||||
<div className="flex flex-col h-screen w-screen"> | <div className="flex flex-col h-screen w-screen"> | ||||
<TopNav user={user} /> | |||||
<TopNav user={user}/> | |||||
<Routes> | <Routes> | ||||
<Route path="/" element={<Navigate to="/posts" replace />} /> | |||||
<Route path="/posts" element={<PostListPage />} /> | |||||
<Route path="/posts/new" element={<PostNewPage user={user} />} /> | |||||
<Route path="/posts/:id" element={<PostDetailPage user={user} />} /> | |||||
<Route path="/tags/nico" element={<NicoTagListPage user={user} />} /> | |||||
<Route path="/wiki" element={<WikiSearchPage />} /> | |||||
<Route path="/wiki/:title" element={<WikiDetailPage />} /> | |||||
<Route path="/wiki/new" element={<WikiNewPage user={user} />} /> | |||||
<Route path="/wiki/:id/edit" element={<WikiEditPage user={user} />} /> | |||||
<Route path="/wiki/:id/diff" element={<WikiDiffPage />} /> | |||||
<Route path="/wiki/changes" element={<WikiHistoryPage />} /> | |||||
<Route path="/users/settings" element={<SettingPage user={user} setUser={setUser} />} /> | |||||
<Route path="/settings" element={<Navigate to="/users/settings" replace />} /> | |||||
<Route path="*" element={<NotFound />} /> | |||||
<Route path="/" element={<Navigate to="/posts" replace/>}/> | |||||
<Route path="/posts" element={<PostListPage/>}/> | |||||
<Route path="/posts/new" element={<PostNewPage user={user}/>}/> | |||||
<Route path="/posts/:id" element={<PostDetailPage user={user}/>}/> | |||||
<Route path="/tags/nico" element={<NicoTagListPage user={user}/>}/> | |||||
<Route path="/wiki" element={<WikiSearchPage/>}/> | |||||
<Route path="/wiki/:title" element={<WikiDetailPage/>}/> | |||||
<Route path="/wiki/new" element={<WikiNewPage user={user}/>}/> | |||||
<Route path="/wiki/:id/edit" element={<WikiEditPage user={user}/>}/> | |||||
<Route path="/wiki/:id/diff" element={<WikiDiffPage/>}/> | |||||
<Route path="/wiki/changes" element={<WikiHistoryPage/>}/> | |||||
<Route path="/users/settings" element={<SettingPage user={user} setUser={setUser}/>}/> | |||||
<Route path="/settings" element={<Navigate to="/users/settings" replace/>}/> | |||||
<Route path="*" element={<NotFound/>}/> | |||||
</Routes> | </Routes> | ||||
</div> | </div> | ||||
<Toaster /> | |||||
<Toaster/> | |||||
</BrowserRouter>) | </BrowserRouter>) | ||||
} | } |
@@ -39,7 +39,7 @@ export default ({ status }: Props) => { | |||||
return ( | return ( | ||||
<MainArea> | <MainArea> | ||||
<Helmet> | <Helmet> | ||||
<meta name="robots" content="noindex" /> | |||||
<meta name="robots" content="noindex"/> | |||||
<title>{title} | {SITE_TITLE}</title> | <title>{title} | {SITE_TITLE}</title> | ||||
</Helmet> | </Helmet> | ||||
<div className="text-6xl font-bold text-transparent | <div className="text-6xl font-bold text-transparent | ||||
@@ -50,7 +50,7 @@ export default ({ status }: Props) => { | |||||
<p>{status}</p> | <p>{status}</p> | ||||
<div className="flex flex-row space-x-1 sm:space-x-2 md:space-x-4"> | <div className="flex flex-row space-x-1 sm:space-x-2 md:space-x-4"> | ||||
<p style={{ writingMode: 'vertical-rl' }}>{leftMsg}</p> | <p style={{ writingMode: 'vertical-rl' }}>{leftMsg}</p> | ||||
<img className="max-w-[70vw]" src={errorImg} alt="逃げたギター" /> | |||||
<img className="max-w-[70vw]" src={errorImg} alt="逃げたギター"/> | |||||
<p style={{ writingMode: 'vertical-rl' }}>{rightMsg}</p> | <p style={{ writingMode: 'vertical-rl' }}>{rightMsg}</p> | ||||
</div> | </div> | ||||
<p className="mr-[-.5em]">{message}</p> | <p className="mr-[-.5em]">{message}</p> | ||||
@@ -2,5 +2,5 @@ export default () => ( | |||||
<> | <> | ||||
<span className="hidden md:inline flex items-center px-2">|</span> | <span className="hidden md:inline flex items-center px-2">|</span> | ||||
<hr className="block md:hidden w-full opacity-25 | <hr className="block md:hidden w-full opacity-25 | ||||
border-t border-black dark:border-white" /> | |||||
border-t border-black dark:border-white"/> | |||||
</>) | </>) |
@@ -107,5 +107,5 @@ export default (props: Props) => { | |||||
height={height} | height={height} | ||||
style={margedStyle} | style={margedStyle} | ||||
allowFullScreen | allowFullScreen | ||||
allow="autoplay" />) | |||||
allow="autoplay"/>) | |||||
} | } |
@@ -39,14 +39,14 @@ export default ({ post, onSave }: Props) => { | |||||
<input type="text" | <input type="text" | ||||
className="w-full border rounded p-2" | className="w-full border rounded p-2" | ||||
value={title} | value={title} | ||||
onChange={e => setTitle (e.target.value)} /> | |||||
onChange={e => setTitle (e.target.value)}/> | |||||
</div> | </div> | ||||
{/* タグ */} | {/* タグ */} | ||||
<div> | <div> | ||||
<label className="block font-semibold">タグ</label> | <label className="block font-semibold">タグ</label> | ||||
<TextArea value={tags} | <TextArea value={tags} | ||||
onChange={ev => setTags (ev.target.value)} /> | |||||
onChange={ev => setTags (ev.target.value)}/> | |||||
</div> | </div> | ||||
{/* 送信 */} | {/* 送信 */} | ||||
@@ -46,14 +46,14 @@ export default ({ post }: Props) => { | |||||
return ( | return ( | ||||
<SidebarComponent> | <SidebarComponent> | ||||
<TagSearch /> | |||||
<TagSearch/> | |||||
{CATEGORIES.map ((cat: Category) => cat in tags && ( | {CATEGORIES.map ((cat: Category) => cat in tags && ( | ||||
<div className="my-3" key={cat}> | <div className="my-3" key={cat}> | ||||
<SubsectionTitle>{categoryNames[cat]}</SubsectionTitle> | <SubsectionTitle>{categoryNames[cat]}</SubsectionTitle> | ||||
<ul> | <ul> | ||||
{tags[cat].map ((tag, i) => ( | {tags[cat].map ((tag, i) => ( | ||||
<li key={i} className="mb-1"> | <li key={i} className="mb-1"> | ||||
<TagLink tag={tag} /> | |||||
<TagLink tag={tag}/> | |||||
</li>))} | </li>))} | ||||
</ul> | </ul> | ||||
</div>))} | </div>))} | ||||
@@ -93,10 +93,10 @@ const TagSearch: React.FC = () => { | |||||
onFocus={() => setSuggestionsVsbl (true)} | onFocus={() => setSuggestionsVsbl (true)} | ||||
onBlur={() => setSuggestionsVsbl (false)} | onBlur={() => setSuggestionsVsbl (false)} | ||||
onKeyDown={handleKeyDown} | onKeyDown={handleKeyDown} | ||||
className="w-full px-3 py-2 border rounded dark:border-gray-600 dark:bg-gray-800 dark:text-white" /> | |||||
className="w-full px-3 py-2 border rounded dark:border-gray-600 dark:bg-gray-800 dark:text-white"/> | |||||
<TagSearchBox suggestions={suggestionsVsbl && suggestions.length ? suggestions : [] as Tag[]} | <TagSearchBox suggestions={suggestionsVsbl && suggestions.length ? suggestions : [] as Tag[]} | ||||
activeIndex={activeIndex} | activeIndex={activeIndex} | ||||
onSelect={handleTagSelect} /> | |||||
onSelect={handleTagSelect}/> | |||||
</div>) | </div>) | ||||
} | } | ||||
@@ -58,14 +58,14 @@ export default ({ posts }: Props) => { | |||||
return ( | return ( | ||||
<SidebarComponent> | <SidebarComponent> | ||||
<TagSearch /> | |||||
<TagSearch/> | |||||
<div className={cn (!(tagsVsbl) && 'hidden', 'md:block mt-4')}> | <div className={cn (!(tagsVsbl) && 'hidden', 'md:block mt-4')}> | ||||
<SectionTitle>タグ</SectionTitle> | <SectionTitle>タグ</SectionTitle> | ||||
<ul> | <ul> | ||||
{CATEGORIES.flatMap (cat => cat in tags ? ( | {CATEGORIES.flatMap (cat => cat in tags ? ( | ||||
tags[cat].map (tag => ( | tags[cat].map (tag => ( | ||||
<li key={tag.id} className="mb-1"> | <li key={tag.id} className="mb-1"> | ||||
<TagLink tag={tag} /> | |||||
<TagLink tag={tag}/> | |||||
</li>))) : [])} | </li>))) : [])} | ||||
</ul> | </ul> | ||||
<SectionTitle>関聯</SectionTitle> | <SectionTitle>関聯</SectionTitle> | ||||
@@ -41,7 +41,7 @@ export default ({ user }: Props) => { | |||||
{ name: '新規', to: '/wiki/new' }, | { name: '新規', to: '/wiki/new' }, | ||||
{ name: '全体履歴', to: '/wiki/changes' }, | { name: '全体履歴', to: '/wiki/changes' }, | ||||
{ name: 'ヘルプ', to: '/wiki/ヘルプ:Wiki' }, | { name: 'ヘルプ', to: '/wiki/ヘルプ:Wiki' }, | ||||
{ component: <Separator />, visible: wikiPageFlg }, | |||||
{ component: <Separator/>, visible: wikiPageFlg }, | |||||
{ name: `広場 (${ postCount || 0 })`, to: `/posts?tags=${ wikiTitle }`, | { name: `広場 (${ postCount || 0 })`, to: `/posts?tags=${ wikiTitle }`, | ||||
visible: wikiPageFlg }, | visible: wikiPageFlg }, | ||||
{ name: '履歴', to: `/wiki/changes?id=${ wikiId }`, visible: wikiPageFlg }, | { name: '履歴', to: `/wiki/changes?id=${ wikiId }`, visible: wikiPageFlg }, | ||||
@@ -108,7 +108,7 @@ export default ({ user }: Props) => { | |||||
))} | ))} | ||||
</div> | </div> | ||||
<TopNavUser user={user} /> | |||||
<TopNavUser user={user}/> | |||||
<a href="#" | <a href="#" | ||||
className="md:hidden ml-auto pr-4 | className="md:hidden ml-auto pr-4 | ||||
@@ -136,7 +136,7 @@ export default ({ user }: Props) => { | |||||
<div className={cn (menuOpen ? 'flex flex-col md:hidden' : 'hidden', | <div className={cn (menuOpen ? 'flex flex-col md:hidden' : 'hidden', | ||||
'bg-yellow-200 dark:bg-red-975 items-start')}> | 'bg-yellow-200 dark:bg-red-975 items-start')}> | ||||
<Separator /> | |||||
<Separator/> | |||||
{menu.map ((item, i) => ( | {menu.map ((item, i) => ( | ||||
<Fragment key={i}> | <Fragment key={i}> | ||||
<Link to={i === openItemIdx ? item.to : '#'} | <Link to={i === openItemIdx ? item.to : '#'} | ||||
@@ -163,8 +163,8 @@ export default ({ user }: Props) => { | |||||
{subItem.name} | {subItem.name} | ||||
</Link>)))} | </Link>)))} | ||||
</Fragment>))} | </Fragment>))} | ||||
<TopNavUser user={user} sp /> | |||||
<Separator /> | |||||
<TopNavUser user={user} sp/> | |||||
<Separator/> | |||||
</div> | </div> | ||||
</>) | </>) | ||||
} | } |
@@ -21,7 +21,7 @@ export default ({ user, sp }: Props) => { | |||||
return ( | return ( | ||||
<> | <> | ||||
{sp && <Separator />} | |||||
{sp && <Separator/>} | |||||
<Link to="/users/settings" | <Link to="/users/settings" | ||||
className={className}> | className={className}> | ||||
{user.name || '名もなきニジラー'} | {user.name || '名もなきニジラー'} | ||||
@@ -21,7 +21,7 @@ export default ({ children, checkBox }: Props) => { | |||||
<label className="flex items-center block gap-1"> | <label className="flex items-center block gap-1"> | ||||
<input type="checkbox" | <input type="checkbox" | ||||
checked={checkBox.checked} | checked={checkBox.checked} | ||||
onChange={checkBox.onChange} /> | |||||
onChange={checkBox.onChange}/> | |||||
{checkBox.label} | {checkBox.label} | ||||
</label> | </label> | ||||
</div>) | </div>) | ||||
@@ -7,4 +7,4 @@ type Props = { value?: string | |||||
export default ({ value, onChange }: Props) => ( | export default ({ value, onChange }: Props) => ( | ||||
<textarea className="rounded border w-full p-2 h-32" | <textarea className="rounded border w-full p-2 h-32" | ||||
value={value} | value={value} | ||||
onChange={onChange} />) | |||||
onChange={onChange}/>) |
@@ -51,7 +51,7 @@ export default ({ visible, onVisibleChange, setUser }: Props) => { | |||||
<div className="flex gap-2"> | <div className="flex gap-2"> | ||||
<Input placeholder="引継ぎコードを入力" | <Input placeholder="引継ぎコードを入力" | ||||
value={inputCode} | value={inputCode} | ||||
onChange={ev => setInputCode (ev.target.value)} /> | |||||
onChange={ev => setInputCode (ev.target.value)}/> | |||||
<Button onClick={handleTransfer}>引継ぐ</Button> | <Button onClick={handleTransfer}>引継ぐ</Button> | ||||
</div> | </div> | ||||
</DialogContent> | </DialogContent> | ||||
@@ -8,5 +8,5 @@ const helmetContext = { } | |||||
createRoot (document.getElementById ('root')!).render ( | createRoot (document.getElementById ('root')!).render ( | ||||
<HelmetProvider context={helmetContext}> | <HelmetProvider context={helmetContext}> | ||||
<App /> | |||||
<App/> | |||||
</HelmetProvider>) | </HelmetProvider>) |
@@ -1,4 +1,4 @@ | |||||
import ErrorScreen from '@/components/ErrorScreen' | import ErrorScreen from '@/components/ErrorScreen' | ||||
export default () => <ErrorScreen status={403} /> | |||||
export default () => <ErrorScreen status={403}/> |
@@ -1,4 +1,4 @@ | |||||
import ErrorScreen from '@/components/ErrorScreen' | import ErrorScreen from '@/components/ErrorScreen' | ||||
export default () => <ErrorScreen status={404} /> | |||||
export default () => <ErrorScreen status={404}/> |
@@ -1,4 +1,4 @@ | |||||
import ErrorScreen from '@/components/ErrorScreen' | import ErrorScreen from '@/components/ErrorScreen' | ||||
export default () => <ErrorScreen status={503} /> | |||||
export default () => <ErrorScreen status={503}/> |
@@ -72,9 +72,9 @@ export default ({ user }: Props) => { | |||||
switch (status) | switch (status) | ||||
{ | { | ||||
case 404: | case 404: | ||||
return <NotFound /> | |||||
return <NotFound/> | |||||
case 503: | case 503: | ||||
return <ServiceUnavailable /> | |||||
return <ServiceUnavailable/> | |||||
} | } | ||||
const url = post ? new URL (post.url) : null | const url = post ? new URL (post.url) : null | ||||
@@ -89,11 +89,11 @@ export default ({ user }: Props) => { | |||||
<div className="md:flex md:flex-1"> | <div className="md:flex md:flex-1"> | ||||
<Helmet> | <Helmet> | ||||
{(post?.thumbnail || post?.thumbnailBase) && ( | {(post?.thumbnail || post?.thumbnailBase) && ( | ||||
<meta name="thumbnail" content={post.thumbnail || post.thumbnailBase} />)} | |||||
<meta name="thumbnail" content={post.thumbnail || post.thumbnailBase}/>)} | |||||
{post && <title>{`${ post.title || post.url } | ${ SITE_TITLE }`}</title>} | {post && <title>{`${ post.title || post.url } | ${ SITE_TITLE }`}</title>} | ||||
</Helmet> | </Helmet> | ||||
<div className="hidden md:block"> | <div className="hidden md:block"> | ||||
<TagDetailSidebar post={post} /> | |||||
<TagDetailSidebar post={post}/> | |||||
</div> | </div> | ||||
<MainArea> | <MainArea> | ||||
{post | {post | ||||
@@ -103,8 +103,8 @@ export default ({ user }: Props) => { | |||||
? ( | ? ( | ||||
<NicoViewer id={videoId} | <NicoViewer id={videoId} | ||||
width={640} | width={640} | ||||
height={360} />) | |||||
: <img src={post.thumbnail} alt={post.url} className="mb-4 w-full" />} | |||||
height={360}/>) | |||||
: <img src={post.thumbnail} alt={post.url} className="mb-4 w-full"/>} | |||||
<Button onClick={changeViewedFlg} | <Button onClick={changeViewedFlg} | ||||
className={cn ('text-white', viewedClass)}> | className={cn ('text-white', viewedClass)}> | ||||
{post.viewed ? '閲覧済' : '未閲覧'} | {post.viewed ? '閲覧済' : '未閲覧'} | ||||
@@ -121,14 +121,14 @@ export default ({ user }: Props) => { | |||||
onSave={newPost => { | onSave={newPost => { | ||||
setPost (newPost) | setPost (newPost) | ||||
toast ({ description: '更新しました.' }) | toast ({ description: '更新しました.' }) | ||||
}} /> | |||||
}}/> | |||||
</Tab>)} | </Tab>)} | ||||
</TabGroup> | </TabGroup> | ||||
</>) | </>) | ||||
: 'Loading...'} | : 'Loading...'} | ||||
</MainArea> | </MainArea> | ||||
<div className="md:hidden"> | <div className="md:hidden"> | ||||
<TagDetailSidebar post={post} /> | |||||
<TagDetailSidebar post={post}/> | |||||
</div> | </div> | ||||
</div>) | </div>) | ||||
} | } |
@@ -111,7 +111,7 @@ export default () => { | |||||
</title> | </title> | ||||
</Helmet> | </Helmet> | ||||
<TagSidebar posts={posts.slice (0, 20)} /> | |||||
<TagSidebar posts={posts.slice (0, 20)}/> | |||||
<MainArea> | <MainArea> | ||||
<TabGroup> | <TabGroup> | ||||
@@ -124,14 +124,14 @@ export default () => { | |||||
scroll: containerRef.current?.scrollTop ?? 0 } | scroll: containerRef.current?.scrollTop ?? 0 } | ||||
sessionStorage.setItem (`posts:${ tagsQuery }`, | sessionStorage.setItem (`posts:${ tagsQuery }`, | ||||
JSON.stringify (statesToSave)) | JSON.stringify (statesToSave)) | ||||
}} />) | |||||
}}/>) | |||||
: !(loading) && '広場には何もありませんよ.'} | : !(loading) && '広場には何もありませんよ.'} | ||||
{loading && 'Loading...'} | {loading && 'Loading...'} | ||||
<div ref={loaderRef} className="h-12"></div> | <div ref={loaderRef} className="h-12"></div> | ||||
</Tab> | </Tab> | ||||
{tags.length === 1 && ( | {tags.length === 1 && ( | ||||
<Tab name="Wiki"> | <Tab name="Wiki"> | ||||
<WikiBody title={tags[0]} body={wikiPage?.body} /> | |||||
<WikiBody title={tags[0]} body={wikiPage?.body}/> | |||||
<div className="my-2"> | <div className="my-2"> | ||||
<Link to={`/wiki/${ encodeURIComponent (tags[0]) }`}> | <Link to={`/wiki/${ encodeURIComponent (tags[0]) }`}> | ||||
Wiki を見る | Wiki を見る | ||||
@@ -20,7 +20,7 @@ type Props = { user: User | null } | |||||
export default ({ user }: Props) => { | export default ({ user }: Props) => { | ||||
if (!(['admin', 'member'].some (r => user?.role === r))) | if (!(['admin', 'member'].some (r => user?.role === r))) | ||||
return <Forbidden /> | |||||
return <Forbidden/> | |||||
const navigate = useNavigate () | const navigate = useNavigate () | ||||
@@ -125,7 +125,7 @@ export default ({ user }: Props) => { | |||||
value={url} | value={url} | ||||
onChange={e => setURL (e.target.value)} | onChange={e => setURL (e.target.value)} | ||||
className="w-full border p-2 rounded" | className="w-full border p-2 rounded" | ||||
onBlur={handleURLBlur} /> | |||||
onBlur={handleURLBlur}/> | |||||
</div> | </div> | ||||
{/* タイトル */} | {/* タイトル */} | ||||
@@ -141,7 +141,7 @@ export default ({ user }: Props) => { | |||||
value={title} | value={title} | ||||
placeholder={titleLoading ? 'Loading...' : ''} | placeholder={titleLoading ? 'Loading...' : ''} | ||||
onChange={ev => setTitle (ev.target.value)} | onChange={ev => setTitle (ev.target.value)} | ||||
disabled={titleAutoFlg} /> | |||||
disabled={titleAutoFlg}/> | |||||
</div> | </div> | ||||
{/* サムネール */} | {/* サムネール */} | ||||
@@ -169,11 +169,11 @@ export default ({ user }: Props) => { | |||||
setThumbnailFile (file) | setThumbnailFile (file) | ||||
setThumbnailPreview (URL.createObjectURL (file)) | setThumbnailPreview (URL.createObjectURL (file)) | ||||
} | } | ||||
}} />)} | |||||
}}/>)} | |||||
{thumbnailPreview && ( | {thumbnailPreview && ( | ||||
<img src={thumbnailPreview} | <img src={thumbnailPreview} | ||||
alt="preview" | alt="preview" | ||||
className="mt-2 max-h-48 rounded border" />)} | |||||
className="mt-2 max-h-48 rounded border"/>)} | |||||
</div> | </div> | ||||
{/* タグ */} | {/* タグ */} | ||||
@@ -181,7 +181,7 @@ export default ({ user }: Props) => { | |||||
<div> | <div> | ||||
<Label>タグ</Label> | <Label>タグ</Label> | ||||
<TextArea value={tags} | <TextArea value={tags} | ||||
onChange={ev => setTags (ev.target.value)} /> | |||||
onChange={ev => setTags (ev.target.value)}/> | |||||
</div> | </div> | ||||
{/* 送信 */} | {/* 送信 */} | ||||
@@ -114,19 +114,19 @@ export default ({ user }: Props) => { | |||||
{nicoTags.map ((tag, i) => ( | {nicoTags.map ((tag, i) => ( | ||||
<tr key={i}> | <tr key={i}> | ||||
<td className="p-2"> | <td className="p-2"> | ||||
<TagLink tag={tag} withWiki={false} withCount={false} /> | |||||
<TagLink tag={tag} withWiki={false} withCount={false}/> | |||||
</td> | </td> | ||||
<td className="p-2"> | <td className="p-2"> | ||||
{editing[tag.id] | {editing[tag.id] | ||||
? ( | ? ( | ||||
<TextArea value={rawTags[tag.id]} onChange={ev => { | <TextArea value={rawTags[tag.id]} onChange={ev => { | ||||
setRawTags (rawTags => ({ ...rawTags, [tag.id]: ev.target.value })) | setRawTags (rawTags => ({ ...rawTags, [tag.id]: ev.target.value })) | ||||
}} />) | |||||
}}/>) | |||||
: tag.linkedTags.map((lt, j) => ( | : tag.linkedTags.map((lt, j) => ( | ||||
<span key={j} className="mr-2"> | <span key={j} className="mr-2"> | ||||
<TagLink tag={lt} | <TagLink tag={lt} | ||||
linkFlg={false} | linkFlg={false} | ||||
withCount={false} /> | |||||
withCount={false}/> | |||||
</span>))} | </span>))} | ||||
</td> | </td> | ||||
{memberFlg && ( | {memberFlg && ( | ||||
@@ -55,7 +55,7 @@ export default ({ user, setUser }: Props) => { | |||||
return ( | return ( | ||||
<MainArea> | <MainArea> | ||||
<Helmet> | <Helmet> | ||||
<meta name="robots" content="noindex" /> | |||||
<meta name="robots" content="noindex"/> | |||||
<title>設定 | {SITE_TITLE}</title> | <title>設定 | {SITE_TITLE}</title> | ||||
</Helmet> | </Helmet> | ||||
@@ -71,7 +71,7 @@ export default ({ user, setUser }: Props) => { | |||||
className="w-full border rounded p-2" | className="w-full border rounded p-2" | ||||
value={name} | value={name} | ||||
placeholder="名もなきニジラー" | placeholder="名もなきニジラー" | ||||
onChange={ev => setName (ev.target.value)} /> | |||||
onChange={ev => setName (ev.target.value)}/> | |||||
{(user && !(user.name)) && ( | {(user && !(user.name)) && ( | ||||
<p className="mt-1 text-sm text-red-500"> | <p className="mt-1 text-sm text-red-500"> | ||||
名前が未設定のアカウントは 30 日間アクセスしないと削除されます!!!! | 名前が未設定のアカウントは 30 日間アクセスしないと削除されます!!!! | ||||
@@ -104,10 +104,10 @@ export default ({ user, setUser }: Props) => { | |||||
<UserCodeDialogue visible={userCodeVsbl} | <UserCodeDialogue visible={userCodeVsbl} | ||||
onVisibleChange={setUserCodeVsbl} | onVisibleChange={setUserCodeVsbl} | ||||
user={user} | user={user} | ||||
setUser={setUser} /> | |||||
setUser={setUser}/> | |||||
<InheritDialogue visible={inheritVsbl} | <InheritDialogue visible={inheritVsbl} | ||||
onVisibleChange={setInheritVsbl} | onVisibleChange={setInheritVsbl} | ||||
setUser={setUser} /> | |||||
setUser={setUser}/> | |||||
</MainArea>) | </MainArea>) | ||||
} | } |
@@ -98,7 +98,7 @@ export default () => { | |||||
<MainArea> | <MainArea> | ||||
<Helmet> | <Helmet> | ||||
<title>{`${ title } Wiki | ${ SITE_TITLE }`}</title> | <title>{`${ title } Wiki | ${ SITE_TITLE }`}</title> | ||||
{!(wikiPage?.body) && <meta name="robots" content="noindex" />} | |||||
{!(wikiPage?.body) && <meta name="robots" content="noindex"/>} | |||||
</Helmet> | </Helmet> | ||||
{(wikiPage && version) && ( | {(wikiPage && version) && ( | ||||
@@ -120,18 +120,18 @@ export default () => { | |||||
<TagLink tag={tag} | <TagLink tag={tag} | ||||
withWiki={false} | withWiki={false} | ||||
withCount={false} | withCount={false} | ||||
{...(version && { to: `/wiki/${ encodeURIComponent (title) }` })} /> | |||||
{...(version && { to: `/wiki/${ encodeURIComponent (title) }` })}/> | |||||
</PageTitle> | </PageTitle> | ||||
<div className="prose mx-auto p-4"> | <div className="prose mx-auto p-4"> | ||||
{wikiPage === undefined | {wikiPage === undefined | ||||
? 'Loading...' | ? 'Loading...' | ||||
: <WikiBody title={title} body={wikiPage?.body} />} | |||||
: <WikiBody title={title} body={wikiPage?.body}/>} | |||||
</div> | </div> | ||||
{(!(version) && posts.length > 0) && ( | {(!(version) && posts.length > 0) && ( | ||||
<TabGroup> | <TabGroup> | ||||
<Tab name="広場"> | <Tab name="広場"> | ||||
<PostList posts={posts} /> | |||||
<PostList posts={posts}/> | |||||
</Tab> | </Tab> | ||||
</TabGroup>)} | </TabGroup>)} | ||||
</MainArea>) | </MainArea>) | ||||
@@ -42,7 +42,7 @@ export default () => { | |||||
diff.diff.map (d => ( | diff.diff.map (d => ( | ||||
<span className={cn (d.type === 'added' && 'bg-green-200 dark:bg-green-800', | <span className={cn (d.type === 'added' && 'bg-green-200 dark:bg-green-800', | ||||
d.type === 'removed' && 'bg-red-200 dark:bg-red-800')}> | d.type === 'removed' && 'bg-red-200 dark:bg-red-800')}> | ||||
{d.content == '\n' ? <br /> : d.content} | |||||
{d.content == '\n' ? <br/> : d.content} | |||||
</span>))) | </span>))) | ||||
: 'Loading...'} | : 'Loading...'} | ||||
</div> | </div> | ||||
@@ -21,7 +21,7 @@ type Props = { user: User | null } | |||||
export default ({ user }: Props) => { | export default ({ user }: Props) => { | ||||
if (!(['admin', 'member'].some (r => user?.role === r))) | if (!(['admin', 'member'].some (r => user?.role === r))) | ||||
return <Forbidden /> | |||||
return <Forbidden/> | |||||
const { id } = useParams () | const { id } = useParams () | ||||
@@ -73,7 +73,7 @@ export default ({ user }: Props) => { | |||||
<input type="text" | <input type="text" | ||||
value={title} | value={title} | ||||
onChange={e => setTitle (e.target.value)} | onChange={e => setTitle (e.target.value)} | ||||
className="w-full border p-2 rounded" /> | |||||
className="w-full border p-2 rounded"/> | |||||
</div> | </div> | ||||
{/* 本文 */} | {/* 本文 */} | ||||
@@ -82,7 +82,7 @@ export default ({ user }: Props) => { | |||||
<MdEditor value={body} | <MdEditor value={body} | ||||
style={{ height: '500px' }} | style={{ height: '500px' }} | ||||
renderHTML={text => mdParser.render (text)} | renderHTML={text => mdParser.render (text)} | ||||
onChange={({ text }) => setBody (text)} /> | |||||
onChange={({ text }) => setBody (text)}/> | |||||
</div> | </div> | ||||
{/* 送信 */} | {/* 送信 */} | ||||
@@ -27,54 +27,54 @@ export default () => { | |||||
return ( | return ( | ||||
<MainArea> | <MainArea> | ||||
<Helmet> | |||||
<title>{`Wiki 変更履歴 | ${ SITE_TITLE }`}</title> | |||||
</Helmet> | |||||
<table className="table-auto w-full border-collapse"> | |||||
<thead> | |||||
<tr> | |||||
<th></th> | |||||
<th className="p-2 text-left">タイトル</th> | |||||
<th className="p-2 text-left">変更</th> | |||||
<th className="p-2 text-left">日時</th> | |||||
</tr> | |||||
</thead> | |||||
<tbody> | |||||
{changes.map (change => ( | |||||
<tr key={change.sha}> | |||||
<td> | |||||
{change.changeType === 'update' && ( | |||||
<Link to={`/wiki/${ change.wikiPage.id }/diff?from=${ change.pred }&to=${ change.sha }`}> | |||||
差分 | |||||
</Link>)} | |||||
</td> | |||||
<td className="p-2"> | |||||
<Link to={`/wiki/${ encodeURIComponent (change.wikiPage.title) }?version=${ change.sha }`}> | |||||
{change.wikiPage.title} | |||||
</Link> | |||||
</td> | |||||
<td className="p-2"> | |||||
{(() => { | |||||
switch (change.changeType) | |||||
{ | |||||
case 'create': | |||||
return '新規' | |||||
case 'update': | |||||
return '更新' | |||||
case 'delete': | |||||
return '削除' | |||||
} | |||||
}) ()} | |||||
</td> | |||||
<td className="p-2"> | |||||
<Link to={`/users/${ change.user.id }`}> | |||||
{change.user.name} | |||||
</Link> | |||||
<br /> | |||||
{change.timestamp} | |||||
</td> | |||||
</tr>))} | |||||
</tbody> | |||||
</table> | |||||
<Helmet> | |||||
<title>{`Wiki 変更履歴 | ${ SITE_TITLE }`}</title> | |||||
</Helmet> | |||||
<table className="table-auto w-full border-collapse"> | |||||
<thead> | |||||
<tr> | |||||
<th></th> | |||||
<th className="p-2 text-left">タイトル</th> | |||||
<th className="p-2 text-left">変更</th> | |||||
<th className="p-2 text-left">日時</th> | |||||
</tr> | |||||
</thead> | |||||
<tbody> | |||||
{changes.map (change => ( | |||||
<tr key={change.sha}> | |||||
<td> | |||||
{change.changeType === 'update' && ( | |||||
<Link to={`/wiki/${ change.wikiPage.id }/diff?from=${ change.pred }&to=${ change.sha }`}> | |||||
差分 | |||||
</Link>)} | |||||
</td> | |||||
<td className="p-2"> | |||||
<Link to={`/wiki/${ encodeURIComponent (change.wikiPage.title) }?version=${ change.sha }`}> | |||||
{change.wikiPage.title} | |||||
</Link> | |||||
</td> | |||||
<td className="p-2"> | |||||
{(() => { | |||||
switch (change.changeType) | |||||
{ | |||||
case 'create': | |||||
return '新規' | |||||
case 'update': | |||||
return '更新' | |||||
case 'delete': | |||||
return '削除' | |||||
} | |||||
}) ()} | |||||
</td> | |||||
<td className="p-2"> | |||||
<Link to={`/users/${ change.user.id }`}> | |||||
{change.user.name} | |||||
</Link> | |||||
<br/> | |||||
{change.timestamp} | |||||
</td> | |||||
</tr>))} | |||||
</tbody> | |||||
</table> | |||||
</MainArea>) | </MainArea>) | ||||
} | } |
@@ -21,7 +21,7 @@ type Props = { user: User | null } | |||||
export default ({ user }: Props) => { | export default ({ user }: Props) => { | ||||
if (!(['admin', 'member'].some (r => user?.role === r))) | if (!(['admin', 'member'].some (r => user?.role === r))) | ||||
return <Forbidden /> | |||||
return <Forbidden/> | |||||
const location = useLocation () | const location = useLocation () | ||||
const navigate = useNavigate () | const navigate = useNavigate () | ||||
@@ -67,7 +67,7 @@ export default ({ user }: Props) => { | |||||
<input type="text" | <input type="text" | ||||
value={title} | value={title} | ||||
onChange={e => setTitle (e.target.value)} | onChange={e => setTitle (e.target.value)} | ||||
className="w-full border p-2 rounded" /> | |||||
className="w-full border p-2 rounded"/> | |||||
</div> | </div> | ||||
{/* 本文 */} | {/* 本文 */} | ||||
@@ -76,7 +76,7 @@ export default ({ user }: Props) => { | |||||
<MdEditor value={body} | <MdEditor value={body} | ||||
style={{ height: '500px' }} | style={{ height: '500px' }} | ||||
renderHTML={text => mdParser.render (text)} | renderHTML={text => mdParser.render (text)} | ||||
onChange={({ text }) => setBody (text)} /> | |||||
onChange={({ text }) => setBody (text)}/> | |||||
</div> | </div> | ||||
{/* 送信 */} | {/* 送信 */} | ||||
@@ -1,5 +0,0 @@ | |||||
// import { Route, | |||||
// createBrowserRouter, | |||||
// createRoutesFromElements } from 'react-router-dom' | |||||
// | |||||
// import App from '@/App' |