★前回の記事
ログインしたユーザ自身のタスク以外は変更できないように修正します。
ログインしたユーザのタスク一覧以外を表示している時は、以下のようにします。
- タスク追加フォーム(
AddTodo
コンポーネント)を非表示にする - タスクをクリックされた時に、タスク完了フラグの切り替えをしない
ログインしたユーザ自身のタスク一覧でないときは、タスク追加フォーム(AddTodo
コンポーネント)を非表示にする
自身のタスク一覧でないときは、タスク追加フォーム(AddTodo
コンポーネント)を非表示にします。
パスのuidとログインしているユーザののuidを比較して、違っている場合はAddTodoコンポーネントを非表示にします。
パスのuidとログインしているユーザののuidが同一かどうかはisOwnTodos
という変数で管理します。
src/component/TodoComponent.js
let TodoComponent = ({isOwnTodos, match: { params: {uid}}}) => ( // #1 <div> {isOwnTodos && <AddTodo uid={uid} />} {/* #2 */} <NoticeForTodo /> <VisibleTodoList uid={uid} /> <Footer /> </div> ) TodoComponent.propTypes = { isOwnTodos: PropTypes.bool.isRequired, // #3 // 後略 } const mapStateToProps = ({firebase: {auth}}, {match}) => ({ isOwnTodos: auth.uid === match.params.uid, // #4 })
isOwnTodos
をpropsから受け取ります(#1)。isOwnTodos
がtrueの時のみAddTodo
コンポーネントを描画します(#2)。isOwnTodos
のPropTypeを追加します(#3)。- ログインしているユーザのuid(
state.firebase.auth.uid
)と、パスで指定されたuid(this.props.match.params.uid
)を比較して、同一ならば、isOwnTodos
の値をtrueにします(#4)。
ログインしたユーザ自身のタスク一覧でないときは、タスク完了フラグの切り替えをしない
上記と同様に、自身のタスク一覧でないときは、タスク完了フラグの切り替えをしないように処理を書き換えます。
src/component/TodoComponent.js
let TodoComponent = ({isOwnTodos, match: { params: {uid}}}) => ( <div> {isOwnTodos && <AddTodo />} <NoticeForTodo /> <VisibleTodoList uid={uid} isOwnTodos={isOwnTodos} /> {/* #1 */} <Footer /> </div> )
VisibleTodoList
にisOwnTodos
を渡します(#1)。このpropsは、VisibleTodoList
を通して、TodoList
に渡されます。
src/component/TodoList.js
(#1, #2などのコメントは削除してください)
const TodoList = ({displayName, todos, isOwnTodos, onTodoClick}) => { // #1 // 中略 return ( <div> {displayName && <div>{displayName} さんのタスク一覧</div>} <ul> {Object.keys(todos).map( (key) => ( <Todo key={key} {...todos[key]} onClick={isOwnTodos ? (() => onTodoClick(key)) : (() => {})} /> {/* #2 */} ) )} </ul> </div> ) } Todo.propTypes = { // 中略 isOwnTodos: PropTypes.bool.isRequired, // #3 // 後略 }
isOwnTodos
をpropsから受け取ります(#1)。isOwnTodos
がtrueの時のみ、onTodoClick
が実行されるように変更します(#2)。コードが読みにくいですが、3項演算子を使用して、isOwnTodos
がtrueの時() => onTodoClick(key)
を返し、falseの時() => {}
を返します。isOwnTodos
のPropTypeを追加します(#3)。
おまけ: 自身のタスクの時、ユーザ名を"あなた"に修正する
ログインしたユーザ自身のタスク一覧が表示されている場合は、”〇〇 さんのタスク一覧”でなく、”あなたのタスク一覧”と表示するよう、ついでに変更します。
src/component/TodoList.js
const TodoList = ({displayName, todos, isOwnTodos, onTodoClick}) => { // 中略 const name = isOwnTodos ? 'あなた' : `${displayName} さん`; return ( <div> {displayName && <div>{name}のタスク一覧</div>} {/* 変更 */} <ul> // 中略 </ul> </div> ) }
動作確認
動作確認をします。
ログインしたユーザ以外のタスク一覧を表示します。
タスク追加フォームが表示されていません。タスクをクリックしてみても、何も起こらず、コンソールにもエラーが表示されません。
ログインしたユーザのタスク一覧を表示します。 タスク追加フォームが表示されています。
タスクが追加できます。
タスク完了フラグの切り替えを行います。
タスク完了フラグの切り替えも正常に行えます。
以上でログインしたユーザ自身のタスク以外は変更できないように修正できました。
★次回の記事
★目次