navbar.templ
3369 bytes
1package pages
2
3import "fmt"
4
5type NavButton struct {
6 link string
7 text string
8 icon string
9}
10
11func navButtons(route string) []*NavButton {
12 newVideos := &NavButton{"/", "New Videos", "collection-play"}
13 watched := &NavButton{"/watched", "Watched", "check-circle"}
14 channels := &NavButton{"/channels", "Channels", "people"}
15 switch route {
16 case "channels":
17 return []*NavButton{newVideos, watched}
18 case "new":
19 return []*NavButton{channels, watched}
20 case "watched":
21 return []*NavButton{channels, newVideos}
22 default:
23 return []*NavButton{channels, newVideos, watched}
24 }
25}
26
27templ navbar(route string) {
28 <nav class="navbar navbar-expand-lg bg-body-tertiary">
29 <div class="container-fluid">
30 <a class="navbar-brand" href="/">
31 <img src="/assets/ytrssil.svg" alt="ytrssil" width="32" height="32"/>
32 </a>
33 if route != "auth" {
34 <ul id="nav-buttons" class="navbar-nav me-auto mb-0 flex-row">
35 <li class="nav-item me-1 me-lg-2 d-lg-none">
36 <button
37 type="button"
38 class="btn btn-primary"
39 onClick="window.location.reload();"
40 ><i class="bi bi-arrow-clockwise"></i></button>
41 </li>
42 <li class="nav-item me-1 me-lg-2">
43 <button
44 type="button"
45 class="btn btn-outline-secondary"
46 style="--bs-btn-color: var(--bs-body-color);"
47 data-bs-toggle="modal"
48 data-bs-target="#add-video-modal"
49 >
50 <span class="d-none d-lg-inline">Add Video </span><i class="bi bi-camera-video"></i>
51 </button>
52 </li>
53 <li class="nav-item me-1 me-lg-2">
54 <button
55 type="button"
56 class="btn btn-outline-secondary"
57 style="--bs-btn-color: var(--bs-body-color);"
58 data-on:click="@post('/fetch')"
59 >
60 <span class="d-none d-lg-inline">Fetch </span><i class="bi bi-cloud-download"></i>
61 </button>
62 </li>
63 <li class="nav-item me-1 me-lg-2">
64 <button
65 type="button"
66 class="btn btn-outline-secondary"
67 style="--bs-btn-color: var(--bs-body-color);"
68 data-bs-toggle="modal"
69 data-bs-target="#subscription-modal"
70 >
71 <span class="d-none d-lg-inline">Subscribe </span><i class="bi bi-bookmark-plus"></i>
72 </button>
73 </li>
74 for _, button := range navButtons(route) {
75 <li class="nav-item me-1 me-lg-2">
76 <a href={ button.link } class="btn btn-outline-secondary" style="--bs-btn-color: var(--bs-body-color);">
77 <span class="d-none d-lg-inline">{ button.text }</span> <i class={ fmt.Sprintf("bi bi-%s", button.icon) }></i>
78 </a>
79 </li>
80 }
81 </ul>
82 <div class="d-flex" role="search">
83 <input id="video-search" class="form-control me-2 d-lg-block d-none" type="search" placeholder="Search videos..."/>
84 <button
85 type="button"
86 class="btn btn-outline-secondary d-lg-none"
87 style="--bs-btn-color: var(--bs-body-color);"
88 onclick="
89 const buttons = document.getElementById('nav-buttons');
90 const search = document.getElementById('video-search');
91 if (search.classList.contains('d-none')) {
92 buttons.classList.add('d-none');
93 search.classList.remove('d-none');
94 search.focus();
95 } else {
96 buttons.classList.remove('d-none');
97 search.classList.add('d-none');
98 }
99 "
100 >
101 <i class="bi bi-search"></i>
102 </button>
103 </div>
104 }
105 </div>
106 </nav>
107}