DarkModeSwitcher.php 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <?php
  2. namespace Dcat\Admin\Widgets;
  3. use Dcat\Admin\Admin;
  4. use Illuminate\Contracts\Support\Renderable;
  5. use Illuminate\Support\Str;
  6. class DarkModeSwitcher implements Renderable
  7. {
  8. public $defaultDarkMode = false;
  9. public function __construct(?bool $defaultDarkMode = null)
  10. {
  11. $this->defaultDarkMode = is_null($defaultDarkMode) ? Str::contains(config('admin.layout.body_class'), 'dark-mode') : $defaultDarkMode;
  12. }
  13. public function render()
  14. {
  15. $icon = $this->defaultDarkMode ? 'icon-sun' : 'icon-moon';
  16. $this->addScript();
  17. $this->addStyle();
  18. return <<<HTML
  19. <span class="dark-mode-switcher">
  20. <i class="feather {$icon}"></i>
  21. </span>
  22. HTML;
  23. }
  24. protected function addStyle()
  25. {
  26. Admin::style('.dark-mode-switcher{margin:0 10px;font-size: 1.5rem;cursor: pointer}');
  27. }
  28. protected function addScript()
  29. {
  30. $script = <<<'JS'
  31. (function() {
  32. var storage = localStorage || {setItem:function () {}, getItem: function () {}},
  33. darkMode = Dcat.darkMode,
  34. key = 'dcat-admin-theme-mode',
  35. mode = storage.getItem(key),
  36. icon = $('.dark-mode-switcher i');
  37. function switchMode(dark) {
  38. if (dark) {
  39. icon.addClass('icon-sun').removeClass('icon-moon');
  40. darkMode.display(true);
  41. return;
  42. }
  43. darkMode.display(false);
  44. icon.removeClass('icon-sun').addClass('icon-moon');
  45. }
  46. if (mode === 'dark') {
  47. switchMode(true);
  48. } else if (mode === 'def') {
  49. switchMode(false)
  50. }
  51. $('.dark-mode-switcher').off('click').on('click', function () {
  52. icon.toggleClass('icon-sun icon-moon');
  53. if (icon.hasClass('icon-moon')) {
  54. switchMode(false);
  55. storage.setItem(key, 'def');
  56. } else {
  57. storage.setItem(key, 'dark');
  58. switchMode(true)
  59. }
  60. })
  61. })()
  62. JS;
  63. Admin::script($script, true);
  64. }
  65. }