app.blade.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <!doctype html>
  2. <html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <!-- CSRF Token -->
  7. <meta name="csrf-token" content="{{ csrf_token() }}">
  8. <title>{{ config('app.name', 'Laravel') }}</title>
  9. <!-- Fonts -->
  10. <link rel="dns-prefetch" href="//fonts.bunny.net">
  11. <link href="https://fonts.bunny.net/css?family=Nunito" rel="stylesheet">
  12. <!-- Scripts -->
  13. @vite(['resources/sass/app.scss', 'resources/js/app.js'])
  14. </head>
  15. <body>
  16. <div class="alerts">
  17. @if($message = session('success'))
  18. <div class="main-alert alert alert-success" role="alert">
  19. {{ $message }}
  20. </div>
  21. @endif
  22. @if($message = session('danger'))
  23. <div class="main-alert alert alert-danger" role="alert">
  24. {{ $message }}
  25. </div>
  26. @endif
  27. </div>
  28. <div id="app">
  29. <nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm">
  30. <div class="container">
  31. <a class="navbar-brand" href="{{ url('/') }}">
  32. {{ config('app.name', 'Laravel') }}
  33. </a>
  34. <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Открыть меню">
  35. <span class="navbar-toggler-icon"></span>
  36. </button>
  37. <div class="collapse navbar-collapse" id="navbarSupportedContent">
  38. <!-- Left Side Of Navbar -->
  39. <ul class="navbar-nav me-auto">
  40. @include('layouts.menu')
  41. </ul>
  42. <!-- Right Side Of Navbar -->
  43. <ul class="navbar-nav ms-auto">
  44. <!-- Authentication Links -->
  45. @guest
  46. @if (Route::has('login'))
  47. <li class="nav-item">
  48. <a class="nav-link" href="{{ route('login') }}">Вход</a>
  49. </li>
  50. @endif
  51. @if (Route::has('register'))
  52. <li class="nav-item">
  53. <a class="nav-link" href="{{ route('register') }}">Регистрация</a>
  54. </li>
  55. @endif
  56. @else
  57. <li class="nav-item dropdown">
  58. <a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  59. {{ Auth::user()->name }}
  60. </a>
  61. <div class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
  62. <a class="dropdown-item" href="{{ route('user.profile') }}">Профиль</a>
  63. <a class="dropdown-item" href="{{ route('logout') }}"
  64. onclick="event.preventDefault();
  65. document.getElementById('logout-form').submit();">
  66. Выход
  67. </a>
  68. <form id="logout-form" action="{{ route('logout') }}" method="POST" class="d-none">
  69. @csrf
  70. </form>
  71. </div>
  72. </li>
  73. @endguest
  74. </ul>
  75. </div>
  76. </div>
  77. </nav>
  78. <main class="py-4">
  79. <div class="container">
  80. @yield('content')
  81. </div>
  82. </main>
  83. </div>
  84. @stack('scripts')
  85. <script type="module">
  86. $(document).ready(function (){
  87. if($('.main-alert').length){
  88. setTimeout(function (){
  89. $('.main-alert').fadeTo(2000, 500).slideUp(500, function (){
  90. $(".main-alert").slideUp(500);
  91. })
  92. }, 3000);
  93. }
  94. let user = {{ auth()->user()?->id ?? 0}}; // zero is not logged in user
  95. if(user > 0) {
  96. let socket = new WebSocket('{{ config('app.addr') . ':' . config('app.ws_port') }}');
  97. socket.onopen = function() {
  98. console.log("[WS] Connected. Listen messages for user " + user);
  99. };
  100. socket.onmessage = function(event) {
  101. let received = JSON.parse(event.data);
  102. if(parseInt(received.data.user_id) === user) {
  103. console.log(received);
  104. console.log(`[WS] Received data action: ${received.data.action}. Message: ${received.data.message}`);
  105. alert(received.data.message);
  106. }
  107. };
  108. socket.onclose = function(event) {
  109. if (event.wasClean) {
  110. console.log(`[WS] Closed clear, code=${event.code} reason=${event.reason}`);
  111. } else {
  112. console.log('[WS] Connection lost', event);
  113. }
  114. };
  115. socket.onerror = function(error) {
  116. console.log(`[error] ${error}`);
  117. };
  118. }
  119. });
  120. </script>
  121. </body>
  122. </html>