-
Notifications
You must be signed in to change notification settings - Fork 0
/
Navbar.fs
122 lines (103 loc) · 2.73 KB
/
Navbar.fs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
namespace Mandadin.Components
open Bolero
open Fun.Blazor
open Mandadin
open Microsoft.AspNetCore.Components.Routing
open FSharp.Control.Reactive
module Navbar =
let private collapsibleInput =
[ input () {
id "collapsible1"
name "collapsible1"
type' "checkbox"
for' "collapsible1"
}
Html.label [ Html.attr.``for`` "collapsible1" ] [
for i in 1 .. 3 do
Html.div [ Html.attr.``class`` (sprintf "bar%i" i) ] []
] ]
let private navLinks (switchTheme: _ -> unit) (theme: IStore<Theme>) =
let themeText theme =
match theme with
| Theme.Light -> "Oscuro"
| Theme.Dark -> "Claro"
|> Html.textf "Tema %s"
[ li () {
childContent [
NavLink'() {
Match NavLinkMatch.All
href "/notes"
childContent "Notas"
}
]
}
li () {
childContent [
NavLink'() {
Match NavLinkMatch.All
href "/"
childContent "Listas"
}
]
}
li () {
class' "cursor pointer"
onclick switchTheme
childContent (html.watch (theme, themeText))
} ]
let private switchTheme
(hook: IComponentHook)
(themeService: IThemeService)
(theme: IStore<Theme>)
_
=
themeService.SwitchTheme(theme.Current.Inverse)
|> Observable.ofTask
|> Observable.subscribe (fun didChange ->
if didChange then
theme.Publish theme.Current.Inverse)
|> hook.AddDispose
let View () =
let _view (hook: IComponentHook, themeService: IThemeService) =
let theme = hook.UseStore Theme.Dark
hook.OnFirstAfterRender
|> Observable.map themeService.GetTheme
|> Observable.switchTask
|> Observable.subscribe theme.Publish
|> hook.AddDispose
nav () {
class' "split-nav mandadin-navbar"
childContent [
section () {
class' "collapsible"
childContent [
yield! collapsibleInput
div () {
class' "collapsible-body"
childContent [
ul () {
class' "inline"
childContent (
navLinks (switchTheme hook themeService theme) theme
)
}
]
}
]
}
]
}
html.inject ("mandadin-nav", _view)
module TitleBar =
let View (appTitle: string) =
header () {
class' "border mandadin-title-bar"
childContent [
NavLink'() {
class' "no-drag"
Match NavLinkMatch.All
href "/"
childContent $"{appTitle} | Mandadin"
}
]
}