質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

2638閲覧

Next.jsにreact-reduxを使ってGoogle認証機能を実装したい

nekonekonekko

総合スコア5

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/08/10 02:46

編集2021/08/10 03:16

前提・実現したいこと

React(Next.js),TypeScript,Firebaseでタイマーアプリを作っています。
ログイン画面でGoogle認証機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

npm run devで実行

ターミナル出力

Error: could not find react-redux context value; please ensure the component is wrapped in a <Provider> at useReduxContext (C:\Users\sekai\pomodoro-clock\node_modules\react-redux\lib\hooks\useReduxContext.js:30:11) at useSelector (C:\Users\sekai\pomodoro-clock\node_modules\react-redux\lib\hooks\useSelector.js:133:28) at Home (C:\Users\sekai\pomodoro-clock.next\server\pages\index.js:447:72) at processChild (C:\Users\sekai\pomodoro-clock\node_modules\react-dom\cjs\react-dom-server.node.development.js:3353:14) at resolve (C:\Users\sekai\pomodoro-clock\node_modules\react-dom\cjs\react-dom-server.node.development.js:3270:5) at ReactDOMServerRenderer.render (C:\Users\sekai\pomodoro-clock\node_modules\react-dom\cjs\react-dom-server.node.development.js:3753:22) at ReactDOMServerRenderer.read (C:\Users\sekai\pomodoro-clock\node_modules\react-dom\cjs\react-dom-server.node.development.js:3690:29) at renderToString (C:\Users\sekai\pomodoro-clock\node_modules\react-dom\cjs\react-dom-server.node.development.js:4298:27) at Object.renderPage (C:\Users\sekai\pomodoro-clock\node_modules\next\dist\next-server\server\render.js:54:854) at Function.getInitialProps (C:\Users\sekai\pomodoro-clock.next\server\vendors-node_modules_next_dist_pages__document_js.js:627:19)

ローカルホストのサーバーエラー
イメージ説明

該当のソースコード

React

1import * as React from 'react'; 2import { useState, useEffect } from 'react'; 3import dynamic from 'next/dynamic'; 4import firebase from 'util/firebase'; 5import CategoryList from 'components/CategoryList'; 6import Header from 'components/Header'; 7import Calendar from 'components/Calendar'; 8import { useSelector, useDispatch } from 'react-redux'; 9import { selectUser, login, logout } from 'features/userSlice'; 10import { auth } from '../../lib/db'; 11import Auth from 'components/Auth'; 12 13//ApexCharts読み込むのにNext.jsで必要な設定 14const DynamicGraphComponentWithNoSSR = dynamic(() => import('../views/Graph/Graph'), { ssr: false }); 15 16const Home: React.FC = (props) => { 17 const [categories, setCategories] = useState([]); 18 //HomeComponentからredux/userを取得してローカルのuserに渡す 19 const user = useSelector(selectUser); 20 //login, logoutアクションを送信(dispatch)する 21 const dispatch = useDispatch(); 22 23 useEffect(() => { 24 //firebaseのauth管理下のuser.stateに変化があれば毎回呼び出す 25 const unSub = auth.onAuthStateChanged((authUser) => { 26 if (authUser) { 27 dispatch( 28 //useSlice.loginをdispatch 29 login({ 30 uid: authUser.uid, 31 photoUrl: authUser.photoURL, 32 displayName: authUser.displayName, 33 }), 34 ); 35 } else { 36 //useSlice.logoutをdispatch 37 dispatch(logout()); 38 } 39 }); 40 return () => { 41 unSub(); 42 }; 43 }, [dispatch]); 44 45 useEffect(() => { 46 async function fetchData() { 47 const userId = '12345678'; //テストId 48 await Promise.all([getUser(userId), getCategories(userId)]); 49 } 50 fetchData(); 51 }, []); 52 53 const getUser = async (userId: any) => { 54 try { 55 const user = await firebase.getUserData(userId); 56 } catch (e) { 57 console.error(e); 58 } 59 }; 60 61 const getCategories = async (userId: any) => { 62 try { 63 const categories = await firebase.getCategories(userId); 64 setCategories(categories); 65 } catch (e) { 66 console.error(e); 67 } 68 }; 69 70 //{user.uid ? (ユーザが存在する時の処理) :(ユーザが存在しない時の処理)} 71 return ( 72 <> 73 74 <Header title="タイマー" /> 75 <div className="content"> 76 <div style={{ marginBottom: 40 }}> 77 <p className="title">カテゴリー</p> 78 <CategoryList categories={categories} /> 79 </div> 80 <div style={{ marginBottom: 40 }}> 81 <p className="title">作業時間</p> 82 <React.StrictMode> 83 <DynamicGraphComponentWithNoSSR /> 84 </React.StrictMode> 85 </div> 86 <div style={{ marginBottom: 40 }}> 87 <p className="title">カレンダー</p> 88 <Calendar /> 89 </div> 90 </div> 91 92 <Auth /> 93 94 </> 95 ); 96}; 97 98export default Home;

