|
- import { useState } from 'react'
- import YoutubeEmbed from 'react-youtube'
-
- import NicoViewer from '@/components/NicoViewer'
- import TwitterEmbed from '@/components/TwitterEmbed'
-
- import type { FC } from 'react'
-
- import type { Post } from '@/types'
-
- type Props = { post: Post }
-
-
- export default (({ post }: Props) => {
- const url = new URL (post.url)
-
- switch (url.hostname.split ('.').slice (-2).join ('.'))
- {
- case 'nicovideo.jp':
- {
- const [videoId] = url.pathname.match (/(?<=\/watch\/)[a-zA-Z0-9]+?(?=\/|$)/)!
- return <NicoViewer id={videoId} width={640} height={360}/>
- }
- case 'twitter.com':
- case 'x.com':
- const [userId] = url.pathname.match (/(?<=\/)[^\/]+?(?=\/|$|\?)/)!
- const [statusId] = url.pathname.match (/(?<=\/status\/)\d+?(?=\/|$|\?)/)!
- return <TwitterEmbed userId={userId} statusId={statusId}/>
- case 'youtube.com':
- {
- const videoId = url.searchParams.get ('v')!
- return (
- <YoutubeEmbed videoId={videoId} opts={{ playerVars: {
- playsinline: 1,
- autoplay: 1,
- mute: 0,
- loop: 1,
- width: '640',
- height: '360' } }}/>)
- }
- }
-
- const [framed, setFramed] = useState (false)
-
- return (
- <>
- {framed
- ? (
- <iframe
- src={post.url}
- title={post.title || post.url}
- width={640}
- height={360}/>)
- : (
- <div>
- <a href="#" onClick={e => {
- e.preventDefault ()
- setFramed (confirm ('未確認の外部ページを表示します。\n'
- + '悪意のあるスクリプトが実行される可能性があります。\n'
- + '表示しますか?'))
- return
- }}>
- 外部ページを表示
- </a>
- </div>)}
- </>)
- }) satisfies FC<Props>
|