22import { TheInfiniteX } from "./img" ; // TheInfiniteX は適切な画像のパスに置き換えてください
33import "./share.css" ;
44import { useTranslations } from "next-intl" ;
5- import { useEffect , useState } from "react" ; // useEffectとuseStateをインポート
65
76interface ToXTwitterProps {
87 hashtags ?: string [ ] ; // ツイートに含めるハッシュタグの配列 (オプション)
@@ -17,48 +16,36 @@ export default function SNSShare() {
1716}
1817export function ToXTwitter ( { hashtags, via } : ToXTwitterProps ) {
1918 const t = useTranslations ( "pages.article.content.words" ) ; // 翻訳フック
20- const [ shareUrl , setShareUrl ] = useState ( "#" ) ; // 共有URLを保持するstate。初期値は無効なリンク'#'
2119
22- useEffect ( ( ) => {
23- // このeffectはクライアントサイドでのみ実行されます
24- if ( typeof window !== "undefined" && typeof document !== "undefined" ) {
25- const pageUrl = window . location . href ; // 現在のページのURLを自動取得
26- // ページのタイトルまたは適切なテキストを自動取得(ここではタイトルを使用)
27- const pageText = document . title || "" ; // document.titleがない場合を考慮
20+ const baseUrl = "https://twitter.com/intent/tweet" ;
21+ const queryParams = new URLSearchParams ( ) ;
2822
29- const baseUrl = "https://twitter.com/intent/tweet" ;
30- const queryParams = new URLSearchParams ( {
31- text : pageText ,
32- url : pageUrl ,
33- } ) ;
23+ if ( typeof window !== "undefined" && typeof document !== "undefined" ) {
24+ const pageUrl = window . location . href ; // 現在のページのURLを自動取得
25+ const pageText = document . title || "" ; // document.titleがない場合を考慮
26+ queryParams . set ( "text" , pageText ) ;
27+ queryParams . set ( "url" , pageUrl ) ;
28+ }
3429
35- // オプションのハッシュタグを追加
36- if ( hashtags && hashtags . length > 0 ) {
37- queryParams . append ( "hashtags" , hashtags . join ( "," ) ) ;
38- }
30+ if ( hashtags && hashtags . length > 0 ) {
31+ queryParams . append ( "hashtags" , hashtags . join ( "," ) ) ;
32+ }
3933
40- // オプションのviaを追加
41- if ( via ) {
42- queryParams . append ( "via" , via ) ;
43- }
34+ if ( via ) {
35+ queryParams . append ( "via" , via ) ;
36+ }
4437
45- // 生成した共有URLをstateにセット
46- setShareUrl ( `${ baseUrl } ?${ queryParams . toString ( ) } ` ) ;
47- }
48- // hashtags または via props が変更されたらeffectを再実行
49- } , [ hashtags , via ] ) ;
38+ const shareUrl = `${ baseUrl } ?${ queryParams . toString ( ) } ` ;
5039
5140 return (
5241 < a
53- href = { shareUrl } // stateから取得した共有URLを使用
42+ href = { shareUrl }
5443 target = "_blank"
5544 rel = "noopener noreferrer"
56- className = "twitter-share-button" // このクラス名でCSSを適用
57- aria-label = { t ( "shareX" ) } // 翻訳されたテキストをaria-labelに使用
45+ className = "twitter-share-button"
46+ aria-label = { t ( "shareX" ) }
5847 >
59- { /* Xのアイコン画像 - next/imageコンポーネントを使用 */ }
6048 { TheInfiniteX }
61- { /* 共有ボタンのテキスト - 翻訳されたテキストを使用 */ }
6249 < p > { t ( "shareX" ) } </ p >
6350 </ a >
6451 ) ;
0 commit comments