From: Daniel Karbach Date: Sun, 20 Mar 2022 15:25:20 +0000 (+0100) Subject: show tournament participation in profile X-Git-Url: https://git.localhorst.tv/?a=commitdiff_plain;ds=sidebyside;h=beccf752aafd468c3753c6d48ae30bccd946c3b9;p=alttp.git show tournament participation in profile --- diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index c0ab73d..8c451fc 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -41,6 +41,8 @@ class UserController extends Controller public function single(Request $request, $id) { $user = User::findOrFail($id); $this->authorize('view', $user); + $user->load('participation'); + $user->load('participation.tournament'); return $user->toJson(); } diff --git a/app/Models/User.php b/app/Models/User.php index 7f03b4a..535af2e 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -21,6 +21,10 @@ class User extends Authenticatable return false; } + public function participation() { + return $this->hasMany(Participant::class); + } + /** * The attributes that are mass assignable. * diff --git a/resources/js/components/users/Participation.js b/resources/js/components/users/Participation.js new file mode 100644 index 0000000..e45fcf6 --- /dev/null +++ b/resources/js/components/users/Participation.js @@ -0,0 +1,37 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import { Alert, Button } from 'react-bootstrap'; +import { withTranslation } from 'react-i18next'; +import { useNavigate } from 'react-router-dom'; + +import i18n from '../../i18n'; + +const Participation = ({ user }) => { + const navigate = useNavigate(); + + if (!user || !user.participation || !user.participation.length) { + return + {i18n.t('users.participationEmpty')} + ; + } + return
+ {user.participation.map(p =>
+ +
)} +
; +}; + +Participation.propTypes = { + user: PropTypes.shape({ + participation: PropTypes.arrayOf(PropTypes.shape({ + id: PropTypes.number, + })), + }), +}; + +export default withTranslation()(Participation); diff --git a/resources/js/components/users/Profile.js b/resources/js/components/users/Profile.js index f38ba2f..10c70db 100644 --- a/resources/js/components/users/Profile.js +++ b/resources/js/components/users/Profile.js @@ -5,6 +5,7 @@ import { withTranslation } from 'react-i18next'; import Box from './Box'; import EditStreamLinkButton from './EditStreamLinkButton'; +import Participation from './Participation'; import Icon from '../common/Icon'; import i18n from '../../i18n'; @@ -35,11 +36,17 @@ const Profile = ({ user }) =>

+ +

{i18n.t('users.tournaments')}

+ +
; Profile.propTypes = { user: PropTypes.shape({ + participation: PropTypes.arrayOf(PropTypes.shape({ + })), stream_link: PropTypes.string, username: PropTypes.string, }), diff --git a/resources/js/i18n/de.js b/resources/js/i18n/de.js index 6feeb64..ee1f9c3 100644 --- a/resources/js/i18n/de.js +++ b/resources/js/i18n/de.js @@ -146,10 +146,12 @@ export default { discordTag: 'Discord Tag', editStreamLink: 'Stream Link bearbeiten', noStream: 'Kein Stream gesetzt', + participationEmpty: 'Hat noch an keinen Turnieren teilgenommen.', setStreamLinkError: 'Konnte Stream Link nicht speichern', setStreamLinkSuccess: 'Stream Link gespeichert', stream: 'Stream', streamLink: 'Stream Link', + tournaments: 'Turniere', }, validation: { error: { diff --git a/resources/js/i18n/en.js b/resources/js/i18n/en.js index 3f01805..bd7fb37 100644 --- a/resources/js/i18n/en.js +++ b/resources/js/i18n/en.js @@ -146,10 +146,12 @@ export default { discordTag: 'Discord tag', editStreamLink: 'Edit stream link', noStream: 'No stream set', + participationEmpty: 'Has not participated in any tourneys yet.', setStreamLinkError: 'Could not save stream link', setStreamLinkSuccess: 'Stream link saved', stream: 'Stream', streamLink: 'Stream link', + tournaments: 'Tournaments', }, validation: { error: {