前提
FirebaseでSNSアカウントによるサインアップとサインイン機能を実装しています。
ReactとTypeScriptを使用しています。
tsx
1auth.signInWithPopup(new firebase.auth.GoogleAuthProvider())
上記のコードでGoogleアカウントによるサインアップとサインインは可能になります。
実現したいこと
サインアップとサインインに使えるSNSのアカウントごとにauth.signInWithPopup(...)
を書かなければいけないため、押したSNSボタンに合わせて動的にProviderを切り替えたいです。
該当のソースコード
tsx
1const SNS = ["Google", "Twitter", "Facebook"] 2const SNSButton = SNS.map((item, index)=>( 3 <div key={index}> 4 <button onClick={signClick} name={item}>{item}</button> 5 </div> 6) 7 8const signClick =()=> { 9 if(sign === "Up") return signUp(); 10 // signはグローバルステートです。サインアップ、サインインを開くボタンを押す際に、setStateしています。 11 signIn(); 12} 13 14const signUp =()=> { 15 auth.signInWithPopup(new firebase.auth.GoogleAuthProvider()) 16 ... 17} 18 19const signIn =()=> { 20 auth.signInWithPopup(new firebase.auth.GoogleAuthProvider()) 21 ... 22} 23 24return( 25 <> 26 <h2>Sign {sign}</h2> 27 <div>{SNSButton}</div> 28 </> 29)
試したこと
ProviderをStateで管理して、signClick
関数内でボタンのname属性を取得し、取得したname属性に沿ってswitchでProviderをsetStateしました。
tsx
1const googleProvider = new firebase.auth.GoogleAuthProvider(); 2const twitterProvider = new firebase.auth.TwitterAuthProvider(); 3const facebookProvider = new firebase.auth.FacebookAuthProvider(); 4const [provider, setProvider] = useState(googleProvider); 5 6const signClick = (e: any)=> { 7 const { name } = e.target; 8 switch (name) { 9 case "Google": 10 setProvider(googleProvider); 11 break; 12 case "Twitter": 13 setProvider(twitterProvider); 14 break; 15 case "Facebook": 16 setProvider(facebookProvider); 17 break; 18 default: 19 setProvider(googleProvider); 20 } 21 if(sign === "Up") return signUp(); 22 signIn(); 23} 24 25const signUp =()=> { 26 auth.signInWithPopup(provider) 27 ... 28} 29 30const signIn =()=> { 31 auth.signInWithPopup(provider) 32 ... 33}
上記コードは下記の問題点があります。
- switchの
setProvider(twitterProvider)
にのみIDE(VSCode)が下記のエラーを表示します
型 'TwitterAuthProvider' の引数を型 'SetStateAction<GoogleAuthProvider>' のパラメーターに割り当てることはできません。
signClick
関数の引数e
がany型
VSCodeがReact.MouseEvent<HTMLButtonElement, MouseEvent>
を推論してくれますが、これを設定するとconst { name } = e.target
に下記のエラーが表示されます
プロパティ 'name' は型 'EventTarget' に存在しません。
- そもそもsetProviderできていないです
switchのTwitterケースだけコメントアウトし、signUp
関数頭でconsole.log(provider)
を記述し、Facebookボタンを押したところ、Facebookアカウントのポップアップではなく、Googleアカウントのポップアップが表示されました。
「name属性が取得できておらず、初期値またはswitchのデフォルトが適用されているのかな」と思い、switchの直前にconsole.log(name)
を記述し、Facebookボタンを押したところ、コンソールにはFacebookと表示されました。
実装方法にこだわりはないので、switchを使用することやProviderをstateで管理するなど、試したことに書いた方法論に執着は無いです。
実現したいことが実現でき、かつシンプルに書けることが理想なので、よりよい方法があれば解決策と合わせあてご教示いただきたいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/06 11:34