diff --git a/src/assets/main.css b/src/assets/main.css index a400b92..95a2c01 100644 --- a/src/assets/main.css +++ b/src/assets/main.css @@ -225,4 +225,12 @@ pre code.hljs { .mdc-button--outlined:not(:disabled) { border-color: var(--color-border) !important; +} + +.mdc-menu-surface { + background-color: var(--color-background) !important; +} + +.material-icons { + color: var(--color-text) !important; } \ No newline at end of file diff --git a/src/hooks/useMediaQuery.ts b/src/hooks/useMediaQuery.ts new file mode 100644 index 0000000..455d8ab --- /dev/null +++ b/src/hooks/useMediaQuery.ts @@ -0,0 +1,17 @@ +import { ref } from 'vue' + +/** + * Returns boolean ref, whose value is true if the passed media query + * matches else returns false + * @param mediaQuery string + */ +export default function useMediaQuery(mediaQuery: string) { + const matcher = window.matchMedia(mediaQuery) + const matchMedia = ref(matcher.matches) + + matcher.onchange = (e) => { + matchMedia.value = e.matches + } + + return matchMedia +} diff --git a/src/hooks/useStorage.ts b/src/hooks/useStorage.ts index bc1a131..6abdcd3 100644 --- a/src/hooks/useStorage.ts +++ b/src/hooks/useStorage.ts @@ -1,5 +1,5 @@ const storageHandler = { - load(key: string, autoParse = true) { + load(key: string, autoParse = true): any { try { let content = localStorage.getItem(key) if (content === 'undefined') { diff --git a/src/stores/routes.ts b/src/stores/routes.ts index 7cb57fb..83d2863 100644 --- a/src/stores/routes.ts +++ b/src/stores/routes.ts @@ -1,31 +1,49 @@ +import useStorage from '@/hooks/useStorage' import routes from '@/routes' +import { type Route, type Routes } from '@/types/route' import { defineStore } from 'pinia' +const storage = useStorage() + export const useRoutes = defineStore('routes', { state: () => ({ routes }), getters: { - getRoute: (state) => (slug: string) => { - return state.routes[slug] + isDeleted: + () => + (slug: string): boolean => { + const deleted_routes: string[] = storage.load('deletedModules') || [] + return deleted_routes.includes(slug) + }, + getRoute(state) { + return (slug: string): Route | undefined => + this.isDeleted(slug) ? undefined : state.routes[slug] }, - getRoutes: (state) => () => { - return state.routes + getRoutes(state) { + return (): Routes => + Object.keys(state.routes) + .filter((e: string) => !this.isDeleted(e)) + .reduce((a, b) => ({ ...a, [b]: routes[b] }), {}) }, - search: (state) => (term: string) => { - const query = new RegExp(term, 'gi') + search() { + const self = this + return (term: string) => { + const query = new RegExp(term, 'gi') + const routes = self.getRoutes() - if (term.replace(/\s/g, '') === '') { - return state.routes - } + if (term.replace(/\s/g, '') === '') { + return routes + } - return Object.keys(state.routes) - .filter((e) => { - const route = state.routes[e] + return Object.keys(routes) + .filter((e: string) => { + const route = routes[e] - return route.name.match(query) - }) - .reduce((a, b) => ({ ...a, [b]: state.routes[b] }), {}) + return route.name.match(query) + }) + .reduce((a, b) => ({ ...a, [b]: routes[b] }), {}) + } } } }) diff --git a/src/types/menuItem.ts b/src/types/menuItem.ts new file mode 100644 index 0000000..bfadbff --- /dev/null +++ b/src/types/menuItem.ts @@ -0,0 +1,5 @@ +export interface MenuItem { + index: number + text: string + value: string +} diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index 5614d9b..38180e9 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -1,14 +1,16 @@