diff --git a/app/Http/View/Composers/FootComposer.php b/app/Http/View/Composers/FootComposer.php index ac628a5a..45735cf4 100644 --- a/app/Http/View/Composers/FootComposer.php +++ b/app/Http/View/Composers/FootComposer.php @@ -62,7 +62,7 @@ class FootComposer 'async' => true, 'defer' => true, ]; - } else { + } elseif (!$this->request->is('/')) { $scripts[] = [ 'src' => 'https://cdn.jsdelivr.net/npm/react@16.13.1/umd/react.production.min.js', 'integrity' => 'sha256-yUhvEmYVhZ/GGshIQKArLvySDSh6cdmdcIx0spR3UP4=', @@ -79,9 +79,15 @@ class FootComposer 'integrity' => 'sha256-lEpMZPtZ0RgHYZFOcJeX94WMegvHJ+beF5V7XtCcWxY=', 'crossorigin' => 'anonymous', ]; - $scripts[] = [ - 'src' => $this->webpack->url('app.js'), - ]; + if ($this->request->is('/')) { + $scripts[] = [ + 'src' => $this->webpack->url('home.js'), + ]; + } else { + $scripts[] = [ + 'src' => $this->webpack->url('app.js'), + ]; + } $view->with([ 'scripts' => $scripts, diff --git a/resources/assets/src/scripts/home-page.ts b/resources/assets/src/scripts/home-page.ts index 0e4d1dea..f860decc 100644 --- a/resources/assets/src/scripts/home-page.ts +++ b/resources/assets/src/scripts/home-page.ts @@ -1,4 +1,6 @@ -function handler() { +import '@/styles/home.css' + +export function scrollHander() { const header = document.querySelector('.navbar') /* istanbul ignore else */ if (header) { @@ -12,9 +14,24 @@ function handler() { } } -/* istanbul ignore next */ -if (blessing.extra.transparent_navbar) { - window.addEventListener('load', handler) +export async function logout() { + await fetch(`${blessing.base_url}/auth/logout`, { + method: 'POST', + credentials: 'same-origin', + headers: { + 'X-CSRF-TOKEN': document.querySelector( + 'meta[name="csrf-token"]', + )!.content, + }, + }) + window.location.href = blessing.base_url } -export default handler +/* istanbul ignore next */ +if (blessing.extra.transparent_navbar) { + window.addEventListener('load', scrollHander) +} +/* istanbul ignore next */ +document + .querySelector('#btn-logout') + ?.addEventListener('click', logout) diff --git a/resources/assets/src/scripts/route.tsx b/resources/assets/src/scripts/route.tsx index 0aa927b6..395f2953 100644 --- a/resources/assets/src/scripts/route.tsx +++ b/resources/assets/src/scripts/route.tsx @@ -1,10 +1,6 @@ import React from 'react' export default [ - { - path: '/', - module: [() => import('./home-page')], - }, { path: 'user', react: () => import('../views/user/Dashboard'), diff --git a/resources/assets/tests/scripts/home-page.test.ts b/resources/assets/tests/scripts/home-page.test.ts index 208813a2..185cfbb9 100644 --- a/resources/assets/tests/scripts/home-page.test.ts +++ b/resources/assets/tests/scripts/home-page.test.ts @@ -1,25 +1,47 @@ -import handler from '@/scripts/home-page' +import { scrollHander, logout } from '@/scripts/home-page' -window.blessing.extra = { - transparent_navbar: false, -} +test('logout', async () => { + const meta = document.createElement('meta') + meta.name = 'csrf-token' + meta.content = 'token' + document.head.appendChild(meta) -test('should be transparent at top', () => { - Object.assign(window, { innerHeight: 900 }) - document.body.innerHTML = '' - handler() - window.dispatchEvent(new Event('scroll')) - expect( - document.querySelector('nav')!.classList.contains('transparent'), - ).toBeTrue() + window.fetch = jest.fn() + + await logout() + expect(window.fetch).toBeCalledWith('/auth/logout', { + method: 'POST', + credentials: 'same-origin', + headers: { + 'X-CSRF-TOKEN': 'token', + }, + }) }) -test('should not be transparent at bottom', () => { - Object.assign(window, { innerHeight: 900, scrollY: 800 }) - document.body.innerHTML = '' - handler() - window.dispatchEvent(new Event('scroll')) - expect( - document.querySelector('nav')!.classList.contains('transparent'), - ).toBeFalse() +describe('scroll handler', () => { + beforeAll(() => { + window.blessing.extra = { + transparent_navbar: false, + } + }) + + it('should be transparent at top', () => { + Object.assign(window, { innerHeight: 900 }) + document.body.innerHTML = '' + scrollHander() + window.dispatchEvent(new Event('scroll')) + expect( + document.querySelector('nav')!.classList.contains('transparent'), + ).toBeTrue() + }) + + it('should not be transparent at bottom', () => { + Object.assign(window, { innerHeight: 900, scrollY: 800 }) + document.body.innerHTML = '' + scrollHander() + window.dispatchEvent(new Event('scroll')) + expect( + document.querySelector('nav')!.classList.contains('transparent'), + ).toBeFalse() + }) }) diff --git a/resources/views/home.twig b/resources/views/home.twig index dc786ce5..60f0b8d7 100644 --- a/resources/views/home.twig +++ b/resources/views/home.twig @@ -132,6 +132,26 @@ {% endif %} + + {% if home_page_css_loader %} {% endif %} diff --git a/resources/views/shared/user-menu.twig b/resources/views/shared/user-menu.twig index 6956ff7d..58cc959e 100644 --- a/resources/views/shared/user-menu.twig +++ b/resources/views/shared/user-menu.twig @@ -31,7 +31,7 @@ {% endif %} {% endif %} - + {{ trans('general.logout') }} diff --git a/webpack.config.js b/webpack.config.js index 243c1f22..3605278c 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -13,7 +13,7 @@ const config = { app: ['react-hot-loader/patch', '@/index.tsx'], sw: '@/scripts/sw.ts', style: ['@/styles/common.css'], - home: '@/styles/home.css', + home: '@/scripts/home-page.ts', spectre: [ 'spectre.css/dist/spectre.min.css', '@/fonts/minecraft.css',