From c03b61a9ee7588d2dafc410c81d00ee1b997edf7 Mon Sep 17 00:00:00 2001 From: Michael-u21546551 Date: Sat, 7 Dec 2024 20:51:21 +0200 Subject: [PATCH] Implement reset functions for saved objects and viewable elements, and update app version handling --- muzik-offline/src/database/saved_object.ts | 31 +++++++++++++++++++ muzik-offline/src/database/side_elements.ts | 10 ++++++ muzik-offline/src/interface/App/App.tsx | 19 +++++++----- .../src/interface/layouts/AboutSettings.tsx | 14 ++++++++- muzik-offline/src/store/index.ts | 21 ++++++++++++- muzik-offline/src/store/storeTypes.ts | 11 +++++++ muzik-offline/src/utils/index.ts | 26 +++++++++++++++- 7 files changed, 121 insertions(+), 11 deletions(-) diff --git a/muzik-offline/src/database/saved_object.ts b/muzik-offline/src/database/saved_object.ts index 5050a15..9940522 100644 --- a/muzik-offline/src/database/saved_object.ts +++ b/muzik-offline/src/database/saved_object.ts @@ -56,4 +56,35 @@ export const emptySavedObject: SavedObject = { PlayBackSpeed: "1", AudioTransition: "No", OutputDevice: "" +} + +export function resetObject(obj: SavedObject){ + obj.LaunchTab = "All tracks"; + obj.AppActivityDiscord = "No"; + obj.BGColour = "blue_purple_gradient"; + obj.ThemeColour = "blueberry"; + obj.PlayerBar = true; + obj.Volume = 0; + obj.VolumeStepAmount = "5"; + obj.SongSeeker = 0; + obj.Animations = false; + obj.AppThemeBlur = true; + obj.WallpaperOpacityAmount = "8"; + obj.OStype = OSTYPEenum.Windows; + obj.CompressImage = "No"; + obj.UpcomingHistoryLimit = "10"; + obj.SeekStepAmount = "10"; + obj.SongLengthORremaining = "song length"; + obj.AudioLabPreset = "flat"; + obj.SavedPresets = ["flat", "hip-hop"]; + obj.AlwaysRoundedCornersWindows = "No"; + obj.AutoStartApp = "No"; + obj.DirectoryScanningDepth = 1; + obj.player = "rodio"; + obj.AudioQuality = "High(320kbps)"; + obj.PlayBackSpeed = "1"; + obj.AudioTransition = "No"; + obj.OutputDevice = ""; + + return obj; } \ No newline at end of file diff --git a/muzik-offline/src/database/side_elements.ts b/muzik-offline/src/database/side_elements.ts index 1586e26..0949314 100644 --- a/muzik-offline/src/database/side_elements.ts +++ b/muzik-offline/src/database/side_elements.ts @@ -12,4 +12,14 @@ export const viewableSideElements: viewableSideEl = { All_albums: true, All_genres: true, All_playlists: true, +} + +export function resetViewableElements(obj: viewableSideEl){ + obj.All_tracks = true; + obj.All_artists = true; + obj.All_albums = true; + obj.All_genres = true; + obj.All_playlists = true; + + return obj; } \ No newline at end of file diff --git a/muzik-offline/src/interface/App/App.tsx b/muzik-offline/src/interface/App/App.tsx index f9db474..67b49d4 100644 --- a/muzik-offline/src/interface/App/App.tsx +++ b/muzik-offline/src/interface/App/App.tsx @@ -15,7 +15,7 @@ import { isPermissionGranted, requestPermission, sendNotification } from '@tauri import { MiniPlayer } from "@App/index"; import { listen } from "@tauri-apps/api/event"; import { processOSMediaControlsEvent } from "@utils/OSeventControl"; -import { fetch_library, getWallpaperURL } from "@utils/index"; +import { fetch_library, getWallpaperURL, shouldClearZustandStores } from "@utils/index"; import { local_songs_db } from "@database/database"; import { startPlayingNewSong } from "@utils/playerControl"; @@ -142,13 +142,16 @@ const App = () => { } useEffect(() => { - request_song(); - checkOSType(); - checkAndRequestNotificationPermission(); - connect_to_discord(); - get_server_port(); - check_paths_for_new_music(); - check_if_paths_are_still_valid(); + shouldClearZustandStores().then(() => { + request_song(); + checkOSType(); + checkAndRequestNotificationPermission(); + connect_to_discord(); + get_server_port(); + check_paths_for_new_music(); + check_if_paths_are_still_valid(); + }); + const listenForOSeventsfunc = listenForOSevents(); return () => { listenForOSeventsfunc.then((unlisten) => unlisten()); } diff --git a/muzik-offline/src/interface/layouts/AboutSettings.tsx b/muzik-offline/src/interface/layouts/AboutSettings.tsx index aa44b74..cca2e23 100644 --- a/muzik-offline/src/interface/layouts/AboutSettings.tsx +++ b/muzik-offline/src/interface/layouts/AboutSettings.tsx @@ -2,8 +2,20 @@ import { App_logo } from "@logos/index"; import "@styles/layouts/AboutSettings.scss"; import { open } from '@tauri-apps/plugin-shell'; import { motion } from "framer-motion"; +import { getVersion } from '@tauri-apps/api/app'; +import { useState, useEffect } from "react"; const AboutSettings = () => { + const [version, setVersion] = useState(''); + + useEffect(() => { + async function fetchVersion() { + const version = await getVersion(); + setVersion(version); + } + fetchVersion(); + }, []); + return (

