index.tsx 3.0 KB

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