this repo has no description

moonbase: click on tags to filter

Changed files
+29 -7
packages
core-extensions
src
moonbase
webpackModules
ui
+2 -2
packages/core-extensions/src/moonbase/webpackModules/ui/extensions/card.tsx
···
);
}
-
export default function ExtensionCard({ uniqueId }: { uniqueId: number }) {
+
export default function ExtensionCard({ uniqueId, selectTag }: { uniqueId: number; selectTag: (tag: string) => void }) {
const { ext, enabled, busy, update, conflicting } = useStateFromStores([MoonbaseSettingsStore], () => {
return {
ext: MoonbaseSettingsStore.getExtension(uniqueId),
···
rowGap: tab === ExtensionPage.Info ? "16px" : undefined
}}
>
-
{tab === ExtensionPage.Info && <ExtensionInfo ext={ext} />}
+
{tab === ExtensionPage.Info && <ExtensionInfo ext={ext} selectTag={selectTag} />}
{tab === ExtensionPage.Description && (
<Text variant="text-md/normal" className={MarkupClasses.markup} style={{ width: "100%" }}>
{MarkupUtils.parse(description ?? "*No description*", true, {
+14 -2
packages/core-extensions/src/moonbase/webpackModules/ui/extensions/index.tsx
···
const SearchBar = spacepack.require("discord/uikit/search/SearchBar").default;
+
const validTags: string[] = Object.values(ExtensionTag);
+
export default function ExtensionsPage() {
const { extensions, savedFilter } = useStateFromStoresObject([MoonbaseSettingsStore], () => {
return {
···
filter = filterState[0];
setFilter = filterState[1];
}
+
const [selectedTags, setSelectedTags] = React.useState(new Set<string>());
+
const selectTag = React.useCallback(
+
(tag: string) => {
+
const newState = new Set(selectedTags);
+
if (validTags.includes(tag)) newState.add(tag);
+
setSelectedTags(newState);
+
},
+
[selectedTags]
+
);
+
const sorted = Object.values(extensions).sort((a, b) => {
const aName = a.manifest.meta?.name ?? a.id;
const bName = b.manifest.meta?.name ?? b.id;
···
)}
{filteredWithUpdates.map((ext) => (
-
<ExtensionCard uniqueId={ext.uniqueId} key={ext.uniqueId} />
+
<ExtensionCard uniqueId={ext.uniqueId} key={ext.uniqueId} selectTag={selectTag} />
))}
{filteredWithUpdates.length > 0 && filteredWithoutUpdates.length > 0 && (
<FormDivider className="moonbase-update-divider" />
)}
{filteredWithoutUpdates.map((ext) => (
-
<ExtensionCard uniqueId={ext.uniqueId} key={ext.uniqueId} />
+
<ExtensionCard uniqueId={ext.uniqueId} key={ext.uniqueId} selectTag={selectTag} />
))}
</>
);
+13 -3
packages/core-extensions/src/moonbase/webpackModules/ui/extensions/info.tsx
···
function Badge({
color,
children,
-
style = {}
+
style = {},
+
onClick
}: {
color: string;
children: React.ReactNode;
style?: React.CSSProperties;
+
onClick?: () => void;
}) {
+
if (onClick) style.cursor ??= "pointer";
return (
<span
className="moonlight-card-badge"
···
...style
} as React.CSSProperties
}
+
onClick={onClick}
>
{children}
</span>
);
}
-
export default function ExtensionInfo({ ext }: { ext: MoonbaseExtension }) {
+
export default function ExtensionInfo({
+
ext,
+
selectTag
+
}: {
+
ext: MoonbaseExtension;
+
selectTag: (tag: string) => void;
+
}) {
const authors = ext.manifest?.meta?.authors;
const tags = ext.manifest?.meta?.tags;
const version = ext.manifest?.version;
···
}
return (
-
<Badge key={i} color={color} style={style}>
+
<Badge key={i} color={color} style={style} onClick={() => selectTag(tag)}>
{name}
</Badge>
);