index.tsx 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import {
  2. useUsersQuery,
  3. useUserDeleteMutation,
  4. UsersDocument,
  5. Permission,
  6. useUpdatePermissionsMutation,
  7. UsersQuery,
  8. } from '../../../src/gql'
  9. import { FunctionComponent } from 'react'
  10. import { TUser } from '../../../src/user/types'
  11. import { AdminList } from '../../../src/app'
  12. import theme from '../../../src/styles/theme'
  13. import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
  14. import { faDumbbell, faUserNinja } from '@fortawesome/free-solid-svg-icons'
  15. const AdminUser: FunctionComponent<{ item: TUser; className?: string }> = ({ item, className }) => {
  16. const [updatePermission, updateDate] = useUpdatePermissionsMutation({
  17. refetchQueries: [{ query: UsersDocument }],
  18. })
  19. const isAdmin = item.permissions?.includes(Permission.Admin)
  20. const isInstructor = item.permissions?.includes(Permission.Instructor)
  21. const { permissions = [] } = item
  22. return (
  23. <div className={className}>
  24. <div className='admin-training-title'>{item.name}</div>
  25. <div className='admin-training-email'>{item.email}</div>
  26. <div className='admin-training-permissions'>
  27. <button
  28. onClick={(event) => {
  29. const newPermissions = isInstructor
  30. ? permissions.filter((permission) => Permission.Instructor !== permission)
  31. : [...permissions, Permission.Instructor]
  32. updatePermission({ variables: { id: item.id, permissions: newPermissions } })
  33. }}
  34. title='Instructor'
  35. className={isInstructor ? 'true' : 'false'}
  36. >
  37. <FontAwesomeIcon icon={faDumbbell} height={16} />
  38. </button>
  39. <button
  40. onClick={(event) => {
  41. const newPermissions = isAdmin
  42. ? permissions.filter((permission) => Permission.Admin !== permission)
  43. : [...permissions, Permission.Admin]
  44. updatePermission({ variables: { id: item.id, permissions: newPermissions } })
  45. }}
  46. title='Admin'
  47. className={isAdmin ? 'true' : 'false'}
  48. >
  49. <FontAwesomeIcon icon={faUserNinja} height={16} />
  50. </button>
  51. </div>
  52. <style jsx>{`
  53. .${className} {
  54. display: flex;
  55. }
  56. .admin-training-title {
  57. width: 15%;
  58. }
  59. .admin-training-email {
  60. width: 65%;
  61. }
  62. .admin-training-permissions {
  63. width: 20%;
  64. text-align: left;
  65. }
  66. button {
  67. display: inline;
  68. margin: 0 0.4em;
  69. padding: 0;
  70. color: ${theme.colors.buttonBackground};
  71. background-color: transparent;
  72. }
  73. button.false {
  74. color: #5557;
  75. }
  76. `}</style>
  77. </div>
  78. )
  79. }
  80. const AdminUsers = () => {
  81. const props = {
  82. name: 'Users',
  83. adminMenu: '/admin/user',
  84. get: useUsersQuery,
  85. remove: useUserDeleteMutation,
  86. dataKey: 'users' as keyof UsersQuery,
  87. Component: AdminUser,
  88. }
  89. return <AdminList {...props} />
  90. }
  91. export default AdminUsers