this repo has no description
1import { 2 ExtensionLoadSource, 3 ExtensionTag, 4 WebpackRequireType 5} from "@moonlight-mod/types"; 6import { ExtensionState } from "../../types"; 7import filterBar, { Filter, defaultFilter } from "./filterBar"; 8import card from "./card"; 9 10export default (require: WebpackRequireType) => { 11 const React = require("common_react"); 12 const spacepack = require("spacepack_spacepack").spacepack; 13 const Flux = require("common_flux"); 14 15 const { MoonbaseSettingsStore } = 16 require("moonbase_stores") as typeof import("../../webpackModules/stores"); 17 18 const ExtensionCard = card(require); 19 const FilterBar = React.lazy(() => 20 filterBar(require).then((c) => ({ default: c })) 21 ); 22 23 const Margins = spacepack.findByCode("marginCenterHorz:")[0].exports; 24 const SearchBar = spacepack.findByCode("Messages.SEARCH", "hideSearchIcon")[0] 25 .exports.default; 26 27 return function ExtensionsPage() { 28 const { extensions, savedFilter } = Flux.useStateFromStoresObject( 29 [MoonbaseSettingsStore], 30 () => { 31 return { 32 extensions: MoonbaseSettingsStore.extensions, 33 savedFilter: MoonbaseSettingsStore.getExtensionConfig( 34 "moonbase", 35 "filter" 36 ) 37 }; 38 } 39 ); 40 41 const [query, setQuery] = React.useState(""); 42 43 let filter: Filter, setFilter: (filter: Filter) => void; 44 if (moonlight.getConfigOption<boolean>("moonbase", "saveFilter")) { 45 filter = savedFilter ?? defaultFilter; 46 setFilter = (filter) => 47 MoonbaseSettingsStore.setExtensionConfig("moonbase", "filter", filter); 48 } else { 49 const state = React.useState(defaultFilter); 50 filter = state[0]; 51 setFilter = state[1]; 52 } 53 const [selectedTags, setSelectedTags] = React.useState(new Set<string>()); 54 const sorted = Object.values(extensions).sort((a, b) => { 55 const aName = a.manifest.meta?.name ?? a.id; 56 const bName = b.manifest.meta?.name ?? b.id; 57 return aName.localeCompare(bName); 58 }); 59 60 const filtered = sorted.filter( 61 (ext) => 62 (ext.manifest.meta?.name?.toLowerCase().includes(query) || 63 ext.manifest.meta?.tagline?.toLowerCase().includes(query) || 64 ext.manifest.meta?.description?.toLowerCase().includes(query)) && 65 [...selectedTags.values()].every( 66 (tag) => ext.manifest.meta?.tags?.includes(tag as ExtensionTag) 67 ) && 68 // This seems very bad, sorry 69 !( 70 (!(filter & Filter.Core) && 71 ext.source.type === ExtensionLoadSource.Core) || 72 (!(filter & Filter.Normal) && 73 ext.source.type === ExtensionLoadSource.Normal) || 74 (!(filter & Filter.Developer) && 75 ext.source.type === ExtensionLoadSource.Developer) || 76 (!(filter & Filter.Enabled) && 77 MoonbaseSettingsStore.getExtensionEnabled(ext.id)) || 78 (!(filter & Filter.Disabled) && 79 !MoonbaseSettingsStore.getExtensionEnabled(ext.id)) || 80 (!(filter & Filter.Installed) && 81 ext.state !== ExtensionState.NotDownloaded) || 82 (!(filter & Filter.Repository) && 83 ext.state === ExtensionState.NotDownloaded) 84 ) 85 ); 86 87 return ( 88 <> 89 <SearchBar 90 size={SearchBar.Sizes.MEDIUM} 91 query={query} 92 onChange={(v: string) => setQuery(v.toLowerCase())} 93 onClear={() => setQuery("")} 94 autoFocus={true} 95 autoComplete="off" 96 inputProps={{ 97 autoCapitalize: "none", 98 autoCorrect: "off", 99 spellCheck: "false" 100 }} 101 /> 102 <React.Suspense 103 fallback={<div className={Margins.marginBottom20}></div>} 104 > 105 <FilterBar 106 filter={filter} 107 setFilter={setFilter} 108 selectedTags={selectedTags} 109 setSelectedTags={setSelectedTags} 110 /> 111 </React.Suspense> 112 {filtered.map((ext) => ( 113 <ExtensionCard id={ext.id} key={ext.id} /> 114 ))} 115 </> 116 ); 117 }; 118};