Skip to content

Commit f4b0878

Browse files
Improve dark mode toggle: use hidden input for CSRF token and update UI dynamically
Co-authored-by: alexeygrigorev <875246+alexeygrigorev@users.noreply.github.com>
1 parent 6b54e52 commit f4b0878

1 file changed

Lines changed: 32 additions & 6 deletions

File tree

templates/base.html

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@
1818

1919
</head>
2020

21-
<body class="{% if DARK_MODE %}dark-mode{% endif %}">
22-
<div class="{% if DARK_MODE %}bg-dark border-dark{% else %}bg-light border-bottom{% endif %}">
21+
<body class="{% if DARK_MODE %}dark-mode{% endif %}" data-dark-mode="{% if DARK_MODE %}true{% else %}false{% endif %}">
22+
{% if user.is_authenticated %}
23+
<input type="hidden" id="csrf-token" value="{{ csrf_token }}">
24+
{% endif %}
25+
<div class="{% if DARK_MODE %}bg-dark border-dark{% else %}bg-light border-bottom{% endif %}" id="header-container">
2326
<header class="container">
2427
<nav class="d-flex justify-content-between align-items-center py-2">
2528
<div class="breadcrumbs">
@@ -37,7 +40,7 @@
3740
{% if user.is_authenticated %}
3841
<li class="mr-2">
3942
<button id="dark-mode-toggle" class="btn btn-sm {% if DARK_MODE %}btn-light{% else %}btn-dark{% endif %}" title="Toggle dark mode">
40-
<i class="fas {% if DARK_MODE %}fa-sun{% else %}fa-moon{% endif %}"></i>
43+
<i id="dark-mode-icon" class="fas {% if DARK_MODE %}fa-sun{% else %}fa-moon{% endif %}"></i>
4144
</button>
4245
</li>
4346
<li class="mr-2"><i class="fas fa-user"></i> {{ user.username }}</li>
@@ -52,7 +55,7 @@
5255
</div>
5356

5457
<div id="content" class="container">
55-
<div class="form-container mt-4 {% if DARK_MODE %}bg-dark{% else %}bg-light{% endif %} border rounded">
58+
<div class="form-container mt-4 {% if DARK_MODE %}bg-dark{% else %}bg-light{% endif %} border rounded" id="main-content">
5659
{% block content %}
5760
<!-- The specific content of each page will be inserted here -->
5861
{% endblock %}
@@ -71,14 +74,37 @@
7174
<script>
7275
$(document).ready(function() {
7376
$('#dark-mode-toggle').click(function() {
77+
var csrfToken = $('#csrf-token').val();
7478
$.ajax({
7579
url: '{% url "toggle_dark_mode" %}',
7680
type: 'POST',
7781
headers: {
78-
'X-CSRFToken': '{{ csrf_token }}'
82+
'X-CSRFToken': csrfToken
7983
},
8084
success: function(data) {
81-
location.reload();
85+
var isDarkMode = data.dark_mode;
86+
var $html = $('html');
87+
var $body = $('body');
88+
var $toggle = $('#dark-mode-toggle');
89+
var $icon = $('#dark-mode-icon');
90+
var $header = $('#header-container');
91+
var $content = $('#main-content');
92+
93+
if (isDarkMode) {
94+
$html.addClass('dark-mode');
95+
$body.addClass('dark-mode').attr('data-dark-mode', 'true');
96+
$toggle.removeClass('btn-dark').addClass('btn-light');
97+
$icon.removeClass('fa-moon').addClass('fa-sun');
98+
$header.removeClass('bg-light border-bottom').addClass('bg-dark border-dark');
99+
$content.removeClass('bg-light').addClass('bg-dark');
100+
} else {
101+
$html.removeClass('dark-mode');
102+
$body.removeClass('dark-mode').attr('data-dark-mode', 'false');
103+
$toggle.removeClass('btn-light').addClass('btn-dark');
104+
$icon.removeClass('fa-sun').addClass('fa-moon');
105+
$header.removeClass('bg-dark border-dark').addClass('bg-light border-bottom');
106+
$content.removeClass('bg-dark').addClass('bg-light');
107+
}
82108
},
83109
error: function(xhr, status, error) {
84110
console.error('Error toggling dark mode:', error);

0 commit comments

Comments
 (0)