From 130d16a2f06edda43de16ea4d5f2de39a28f30ba Mon Sep 17 00:00:00 2001 From: Pig Fang Date: Sun, 9 Sep 2018 09:28:05 +0800 Subject: [PATCH] Reduce global variables pollution --- .eslintrc.yml | 1 - .../src/components/admin/Customization.vue | 2 +- .../assets/src/components/auth/Login.vue | 2 +- .../assets/src/components/auth/Register.vue | 2 +- .../assets/src/components/skinlib/Show.vue | 10 +++--- .../assets/src/components/skinlib/Upload.vue | 8 ++--- .../src/components/user/EmailVerification.vue | 2 +- .../assets/src/components/user/Players.vue | 4 +-- .../assets/src/components/user/Profile.vue | 2 +- resources/assets/src/js/event.js | 4 +-- resources/assets/src/js/i18n.js | 4 +-- resources/assets/src/js/net.js | 2 +- resources/assets/src/js/notify.js | 2 +- resources/assets/src/shims.d.ts | 31 +++++++++++++------ .../components/admin/Customization.test.js | 2 +- .../tests/components/auth/Login.test.js | 6 ++-- .../tests/components/auth/Register.test.js | 8 ++--- .../tests/components/skinlib/Show.test.js | 20 ++++++------ .../tests/components/skinlib/Upload.test.js | 2 +- .../tests/components/user/Closet.test.js | 2 +- .../tests/components/user/Dashboard.test.js | 2 +- .../components/user/EmailVerification.test.js | 4 +-- .../tests/components/user/Players.test.js | 2 +- .../tests/components/user/Profile.test.js | 8 ++--- resources/assets/tests/js/i18n.test.js | 2 +- resources/lang/en/front-end.js | 2 +- resources/lang/zh_CN/front-end.js | 2 +- resources/views/admin/customize.blade.php | 4 ++- resources/views/auth/login.blade.php | 6 ++-- resources/views/auth/register.blade.php | 10 +++--- resources/views/skinlib/show.blade.php | 18 +++++------ resources/views/skinlib/upload.blade.php | 2 +- resources/views/user/closet.blade.php | 7 ++--- resources/views/user/index.blade.php | 7 ++--- resources/views/user/player.blade.php | 2 +- resources/views/user/profile.blade.php | 6 ++-- 36 files changed, 101 insertions(+), 99 deletions(-) diff --git a/.eslintrc.yml b/.eslintrc.yml index c91f27e4..5cfdbc8e 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -78,4 +78,3 @@ rules: globals: blessing: false - __bs_data__: false diff --git a/resources/assets/src/components/admin/Customization.vue b/resources/assets/src/components/admin/Customization.vue index 0365e6c7..8a3c5320 100644 --- a/resources/assets/src/components/admin/Customization.vue +++ b/resources/assets/src/components/admin/Customization.vue @@ -44,7 +44,7 @@ export default { 'red', 'black', ], - currentSkin: window.currentSkin + currentSkin: blessing.extra.currentSkin }; }, methods: { diff --git a/resources/assets/src/components/auth/Login.vue b/resources/assets/src/components/auth/Login.vue index 32297eca..607027d9 100644 --- a/resources/assets/src/components/auth/Login.vue +++ b/resources/assets/src/components/auth/Login.vue @@ -94,7 +94,7 @@ export default { captcha: '', remember: false, time: Date.now(), - tooManyFails: __bs_data__.tooManyFails, + tooManyFails: blessing.extra.tooManyFails, infoMsg: '', warningMsg: '', pending: false, diff --git a/resources/assets/src/components/auth/Register.vue b/resources/assets/src/components/auth/Register.vue index 75a7e2c8..ba2760e5 100644 --- a/resources/assets/src/components/auth/Register.vue +++ b/resources/assets/src/components/auth/Register.vue @@ -131,7 +131,7 @@ export default { infoMsg: '', warningMsg: '', pending: false, - requirePlayer: __bs_data__.player + requirePlayer: blessing.extra.player }), methods: { async submit() { diff --git a/resources/assets/src/components/skinlib/Show.vue b/resources/assets/src/components/skinlib/Show.vue index d51acb3a..16dc5826 100644 --- a/resources/assets/src/components/skinlib/Show.vue +++ b/resources/assets/src/components/skinlib/Show.vue @@ -159,11 +159,11 @@ export default { size: 0, uploadAt: '', public: true, - liked: __bs_data__.inCloset, - canBeDownloaded: __bs_data__.download, - currentUid: __bs_data__.currentUid, - admin: __bs_data__.admin, - uploaderNickName: __bs_data__.nickname, + liked: blessing.extra.inCloset, + canBeDownloaded: blessing.extra.download, + currentUid: blessing.extra.currentUid, + admin: blessing.extra.admin, + uploaderNickName: blessing.extra.nickname, }; }, computed: { diff --git a/resources/assets/src/components/skinlib/Upload.vue b/resources/assets/src/components/skinlib/Upload.vue index f658a5c7..505b5bd4 100644 --- a/resources/assets/src/components/skinlib/Upload.vue +++ b/resources/assets/src/components/skinlib/Upload.vue @@ -129,10 +129,10 @@ export default { files: [], texture: '', uploading: false, - textureNameRule: __bs_data__.rule, - privacyNotice: __bs_data__.privacyNotice, - scorePublic: __bs_data__.scorePublic, - scorePrivate: __bs_data__.scorePrivate, + textureNameRule: blessing.extra.rule, + privacyNotice: blessing.extra.privacyNotice, + scorePublic: blessing.extra.scorePublic, + scorePrivate: blessing.extra.scorePrivate, }; }, computed: { diff --git a/resources/assets/src/components/user/EmailVerification.vue b/resources/assets/src/components/user/EmailVerification.vue index 3e33a5fa..5254d6f0 100644 --- a/resources/assets/src/components/user/EmailVerification.vue +++ b/resources/assets/src/components/user/EmailVerification.vue @@ -20,7 +20,7 @@ export default { name: 'EmailVerification', data() { return { - verified: !__bs_data__.unverified, + verified: !blessing.extra.unverified, pending: false, }; }, diff --git a/resources/assets/src/components/user/Players.vue b/resources/assets/src/components/user/Players.vue index 6139fbe2..912b66ea 100644 --- a/resources/assets/src/components/user/Players.vue +++ b/resources/assets/src/components/user/Players.vue @@ -279,8 +279,8 @@ export default { alex: false, cape: false }, - playerNameRule: __bs_data__.rule, - playerNameLength: __bs_data__.length + playerNameRule: blessing.extra.rule, + playerNameLength: blessing.extra.length }; }, beforeMount() { diff --git a/resources/assets/src/components/user/Profile.vue b/resources/assets/src/components/user/Profile.vue index 54d76669..f795fcb5 100644 --- a/resources/assets/src/components/user/Profile.vue +++ b/resources/assets/src/components/user/Profile.vue @@ -211,7 +211,7 @@ export default { currentPassword: '', deleteConfirm: '', siteName: blessing.site_name, - isAdmin: __bs_data__.admin + isAdmin: blessing.extra.admin }), methods: { nl2br: str => str.replace(/\n/g, '
'), diff --git a/resources/assets/src/js/event.js b/resources/assets/src/js/event.js index cd81a27a..19775a8c 100644 --- a/resources/assets/src/js/event.js +++ b/resources/assets/src/js/event.js @@ -17,6 +17,4 @@ export function emit(eventName, payload) { bus[eventName] && bus[eventName].forEach(listener => listener(payload)); } -Object.defineProperty(window, 'bsEmitter', { - get: () => Object.freeze({ on, emit }) -}); +blessing.event = { on, emit }; diff --git a/resources/assets/src/js/i18n.js b/resources/assets/src/js/i18n.js index 6b5978b3..189a571f 100644 --- a/resources/assets/src/js/i18n.js +++ b/resources/assets/src/js/i18n.js @@ -7,9 +7,9 @@ import Vue from 'vue'; * @param {object} parameters * @return {string} */ -export function trans(key, parameters = {}) { +export function trans(key, parameters = Object.create(null)) { const segments = key.split('.'); - let temp = window.__bs_i18n__ || {}; + let temp = blessing.i18n || Object.create(null); for (const segment of segments) { if (!temp[segment]) { diff --git a/resources/assets/src/js/net.js b/resources/assets/src/js/net.js index 2512c25c..4780434f 100644 --- a/resources/assets/src/js/net.js +++ b/resources/assets/src/js/net.js @@ -69,4 +69,4 @@ Vue.use(_Vue => { }; }); -window.bsAjax = { get, post }; +blessing.fetch = { get, post }; diff --git a/resources/assets/src/js/notify.js b/resources/assets/src/js/notify.js index ef0a7057..227556b0 100644 --- a/resources/assets/src/js/notify.js +++ b/resources/assets/src/js/notify.js @@ -79,5 +79,5 @@ export const swal = sweetalert2.mixin({ }); window.toastr = toastr; -window.showModal = showModal; window.swal = swal; +blessing.notify = { showMsg, showModal }; diff --git a/resources/assets/src/shims.d.ts b/resources/assets/src/shims.d.ts index d08cbe6c..563595f4 100644 --- a/resources/assets/src/shims.d.ts +++ b/resources/assets/src/shims.d.ts @@ -11,17 +11,28 @@ declare global { timezone: string version: string route: string - } -} + extra: any + i18n: object -interface Window { - bsEmitter: { - on(eventName: string, listener: Function): void - emit(eventName: string, payload: object): void - }, - bsAjax: { - get(url: string, params?: object): Promise - post(url: string, data?: object): Promise + fetch: { + get(url: string, params?: object): Promise + post(url: string, data?: object): Promise + } + + event: { + on(eventName: string, listener: Function): void + emit(eventName: string, payload: object): void + } + + notify: { + showMsg(message: string, type?: string): void + showModal( + message: string, + title?: string, + type?: string, + options?: Partial<{ btnText: string, callback: string, destroyOnClose: boolean }> + ) + } } } diff --git a/resources/assets/tests/components/admin/Customization.test.js b/resources/assets/tests/components/admin/Customization.test.js index 4fa3f787..352e2005 100644 --- a/resources/assets/tests/components/admin/Customization.test.js +++ b/resources/assets/tests/components/admin/Customization.test.js @@ -2,7 +2,7 @@ import Vue from 'vue'; import { mount } from '@vue/test-utils'; import Customization from '@/components/admin/Customization'; -window.currentSkin = 'skin-blue'; +window.blessing.extra = { currentSkin: 'skin-blue' }; test('preview color', () => { document.body.classList.add('skin-blue'); diff --git a/resources/assets/tests/components/auth/Login.test.js b/resources/assets/tests/components/auth/Login.test.js index 1b0950c7..51e1298d 100644 --- a/resources/assets/tests/components/auth/Login.test.js +++ b/resources/assets/tests/components/auth/Login.test.js @@ -6,13 +6,13 @@ import { swal } from '@/js/notify'; jest.mock('@/js/notify'); test('show captcha if too many login fails', () => { - window.__bs_data__ = { tooManyFails: true }; + window.blessing.extra = { tooManyFails: true }; const wrapper = mount(Login); expect(wrapper.find('img').attributes('src')).toMatch(/\/auth\/captcha\?v=\d+/); }); test('click to refresh captcha', () => { - window.__bs_data__ = { tooManyFails: true }; + window.blessing.extra = { tooManyFails: true }; jest.spyOn(Date, 'now'); const wrapper = mount(Login); wrapper.find('img').trigger('click'); @@ -20,7 +20,7 @@ test('click to refresh captcha', () => { }); test('login', async () => { - window.__bs_data__ = { tooManyFails: false }; + window.blessing.extra = { tooManyFails: false }; Vue.prototype.$http.post .mockResolvedValueOnce({ errno: 1, msg: 'fail' }) .mockResolvedValueOnce({ errno: 1, login_fails: 4 }) diff --git a/resources/assets/tests/components/auth/Register.test.js b/resources/assets/tests/components/auth/Register.test.js index ede5aee0..e710988a 100644 --- a/resources/assets/tests/components/auth/Register.test.js +++ b/resources/assets/tests/components/auth/Register.test.js @@ -5,7 +5,7 @@ import { swal } from '@/js/notify'; jest.mock('@/js/notify'); -window.__bs_data__ = { player: false }; +window.blessing.extra = { player: false }; test('click to refresh captcha', () => { jest.spyOn(Date, 'now'); @@ -15,12 +15,12 @@ test('click to refresh captcha', () => { }); test('require player name', () => { - window.__bs_data__ = { player: true }; + window.blessing.extra = { player: true }; const wrapper = mount(Register); expect(wrapper.findAll('[type="text"]').at(0).attributes('placeholder')).toBe('auth.player-name'); - window.__bs_data__ = { player: false }; + window.blessing.extra = { player: false }; }); test('register', async () => { @@ -94,7 +94,7 @@ test('register', async () => { }); test('register with player name', async () => { - window.__bs_data__ = { player: true }; + window.blessing.extra = { player: true }; Vue.prototype.$http.post.mockResolvedValue({ errno: 0, msg: 'ok' }); const wrapper = mount(Register); const button = wrapper.find('button'); diff --git a/resources/assets/tests/components/skinlib/Show.test.js b/resources/assets/tests/components/skinlib/Show.test.js index ed57e5b7..fab6c602 100644 --- a/resources/assets/tests/components/skinlib/Show.test.js +++ b/resources/assets/tests/components/skinlib/Show.test.js @@ -7,7 +7,7 @@ import toastr from 'toastr'; jest.mock('@/js/notify'); -window.__bs_data__ = { +window.blessing.extra = { download: true, currentUid: 0, admin: false, @@ -35,7 +35,7 @@ test('button for adding to closet should be disabled if not auth', () => { test('button for adding to closet should be disabled if auth', () => { Vue.prototype.$http.get.mockResolvedValue({}); - Object.assign(window.__bs_data__, { inCloset: true, currentUid: 1 }); + Object.assign(window.blessing.extra, { inCloset: true, currentUid: 1 }); const wrapper = mount(Show, { mocks: { $route: ['/skinlib/show/1', '1'] @@ -82,7 +82,7 @@ test('render basic information', async () => { }); test('render action text of editing texture name', async () => { - Object.assign(window.__bs_data__, { admin: true }); + Object.assign(window.blessing.extra, { admin: true }); Vue.prototype.$http.get.mockResolvedValue({ uploader: 1, name: 'name' }); let wrapper = mount(Show, { @@ -93,7 +93,7 @@ test('render action text of editing texture name', async () => { await wrapper.vm.$nextTick(); expect(wrapper.contains('small')).toBeTrue(); - Object.assign(window.__bs_data__, { currentUid: 2, admin: false }); + Object.assign(window.blessing.extra, { currentUid: 2, admin: false }); wrapper = mount(Show, { mocks: { $route: ['/skinlib/show/1', '1'] @@ -104,7 +104,7 @@ test('render action text of editing texture name', async () => { }); test('render nickname of uploader', () => { - Object.assign(window.__bs_data__, { nickname: null }); + Object.assign(window.blessing.extra, { nickname: null }); Vue.prototype.$http.get.mockResolvedValue({}); const wrapper = mount(Show, { mocks: { @@ -115,7 +115,7 @@ test('render nickname of uploader', () => { }); test('operation panel should not be rendered if not auth', () => { - Object.assign(window.__bs_data__, { currentUid: 0 }); + Object.assign(window.blessing.extra, { currentUid: 0 }); Vue.prototype.$http.get.mockResolvedValue({}); const wrapper = mount(Show, { mocks: { @@ -126,7 +126,7 @@ test('operation panel should not be rendered if not auth', () => { }); test('link to downloading texture', async () => { - Object.assign(window.__bs_data__, { download: false }); + Object.assign(window.blessing.extra, { download: false }); Vue.prototype.$http.get.mockResolvedValue({ hash: '123' }); const wrapper = mount(Show, { mocks: { @@ -139,7 +139,7 @@ test('link to downloading texture', async () => { }); test('add to closet', async () => { - Object.assign(window.__bs_data__, { currentUid: 1, inCloset: false }); + Object.assign(window.blessing.extra, { currentUid: 1, inCloset: false }); Vue.prototype.$http.get.mockResolvedValue({ name: 'wow', likes: 2 }); Vue.prototype.$http.post .mockResolvedValueOnce({ errno: 1, msg: '1' }) @@ -179,7 +179,7 @@ test('add to closet', async () => { }); test('remove from closet', async () => { - Object.assign(window.__bs_data__, { currentUid: 1, inCloset: true }); + Object.assign(window.blessing.extra, { currentUid: 1, inCloset: true }); Vue.prototype.$http.get.mockResolvedValue({ likes: 2 }); Vue.prototype.$http.post .mockResolvedValueOnce({ errno: 1, msg: '1' }) @@ -213,7 +213,7 @@ test('remove from closet', async () => { }); test('change texture name', async () => { - Object.assign(window.__bs_data__, { admin: true }); + Object.assign(window.blessing.extra, { admin: true }); Vue.prototype.$http.get.mockResolvedValue({ name: 'old-name' }); Vue.prototype.$http.post .mockResolvedValueOnce({ errno: 1, msg: '1' }) diff --git a/resources/assets/tests/components/skinlib/Upload.test.js b/resources/assets/tests/components/skinlib/Upload.test.js index 433479e8..b954ae0d 100644 --- a/resources/assets/tests/components/skinlib/Upload.test.js +++ b/resources/assets/tests/components/skinlib/Upload.test.js @@ -10,7 +10,7 @@ jest.mock('toastr'); jest.mock('@/js/notify'); jest.mock('@/js/net'); -window.__bs_data__ = { +window.blessing.extra = { textureNameRule: 'rule', privacyNotice: 'privacyNotice', scorePrivate: 10, diff --git a/resources/assets/tests/components/user/Closet.test.js b/resources/assets/tests/components/user/Closet.test.js index 58e6f055..72db3e80 100644 --- a/resources/assets/tests/components/user/Closet.test.js +++ b/resources/assets/tests/components/user/Closet.test.js @@ -8,7 +8,7 @@ import { swal } from '@/js/notify'; jest.mock('@/js/notify'); -window.__bs_data__ = { unverified: false }; +window.blessing.extra = { unverified: false }; test('fetch closet data before mount', () => { Vue.prototype.$http.get.mockResolvedValue({}); diff --git a/resources/assets/tests/components/user/Dashboard.test.js b/resources/assets/tests/components/user/Dashboard.test.js index 100ab611..5a59997f 100644 --- a/resources/assets/tests/components/user/Dashboard.test.js +++ b/resources/assets/tests/components/user/Dashboard.test.js @@ -6,7 +6,7 @@ import { swal } from '@/js/notify'; jest.mock('@/js/notify'); -window.__bs_data__ = { unverified: false }; +window.blessing.extra = { unverified: false }; function scoreInfo(data = {}) { return { diff --git a/resources/assets/tests/components/user/EmailVerification.test.js b/resources/assets/tests/components/user/EmailVerification.test.js index e57f3fa8..e91e8d4a 100644 --- a/resources/assets/tests/components/user/EmailVerification.test.js +++ b/resources/assets/tests/components/user/EmailVerification.test.js @@ -6,13 +6,13 @@ import { swal } from '@/js/notify'; jest.mock('@/js/notify'); test('message box should not be render if verified', () => { - window.__bs_data__ = { unverified: false }; + window.blessing.extra = { unverified: false }; const wrapper = mount(EmailVerification); expect(wrapper.isEmpty()).toBeTrue(); }); test('resend email', async () => { - window.__bs_data__ = { unverified: true }; + window.blessing.extra = { unverified: true }; Vue.prototype.$http.post .mockResolvedValueOnce({ errno: 1, msg: '1' }) .mockResolvedValueOnce({ errno: 0, msg: '0' }); diff --git a/resources/assets/tests/components/user/Players.test.js b/resources/assets/tests/components/user/Players.test.js index fd474944..4586c8b8 100644 --- a/resources/assets/tests/components/user/Players.test.js +++ b/resources/assets/tests/components/user/Players.test.js @@ -7,7 +7,7 @@ import { swal } from '@/js/notify'; jest.mock('toastr'); jest.mock('@/js/notify'); -window.__bs_data__ = { +window.blessing.extra = { rule: 'rule', length: 'length' }; diff --git a/resources/assets/tests/components/user/Profile.test.js b/resources/assets/tests/components/user/Profile.test.js index b5b1e793..6bda7ff0 100644 --- a/resources/assets/tests/components/user/Profile.test.js +++ b/resources/assets/tests/components/user/Profile.test.js @@ -7,14 +7,14 @@ import { swal } from '@/js/notify'; jest.mock('@/js/notify'); -window.__bs_data__ = { unverified: false }; +window.blessing.extra = { unverified: false }; test('computed values', () => { - window.__bs_data__ = { admin: true }; + window.blessing.extra = { admin: true }; const wrapper = mount(Profile); expect(wrapper.vm.siteName).toBe('Blessing Skin'); expect(wrapper.vm.isAdmin).toBeTrue(); - window.__bs_data__ = { admin: false }; + window.blessing.extra = { admin: false }; expect(mount(Profile).vm.isAdmin).toBeFalse(); }); @@ -152,7 +152,7 @@ test('change email', async () => { }); test('delete account', async () => { - window.__bs_data__ = { admin: true }; + window.blessing.extra = { admin: true }; swal.mockResolvedValue(); Vue.prototype.$http.post .mockResolvedValueOnce({ errno: 1, msg: 'w' }) diff --git a/resources/assets/tests/js/i18n.test.js b/resources/assets/tests/js/i18n.test.js index 10f464bb..3c986063 100644 --- a/resources/assets/tests/js/i18n.test.js +++ b/resources/assets/tests/js/i18n.test.js @@ -6,7 +6,7 @@ test('mount to global', () => { }); test('translate text', () => { - window.__bs_i18n__ = { a: { b: { c: 'text', d: 'Hi, :name!' } } }; + window.blessing.i18n = { a: { b: { c: 'text', d: 'Hi, :name!' } } }; expect(trans('a.b.c')).toBe('text'); expect(trans('a.b.d')).toBe('Hi, :name!'); expect(trans('a.b.d', { name: 'me' })).toBe('Hi, me!'); diff --git a/resources/lang/en/front-end.js b/resources/lang/en/front-end.js index 62fb6ea6..79a3650a 100644 --- a/resources/lang/en/front-end.js +++ b/resources/lang/en/front-end.js @@ -1,3 +1,3 @@ import lang from './front-end.yml'; -window.__bs_i18n__ = Object.assign(window.__bs_i18n__ || {}, lang); +blessing.i18n = Object.assign(blessing.i18n || Object.create(null), lang); diff --git a/resources/lang/zh_CN/front-end.js b/resources/lang/zh_CN/front-end.js index 62fb6ea6..79a3650a 100644 --- a/resources/lang/zh_CN/front-end.js +++ b/resources/lang/zh_CN/front-end.js @@ -1,3 +1,3 @@ import lang from './front-end.yml'; -window.__bs_i18n__ = Object.assign(window.__bs_i18n__ || {}, lang); +blessing.i18n = Object.assign(blessing.i18n || Object.create(null), lang); diff --git a/resources/views/admin/customize.blade.php b/resources/views/admin/customize.blade.php index 6fa18572..42a1c7d6 100644 --- a/resources/views/admin/customize.blade.php +++ b/resources/views/admin/customize.blade.php @@ -37,7 +37,9 @@ @endsection diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index 950a9002..eb989679 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -25,11 +25,9 @@ diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php index a5ab95eb..205805b3 100644 --- a/resources/views/auth/register.blade.php +++ b/resources/views/auth/register.blade.php @@ -19,12 +19,10 @@ diff --git a/resources/views/skinlib/show.blade.php b/resources/views/skinlib/show.blade.php index f9f58d8f..18b167b7 100644 --- a/resources/views/skinlib/show.blade.php +++ b/resources/views/skinlib/show.blade.php @@ -41,17 +41,15 @@ diff --git a/resources/views/skinlib/upload.blade.php b/resources/views/skinlib/upload.blade.php index be764bf8..143bfb76 100644 --- a/resources/views/skinlib/upload.blade.php +++ b/resources/views/skinlib/upload.blade.php @@ -19,7 +19,7 @@ @endsection diff --git a/resources/views/user/index.blade.php b/resources/views/user/index.blade.php index 6a925658..34e8628d 100644 --- a/resources/views/user/index.blade.php +++ b/resources/views/user/index.blade.php @@ -74,11 +74,10 @@ @endsection diff --git a/resources/views/user/player.blade.php b/resources/views/user/player.blade.php index 57eaf9cb..3ad68a06 100644 --- a/resources/views/user/player.blade.php +++ b/resources/views/user/player.blade.php @@ -18,7 +18,7 @@ @endsection