About Settings

@@ -11,7 +23,7 @@ const AboutSettings = () => {

Copyright 2024 muzik-apps. All rights reserved.

-

Version "0.7.0"

+

Version {version}

open("https://github.com/muzik-apps/muzik-offline")}> muzik-offline diff --git a/muzik-offline/src/store/index.ts b/muzik-offline/src/store/index.ts index 9a07c38..e7918bb 100644 --- a/muzik-offline/src/store/index.ts +++ b/muzik-offline/src/store/index.ts @@ -1,6 +1,6 @@ import { create } from 'zustand'; import { devtools, persist } from 'zustand/middleware'; -import { firstRunState, FSState, MaximisedState, PlayerInterface, PlayingPositionInterface, portState, QueueInterface, SavedDirectoriesInterface, SavedObjectInterface, searchInterface, toastInterface, viewableSideElInterface, wallpaperInterface, SavedPresetsValues } from './storeTypes'; +import { firstRunState, FSState, MaximisedState, PlayerInterface, PlayingPositionInterface, portState, QueueInterface, SavedDirectoriesInterface, SavedObjectInterface, searchInterface, toastInterface, viewableSideElInterface, wallpaperInterface, SavedPresetsValues, VersionInterface } from './storeTypes'; import { emptyDirectories } from '@database/directories'; import { emptyPlayer } from '@database/player'; import { emptySavedObject } from '@database/saved_object'; @@ -37,6 +37,7 @@ export const useFisrstRunStore = create()( (set) => ({ firstRun: true, setFirstRun: (nFR) => set((_state) => ({ firstRun: nFR })), + reset: () => set((_state) => ({ firstRun: true })), }), {name: 'firstRun',} ) @@ -86,6 +87,7 @@ export const useWallpaperStore = create()( wallpaperUUID: "", setWallpaper: (nW) => set((_state) => ({ wallpaperUUID: nW })), unsetWallpaper: () => set((_state) => ({ wallpaperUUID: null})), + reset: () => set((_state) => ({ wallpaperUUID: "" })), }), {name: 'SavedWallpaperUUID-offline',} ) @@ -98,6 +100,7 @@ export const useViewableSideElStore = create()( (set) => ({ viewableEl: viewableSideElements, setviewableEl: (setTo) => set((_state) => ({ viewableEl: setTo })), + reset: () => set((_state) => ({ viewableEl: viewableSideElements })), }), {name: 'viewableEl',} ) @@ -110,6 +113,7 @@ export const useDirStore = create()( (set) => ({ dir: emptyDirectories, setDir: (setTo) => set((_state) => ({ dir: setTo })), + reset: () => set((_state) => ({ dir: emptyDirectories })), }), { name: 'directories', // Key for localStorage @@ -151,6 +155,7 @@ export const useSavedObjectStore = create()( (set) => ({ local_store: emptySavedObject, setStore: (setTo) => set((_state) => ({ local_store: setTo })), + reset: () => set((_state) => ({ local_store: emptySavedObject })), }), {name: 'SavedObject-offline',} ) @@ -206,5 +211,19 @@ export const useSavedPresetsValues = create()( (set) => ({ map: premade_audio_labs, addValue: (key: string, value: AudioLabPreset) => set((state) => ({ map: state.map.set(key, value) })), + set: (setTo) => set((_state) => ({ map: setTo })), }), +) + +export const useVersionStore = create()( + devtools( + persist( + (set) => ({ + version: "", + setVersion: (nV) => set((_state) => ({ version: nV })), + reset: () => set((_state) => ({ version: "" })), + }), + {name: 'version',} + ) + ) ) \ No newline at end of file diff --git a/muzik-offline/src/store/storeTypes.ts b/muzik-offline/src/store/storeTypes.ts index da64da7..5a83e4a 100644 --- a/muzik-offline/src/store/storeTypes.ts +++ b/muzik-offline/src/store/storeTypes.ts @@ -12,6 +12,7 @@ export interface MaximisedState { export interface firstRunState{ firstRun: boolean; setFirstRun: (nFR: boolean) => void; + reset: () => void; } export interface portState{ @@ -39,21 +40,25 @@ export interface wallpaperInterface{ wallpaperUUID: string | null; setWallpaper: (nW: string) => void; unsetWallpaper: () => void; + reset: () => void; } export interface viewableSideElInterface{ viewableEl: viewableSideEl; setviewableEl: (setTo: viewableSideEl) => void; + reset: () => void; } export interface SavedDirectoriesInterface{ dir: SavedDirectories; setDir: (setTo: SavedDirectories) => void; + reset: () => void; } export interface SavedObjectInterface{ local_store: SavedObject; setStore: (setTo: SavedObject) => void; + reset: () => void; } export interface PlayerInterface{ @@ -84,4 +89,10 @@ export interface QueueInterface{ export interface SavedPresetsValues{ map: Map; addValue: (key: string, value: AudioLabPreset) => void; + set: (setTo: Map) => void; +} + +export interface VersionInterface{ + version: string; + setVersion: (setTo: string) => void; } \ No newline at end of file diff --git a/muzik-offline/src/utils/index.ts b/muzik-offline/src/utils/index.ts index 428475d..c1a6e75 100644 --- a/muzik-offline/src/utils/index.ts +++ b/muzik-offline/src/utils/index.ts @@ -1,9 +1,12 @@ import { NullCoverOne, NullCoverTwo, NullCoverThree, NullCoverFour } from "@assets/index"; import { local_albums_db, local_artists_db, local_genres_db, local_playlists_db, local_songs_db } from "@database/database"; import { Song, album, artist, genre, playlist } from "@muziktypes/index"; -import { useDirStore, useHistorySongs, usePortStore, useSavedObjectStore, useToastStore, useUpcomingSongs } from "@store/index"; +import { useDirStore, useFisrstRunStore, useHistorySongs, usePortStore, useSavedObjectStore, useToastStore, useUpcomingSongs, useVersionStore, useViewableSideElStore, useWallpaperStore } from "@store/index"; import { invoke } from "@tauri-apps/api/core"; import { toastType } from '../types/index'; +import { getVersion } from "@tauri-apps/api/app"; +import { resetObject } from "@database/saved_object"; +import { resetViewableElements } from "@database/side_elements"; export const fetch_library = async(fresh_library: boolean): Promise<{status: string, message: string}> => { const res_songs = await fetch_songs_metadata(fresh_library); @@ -317,4 +320,25 @@ export async function reloadLibrary(paths: string[]){ console.log(_error); useToastStore.getState().setToast({title: "Loading songs...", message: "No new songs detected in given folders or you dropped a file", type: toastType.error, timeout: 5000}); }); +} + +export const shouldClearZustandStores = async() => { + const savedAppVersion = useVersionStore.getState().version; + const currentVersion = await getVersion(); + + if(savedAppVersion === currentVersion)return; + + useVersionStore.getState().setVersion(currentVersion); + useFisrstRunStore.getState().reset(); + useWallpaperStore.getState().reset(); + useViewableSideElStore.getState().setviewableEl(resetViewableElements(useViewableSideElStore.getState().viewableEl)); + useDirStore.getState().setDir({Dir: new Set()}); + useSavedObjectStore.getState().setStore(resetObject(useSavedObjectStore.getState().local_store)); + + await local_songs_db.songs.clear(); + await local_albums_db.albums.clear(); + await local_artists_db.artists.clear(); + await local_genres_db.genres.clear(); + + useToastStore.getState().setToast({title: "App updated", message: "We have updated the app to a new version, please reload the app to see the changes", type: toastType.info, timeout: 5000}); } \ No newline at end of file