store

export const store = configureStore({ reducer: { user: userReducer, }, });

action

export const userSlice = createSlice({ name: 'user', initialState:{ user: {uid:"", displayName: ""}, }, reducers: { login: (state, action) => { state.user = action.payload; }, logout: (state) => { state.user = {uid:"", displayName: ""}; }, //USER型のオブジェクトをreact componentからdispatchする際に受け取る updateUserProfile: (state, action: PayloadAction<USER>) => { //payload/displayNameをRedux/userステート/displayName属性に更新 state.user.displayName = action.payload.displayName; state.user.photoUrl = action.payload.photoUrl; }, }, });

試したこと

エラー内容から、Provider内にコンポーネントを格納する必要があるとのことですが、
具体的な手順が不明で手が付けられないです。

ソリューションリスト

補足情報(FW/ツールのバージョンなど)

"react-redux": "version": "7.2.4",
"react-dom": "version": "17.0.2",

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

p19ljk

2021/08/10 02:51

storeやactionは作成されていますよね? なにか根本的にreduxに関して勘違いしているような気がしますが。。。
nekonekonekko

2021/08/10 02:58

store,actionは作成しておりますが、 見様見真似でやっている部分はありますね。 単純にNext.jsで作成中のアプリに認証機能を加える目的だったのですが、 少し面倒な手順を踏んでしまっているようです。
p19ljk

2021/08/10 03:07

作成してあるのですね! では後はreduxのProviderコンポーネントでwrapして、Providerのpropsのstoreに作成してあるストアを渡せば使えるようになると思います。
nekonekonekko

2021/08/10 03:17

ありがとうございます! 試してみますm(__)m
nekonekonekko

2021/08/10 03:41 編集

↓回答ありがとうございます。 必要モジュールのインポート、reduxのProviderコンポーネントでwrapを行いましたが、 変わらず同じエラーが出ている状況です。 ``` import { Provider } from 'react-redux'; import store from 'app/store'; return ( <> <Provider store={store}> <Auth /> </Provider> </> ); }; ``` <Auth />はサインイン画面の内容で、Google認証でログインする際に reduxを利用する想定です。何か不可解な点等ありますでしょうか? ``` const Auth:React.FC = () => { const classes = useStyles(); const signInGoogle = async () => { await auth.signInWithPopup(provider).catch((err) => alert(err.message)); } .... ```
p19ljk

2021/08/10 06:37

useSelectorに渡しているselectUserはどのような内容になっていますか? useSelectorは「reduxのstateを受け取って取得したいstate値を返す関数」を渡すのですが。
nekonekonekko

2021/08/11 04:07

あっているかわかりませんがこの内容です ``` export const { login, logout, updateUserProfile } = userSlice.actions; export const selectUser = (state: RootState) => state.user.user; export default userSlice.reducer; ```
p19ljk

2021/08/11 04:34

今ひとつ気になったのですが、useSelector等redux機能を利用しているのはAuthではなくHomeですよね? であればHomeをProviderで囲わなければ利用できません。 要するにProviderの子コンポーネントでreduxが利用できるという感じです。 今だとAuth内で利用する形になっています。
nekonekonekko

2021/08/12 00:32 編集

すみません。 お時間を割いていただき申し訳ないのですが、時間的に間に合いそうにないためreduxを使わず シンプルなfirebase auth構成で認証機能を実装しました。 以下の記事を参考にしました。 `https://zenn.dev/k_logic24/articles/react-auth-with-firebase` その後、少々不具合はありますが別の質問で投稿する予定です。 この度はご対応頂きありがとうございました。
guest

回答1

0

ベストアンサー

こんな感じでreduxが利用できます。
構造は例です。

javascript

1import { Provider } from 'react-redux' 2import Store from './redux/store // これに関しては自作しているstoreのパス 3 4return ( 5 <Provider store={Store}> 6 <App /> // ここはreduxを利用したいコンポーネント(一番rootのコンポーネントで良いかと) 7 </Provider> 8)

投稿2021/08/10 03:10

p19ljk

総合スコア146

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問