this repo has no description

Make saved extension filter a setting

Changed files
+80 -80
packages
core
src
core-extensions
src
moonbase
types
src
+8 -1
packages/core-extensions/src/moonbase/manifest.json
···
"tagline": "The official settings UI for moonlight",
"authors": ["Cynosphere", "NotNite"]
},
-
"dependencies": ["spacepack", "settings", "common"]
+
"dependencies": ["spacepack", "settings", "common"],
+
"settings": {
+
"saveFilter": {
+
"displayName": "Persist filter",
+
"description": "Save extension filter in config",
+
"type": "boolean"
+
}
+
}
}
+28 -33
packages/core-extensions/src/moonbase/ui/extensions/filterBar.tsx
···
ChevronSmallUpIconSVG
} from "../../types";
-
export const defaultFilter = {
-
core: true,
-
normal: true,
-
developer: true,
-
enabled: true,
-
disabled: true,
-
installed: true,
-
repository: true
-
};
-
export type Filter = typeof defaultFilter;
+
export enum Filter {
+
Core = 1 << 0,
+
Normal = 1 << 1,
+
Developer = 1 << 2,
+
Enabled = 1 << 3,
+
Disabled = 1 << 4,
+
Installed = 1 << 5,
+
Repository = 1 << 6
+
}
+
export const defaultFilter = ~(~0 << 7);
export default async (require: WebpackRequireType) => {
const spacepack = require("spacepack_spacepack").spacepack;
···
MenuCheckboxItem
} = require("common_components");
+
const toggleFilter = (set: Filter) =>
+
setFilter(filter & set ? filter & ~set : filter | set);
+
return (
<div className={SortMenuClasses.container}>
<Menu navId="sort-filter" hideScrollbar={true} onClose={closePopout}>
···
<MenuCheckboxItem
id="t-core"
label="Core"
-
checked={filter.core}
-
action={() => setFilter({ ...filter, core: !filter.core })}
+
checked={filter & Filter.Core}
+
action={() => toggleFilter(Filter.Core)}
/>
<MenuCheckboxItem
id="t-normal"
label="Normal"
-
checked={filter.normal}
-
action={() => setFilter({ ...filter, normal: !filter.normal })}
+
checked={filter & Filter.Normal}
+
action={() => toggleFilter(Filter.Normal)}
/>
<MenuCheckboxItem
id="t-developer"
label="Developer"
-
checked={filter.developer}
-
action={() =>
-
setFilter({ ...filter, developer: !filter.developer })
-
}
+
checked={filter & Filter.Developer}
+
action={() => toggleFilter(Filter.Developer)}
/>
</MenuGroup>
<MenuGroup label="State">
<MenuCheckboxItem
id="s-enabled"
label="Enabled"
-
checked={filter.enabled}
-
action={() => setFilter({ ...filter, enabled: !filter.enabled })}
+
checked={filter & Filter.Enabled}
+
action={() => toggleFilter(Filter.Enabled)}
/>
<MenuCheckboxItem
id="s-disabled"
label="Disabled"
-
checked={filter.disabled}
-
action={() =>
-
setFilter({ ...filter, disabled: !filter.disabled })
-
}
+
checked={filter & Filter.Disabled}
+
action={() => toggleFilter(Filter.Disabled)}
/>
</MenuGroup>
<MenuGroup label="Location">
<MenuCheckboxItem
id="l-installed"
label="Installed"
-
checked={filter.installed}
-
action={() =>
-
setFilter({ ...filter, installed: !filter.installed })
-
}
+
checked={filter & Filter.Installed}
+
action={() => toggleFilter(Filter.Installed)}
/>
<MenuCheckboxItem
id="l-repository"
label="Repository"
-
checked={filter.repository}
-
action={() =>
-
setFilter({ ...filter, repository: !filter.repository })
-
}
+
checked={filter & Filter.Repository}
+
action={() => toggleFilter(Filter.Repository)}
/>
</MenuGroup>
<MenuGroup>
···
</Text>
}
action={() => {
-
setFilter({ ...defaultFilter });
+
setFilter(defaultFilter);
closePopout();
}}
/>
+44 -26
packages/core-extensions/src/moonbase/ui/extensions/index.tsx
···
WebpackRequireType
} from "@moonlight-mod/types";
import { ExtensionState } from "../../types";
-
import filterBar, { defaultFilter } from "./filterBar";
+
import filterBar, { Filter, defaultFilter } from "./filterBar";
import card from "./card";
export default (require: WebpackRequireType) => {
···
const { Text } = require("common_components");
return function ExtensionsPage() {
-
const { extensions } = Flux.useStateFromStoresObject(
+
const { extensions, savedFilter } = Flux.useStateFromStoresObject(
[MoonbaseSettingsStore],
() => {
-
return { extensions: MoonbaseSettingsStore.extensions };
+
return {
+
extensions: MoonbaseSettingsStore.extensions,
+
savedFilter: MoonbaseSettingsStore.getExtensionConfig(
+
"moonbase",
+
"filter"
+
)
+
};
}
);
const [query, setQuery] = React.useState("");
-
const savedFilter = MoonbaseSettingsStore.getConfigOption(
-
"saveExtensionFilter"
-
)
-
? MoonbaseSettingsStore.getConfigOption("extensionsFilter")
-
: null;
-
const [filter, setFilter] = React.useState(
-
savedFilter ? { ...savedFilter } : { ...defaultFilter }
-
);
+
// const [filter, setFilter] = React.useState(
+
// moonlight.getConfigOption<boolean>("moonbase", "saveFilters")
+
// ? moonlight.getConfigOption<number>("moonbase", "filters") ??
+
// defaultFilter
+
// : defaultFilter
+
// );
+
let filter: Filter, setFilter: (filter: Filter) => void;
+
if (moonlight.getConfigOption<boolean>("moonbase", "saveFilter")) {
+
filter = savedFilter ?? defaultFilter;
+
setFilter = (filter) =>
+
MoonbaseSettingsStore.setExtensionConfig("moonbase", "filter", filter);
+
} else {
+
const state = React.useState(defaultFilter);
+
filter = state[0];
+
setFilter = state[1];
+
}
const [selectedTags, setSelectedTags] = React.useState(new Set<string>());
const sorted = Object.values(extensions).sort((a, b) => {
const aName = a.manifest.meta?.name ?? a.id;
···
) &&
// This seems very bad, sorry
!(
-
(!filter.core && ext.source.type === ExtensionLoadSource.Core) ||
-
(!filter.normal && ext.source.type === ExtensionLoadSource.Normal) ||
-
(!filter.developer &&
+
(!(filter & Filter.Core) &&
+
ext.source.type === ExtensionLoadSource.Core) ||
+
(!(filter & Filter.Normal) &&
+
ext.source.type === ExtensionLoadSource.Normal) ||
+
(!(filter & Filter.Developer) &&
ext.source.type === ExtensionLoadSource.Developer) ||
-
(!filter.enabled &&
+
(!(filter & Filter.Enabled) &&
MoonbaseSettingsStore.getExtensionEnabled(ext.id)) ||
-
(!filter.disabled &&
+
(!(filter & Filter.Disabled) &&
!MoonbaseSettingsStore.getExtensionEnabled(ext.id)) ||
-
(!filter.installed && ext.state !== ExtensionState.NotDownloaded) ||
-
(!filter.repository && ext.state === ExtensionState.NotDownloaded)
+
(!(filter & Filter.Installed) &&
+
ext.state !== ExtensionState.NotDownloaded) ||
+
(!(filter & Filter.Repository) &&
+
ext.state === ExtensionState.NotDownloaded)
)
);
···
<FilterBar
filter={filter}
setFilter={(filter) => {
-
if (
-
MoonbaseSettingsStore.getConfigOption("saveExtensionFilter")
-
) {
-
MoonbaseSettingsStore.setConfigOption(
-
"extensionsFilter",
-
filter
-
);
-
}
+
// if (
+
// MoonbaseSettingsStore.getConfigOption("saveExtensionFilter")
+
// ) {
+
// MoonbaseSettingsStore.setConfigOption(
+
// "extensionsFilter",
+
// filter
+
// );
+
// }
setFilter(filter);
}}
selectedTags={selectedTags}
-10
packages/core/src/config.ts
···
noTrack: true,
noHideToken: true
},
-
saveExtensionFilter: false,
-
extensionsFilter: {
-
core: true,
-
developer: true,
-
disabled: true,
-
enabled: true,
-
installed: true,
-
normal: true,
-
repository: true
-
},
repositories: ["https://moonlight-mod.github.io/extensions-dist/repo.json"]
};
-10
packages/types/src/config.ts
···
devSearchPaths?: string[];
loggerLevel?: string;
patchAll?: boolean;
-
saveExtensionFilter: boolean;
-
extensionsFilter: {
-
core: boolean;
-
normal: boolean;
-
developer: boolean;
-
enabled: boolean;
-
disabled: boolean;
-
installed: boolean;
-
repository: boolean;
-
};
};
export type ConfigExtensions =