Add an extension category filter (#4341)

This commit is contained in:
D8H
2022-09-30 15:14:23 +02:00
committed by GitHub
parent 46be0e0ffc
commit 827c5d6442
9 changed files with 560 additions and 61 deletions

View File

@@ -124,7 +124,7 @@ describe('gdjs.TileMapCollisionMaskRuntimeObject', function () {
index < 200 && tileMap._collisionTileMap.getDimensionX() === 0;
index++
) {
await delay(5);
await delay(10);
}
if (tileMap._collisionTileMap.getDimensionX() === 0) {
throw new Error('Timeout reading the tile map JSON file.');

View File

@@ -28,6 +28,9 @@ type ExtensionStoreState = {|
error: ?Error,
searchText: string,
setSearchText: string => void,
allCategories: string[],
chosenCategory: string,
setChosenCategory: string => void,
extensionShortHeadersByName: { [name: string]: ExtensionShortHeader },
filtersState: FiltersState,
|};
@@ -39,6 +42,10 @@ export const ExtensionStoreContext = React.createContext<ExtensionStoreState>({
error: null,
searchText: '',
setSearchText: () => {},
allCategories: [],
// '' means all categories.
chosenCategory: '',
setChosenCategory: () => {},
extensionShortHeadersByName: {},
filtersState: {
chosenFilters: new Set(),
@@ -67,6 +74,7 @@ export const ExtensionStoreStateProvider = ({
const preferences = React.useContext(PreferencesContext);
const { showCommunityExtensions } = preferences.values;
const [filters, setFilters] = React.useState<?Filters>(null);
const [allCategories, setAllCategories] = React.useState<Array<string>>([]);
const [firstExtensionIds, setFirstExtensionIds] = React.useState<
Array<string>
>([]);
@@ -76,6 +84,7 @@ export const ExtensionStoreStateProvider = ({
const [searchText, setSearchText] = React.useState(
defaultSearchText || emptySearchText
);
const [chosenCategory, setChosenCategory] = React.useState('');
const filtersState = useFilters();
const fetchExtensionsAndFilters = React.useCallback(
@@ -91,13 +100,22 @@ export const ExtensionStoreStateProvider = ({
try {
const extensionRegistry: ExtensionsRegistry = await getExtensionsRegistry();
const { extensionShortHeaders, allTags } = extensionRegistry;
const {
extensionShortHeaders,
allTags,
allCategories,
} = extensionRegistry;
const sortedTags = allTags
.slice()
.sort((tag1, tag2) =>
tag1.toLowerCase().localeCompare(tag2.toLowerCase())
);
const sortedCategories = allCategories
.slice()
.sort((tag1, tag2) =>
tag1.toLowerCase().localeCompare(tag2.toLowerCase())
);
const extensionShortHeadersByName = {};
extensionShortHeaders.forEach(extension => {
@@ -115,6 +133,7 @@ export const ExtensionStoreStateProvider = ({
defaultTags: sortedTags,
tagsTree: [],
});
setAllCategories(sortedCategories);
setFirstExtensionIds(
extensionRegistry.views
? extensionRegistry.views.default.firstExtensionIds
@@ -150,14 +169,14 @@ export const ExtensionStoreStateProvider = ({
[fetchExtensionsAndFilters, extensionShortHeadersByName, isLoading]
);
const { chosenCategory, chosenFilters } = filtersState;
const searchResults: ?Array<{|
item: ExtensionShortHeader,
matches: SearchMatch[],
|}> = useSearchStructuredItem(extensionShortHeadersByName, {
searchText,
chosenCategory,
chosenFilters,
chosenItemCategory: chosenCategory,
chosenCategory: filtersState.chosenCategory,
chosenFilters: filtersState.chosenFilters,
excludedTiers: showCommunityExtensions
? noExcludedTiers
: excludedCommunityTiers,
@@ -169,6 +188,9 @@ export const ExtensionStoreStateProvider = ({
searchResults,
fetchExtensionsAndFilters,
filters,
allCategories,
chosenCategory,
setChosenCategory,
error,
searchText,
setSearchText,
@@ -179,6 +201,9 @@ export const ExtensionStoreStateProvider = ({
searchResults,
error,
filters,
allCategories,
chosenCategory,
setChosenCategory,
searchText,
extensionShortHeadersByName,
filtersState,

View File

@@ -17,7 +17,11 @@ import {
import useDismissableTutorialMessage from '../../Hints/useDismissableTutorialMessage';
import { t } from '@lingui/macro';
import { ColumnStackLayout } from '../../UI/Layout';
import { Column } from '../../UI/Grid';
import PreferencesContext from '../../MainFrame/Preferences/PreferencesContext';
import { ResponsiveLineStackLayout } from '../../UI/Layout';
import SearchBarSelectField from '../../UI/SearchBarSelectField';
import SelectOption from '../../UI/SelectOption';
type Props = {|
isInstalling: boolean,
@@ -48,6 +52,9 @@ export const ExtensionStore = ({
filtersState,
searchText,
setSearchText,
allCategories,
chosenCategory,
setChosenCategory,
} = React.useContext(ExtensionStoreContext);
React.useEffect(
@@ -94,14 +101,33 @@ export const ExtensionStore = ({
{windowWidth => (
<ColumnStackLayout expand noMargin useFullHeight>
<ColumnStackLayout>
<SearchBar
value={searchText}
onChange={setSearchText}
onRequestSearch={() => {}}
tagsHandler={tagsHandler}
tags={filters && filters.allTags}
placeholder={t`Search extensions`}
/>
<ResponsiveLineStackLayout noMargin>
<SearchBarSelectField
value={chosenCategory}
onChange={(e, i, value: string) => {
setChosenCategory(value);
}}
>
<SelectOption value="" primaryText={t`All categories`} />
{allCategories.map(category => (
<SelectOption
key={category}
value={category}
primaryText={category}
/>
))}
</SearchBarSelectField>
<Column expand noMargin>
<SearchBar
value={searchText}
onChange={setSearchText}
onRequestSearch={() => {}}
tagsHandler={tagsHandler}
tags={filters && filters.allTags}
placeholder={t`Search extensions`}
/>
</Column>
</ResponsiveLineStackLayout>
<Toggle
onToggle={(e, check) =>
preferences.setShowCommunityExtensions(check)

View File

@@ -462,6 +462,7 @@ describe('InstallAsset', () => {
mockFn(getExtensionsRegistry).mockImplementationOnce(() => ({
version: '1.0.0',
allTags: [''],
allCategories: [''],
extensionShortHeaders: [
flashExtensionShortHeader,
fireBulletExtensionShortHeader,
@@ -481,6 +482,7 @@ describe('InstallAsset', () => {
mockFn(getExtensionsRegistry).mockImplementationOnce(() => ({
version: '1.0.0',
allTags: [''],
allCategories: [''],
extensionShortHeaders: [
flashExtensionShortHeader,
fireBulletExtensionShortHeader,
@@ -627,6 +629,7 @@ describe('InstallAsset', () => {
mockFn(getExtensionsRegistry).mockImplementationOnce(() => ({
version: '1.0.0',
allTags: [''],
allCategories: [''],
extensionShortHeaders: [
flashExtensionShortHeader,
fireBulletExtensionShortHeader,
@@ -664,6 +667,7 @@ describe('InstallAsset', () => {
mockFn(getExtensionsRegistry).mockImplementationOnce(() => ({
version: '1.0.0',
allTags: [''],
allCategories: [''],
extensionShortHeaders: [
flashExtensionShortHeader,
fireBulletExtensionShortHeader,

View File

@@ -16,6 +16,7 @@ export type SearchResult<T> = {|
type SearchOptions = {|
searchText: string,
chosenItemCategory?: string,
chosenCategory: ?ChosenCategory,
chosenFilters: Set<string>,
excludedTiers: Set<string>,
@@ -75,9 +76,11 @@ export const filterSearchResults = <
tags: Array<string>,
// Some search items can have tiers:
+tier?: string,
+category?: string,
}
>(
searchResults: ?Array<SearchResult<SearchItem>>,
chosenItemCategory: ?string,
chosenCategory: ?ChosenCategory,
chosenFilters: Set<string>,
excludedTiers: Set<string>
@@ -86,6 +89,9 @@ export const filterSearchResults = <
const startTime = performance.now();
const filteredSearchResults = searchResults
.filter(
({ item }) => !chosenItemCategory || item.category === chosenItemCategory
)
.filter(({ item: { tags } }) => {
if (!chosenCategory) return true;
@@ -136,11 +142,13 @@ export const useSearchStructuredItem = <
tags: Array<string>,
// Some search items can have tiers:
+tier?: string,
+category?: string,
}
>(
searchItemsById: ?{ [string]: SearchItem },
{
searchText,
chosenItemCategory,
chosenCategory,
chosenFilters,
excludedTiers,
@@ -228,6 +236,7 @@ export const useSearchStructuredItem = <
setSearchResults(
filterSearchResults(
orderedSearchResults,
chosenItemCategory,
chosenCategory,
chosenFilters,
excludedTiers
@@ -259,6 +268,7 @@ export const useSearchStructuredItem = <
item: result.item,
matches: tuneMatches(result, searchText),
})),
chosenItemCategory,
chosenCategory,
chosenFilters,
excludedTiers
@@ -276,6 +286,7 @@ export const useSearchStructuredItem = <
orderedSearchResults,
searchItemsById,
searchText,
chosenItemCategory,
chosenCategory,
chosenFilters,
searchApi,

View File

@@ -0,0 +1,176 @@
// @flow
import { t } from '@lingui/macro';
import * as React from 'react';
import { I18n } from '@lingui/react';
import TextField from '@material-ui/core/TextField';
import { type MessageDescriptor } from '../Utils/i18n/MessageDescriptor.flow';
import { makeStyles } from '@material-ui/core';
import GDevelopThemeContext from './Theme/ThemeContext';
import Paper from '@material-ui/core/Paper';
const INVALID_VALUE = '';
const stopPropagation = event => event.stopPropagation();
const useSelectStyles = textAlign =>
makeStyles({
root: {
textAlign: textAlign || 'left',
cursor: 'default',
},
})();
const styles = {
root: {
height: 30,
display: 'flex',
justifyContent: 'space-between',
},
input: {
width: '100%',
},
searchContainer: {
position: 'relative',
margin: 'auto 8px',
width: '100%',
},
};
export type SearchBarSelectFieldInterface = {| focus: () => void |};
type ValueProps = {|
value: number | string,
// event and index should not be used, and be removed eventually
onChange?: (
event: {| target: {| value: string |} |},
index: number,
text: string // Note that even for number values, a string is returned
) => void,
|};
// We support a subset of the props supported by Material-UI v0.x SelectField
// They should be self descriptive - refer to Material UI docs otherwise.
type Props = {|
...ValueProps,
fullWidth?: boolean,
children: React.Node,
disabled?: boolean,
stopPropagationOnClick?: boolean,
style?: {
flex?: 1,
width?: 'auto',
},
margin?: 'none' | 'dense',
textAlign?: 'center',
helperMarkdownText?: ?string,
// If a hint text is specified, will be shown as an option for the empty
// value (""), disabled.
translatableHintText?: MessageDescriptor,
|};
/**
* A select field based on Material-UI select field.
* To be used with `SelectOption`.
*/
const SearchBarSelectField = React.forwardRef<
Props,
SearchBarSelectFieldInterface
>((props, ref) => {
const inputRef = React.useRef<?HTMLInputElement>(null);
const focus = React.useCallback(
() => {
if (inputRef.current) {
inputRef.current.focus();
}
},
[inputRef]
);
React.useImperativeHandle(ref, () => ({
focus,
}));
const gdevelopTheme = React.useContext(GDevelopThemeContext);
const selectStyles = useSelectStyles(props.textAlign);
const onChange = props.onChange || undefined;
// Dig into children props to see if the current value is valid or not.
let hasValidValue = true;
const childrenValues = React.Children.map(props.children, child => {
if (child === null || !child.props) return null;
return child.props.value;
});
if (!childrenValues) {
console.error(
'SelectField has been passed no or invalid children. Only SelectOption and null are supported.'
);
} else {
hasValidValue =
childrenValues.filter(childValue => childValue === props.value).length !==
0;
}
const displayedValue = hasValidValue ? props.value : INVALID_VALUE;
return (
<I18n>
{({ i18n }) => (
<Paper
style={{
backgroundColor: gdevelopTheme.searchBar.backgroundColor,
...styles.root,
}}
square={false}
elevation={0}
>
<div style={styles.searchContainer}>
<TextField
select
color="secondary"
disabled={props.disabled}
fullWidth={props.fullWidth}
value={displayedValue}
onClick={
props.stopPropagationOnClick ? stopPropagation : undefined
}
onChange={
onChange
? event => {
onChange(event, -1, event.target.value);
}
: undefined
}
InputProps={{
style: styles.input,
disableUnderline: true,
}}
InputLabelProps={{
shrink: true,
}}
SelectProps={{
native: true,
classes: selectStyles,
}}
margin="none"
style={styles.input}
inputRef={inputRef}
>
{!hasValidValue ? (
<option value={INVALID_VALUE} disabled>
{props.translatableHintText
? i18n._(props.translatableHintText)
: i18n._(t`Choose an option`)}
</option>
) : null}
{props.children}
</TextField>
</div>
</Paper>
)}
</I18n>
);
});
export default SearchBarSelectField;

View File

@@ -9,6 +9,7 @@ type ExtensionTier = 'community' | 'reviewed';
export type ExtensionShortHeader = {|
tier: ExtensionTier,
shortDescription: string,
authorIds: Array<string>,
authors?: Array<UserPublicProfile>,
extensionNamespace: string,
fullName: string,
@@ -18,6 +19,7 @@ export type ExtensionShortHeader = {|
url: string,
headerUrl: string,
tags: Array<string>,
category: string,
previewIconUrl: string,
eventsBasedBehaviorsCount: number,
eventsFunctionsCount: number,
@@ -47,6 +49,7 @@ export type SerializedExtension = {
export type ExtensionsRegistry = {
version: string,
allTags: Array<string>,
allCategories: Array<string>,
extensionShortHeaders: Array<ExtensionShortHeader>,
views?: {
default: {

View File

@@ -1,6 +1,11 @@
// @flow
import { type ExtensionsRegistry } from '../../Utils/GDevelopServices/Extension';
import { type ExtensionShortHeader } from '../../Utils/GDevelopServices/Extension';
export const fakeExtensionsRegistry: ExtensionsRegistry = {
export const fakeExtensionsRegistry: ExtensionsRegistry & {
// The service gives CSV but it's converted on the fly to an array.
extensionShortHeaders: Array<ExtensionShortHeader & { tags: any }>,
} = {
version: '0.0.1',
allTags: [
'ledge tolerance',
@@ -424,6 +429,21 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
'sdk',
'ads',
],
allCategories: [
'Movement',
'Network',
'User interface',
'General',
'Input',
'Advanced',
'Camera',
'Game mechanic',
'Visual effect',
'Third-party',
'Ads',
'Audio',
'Device',
],
views: {
default: {
firstExtensionIds: [
@@ -448,13 +468,18 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/SomeAlreadyInstalledExtension-header.json',
tags: 'ledge tolerance,jump,platform',
category: 'Movement',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Sports and Fitness/Sports and Fitness_training_running_run.svg',
eventsBasedBehaviorsCount: 1,
eventsFunctionsCount: 0,
authors: [
{ id: 'this-is-a-fake-id', username: 'Fake author' },
{ id: 'IWykYNRvhCZBN3vEgKEbBPOR3Oc2', username: 'D8H' },
{ id: 'this-is-a-fake-id', username: 'Fake author', description: '' },
{
id: 'IWykYNRvhCZBN3vEgKEbBPOR3Oc2',
username: 'D8H',
description: '',
},
],
},
{
@@ -470,13 +495,18 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/AdvancedJump-header.json',
tags: 'ledge tolerance,jump,platform',
category: 'Movement',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Sports and Fitness/Sports and Fitness_training_running_run.svg',
eventsBasedBehaviorsCount: 1,
eventsFunctionsCount: 0,
authors: [
{ id: 'this-is-a-fake-id', username: 'Fake author' },
{ id: 'IWykYNRvhCZBN3vEgKEbBPOR3Oc2', username: 'D8H' },
{ id: 'this-is-a-fake-id', username: 'Fake author', description: '' },
{
id: 'IWykYNRvhCZBN3vEgKEbBPOR3Oc2',
username: 'D8H',
description: '',
},
],
},
{
@@ -493,11 +523,18 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/AdvancedP2PEventHandling-header.json',
tags: 'p2p,performance,advanced',
category: 'Network',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Applications and Programming/Applications and Programming_sitemap_map_ux_application.svg',
eventsBasedBehaviorsCount: 0,
eventsFunctionsCount: 1,
authors: [{ id: 'ZgrsWuRTAkXgeuPV9bo0zuEcA2w1', username: 'arthuro555' }],
authors: [
{
id: 'ZgrsWuRTAkXgeuPV9bo0zuEcA2w1',
username: 'arthuro555',
description: '',
},
],
},
{
tier: 'community',
@@ -512,12 +549,17 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/AlignObject-header.json',
tags: 'align,alignment,center',
category: 'User interface',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/format-vertical-align-center.svg',
eventsBasedBehaviorsCount: 0,
eventsFunctionsCount: 14,
authors: [
{ id: 'I0kdjvsICFML0APq45CZjZ6PyEQ2', username: 'Fake user #EQ2' },
{
id: 'I0kdjvsICFML0APq45CZjZ6PyEQ2',
username: 'Fake user #EQ2',
description: '',
},
],
},
{
@@ -534,11 +576,18 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/AnimatedBackAndForthMovement-header.json',
tags: 'back,forth,movement',
category: 'Movement',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/repeat.svg',
eventsBasedBehaviorsCount: 1,
eventsFunctionsCount: 0,
authors: [{ id: 'wWP8BSlAW0UP4NeaHa2LcmmDzmH2', username: '4ian' }],
authors: [
{
id: 'wWP8BSlAW0UP4NeaHa2LcmmDzmH2',
username: '4ian',
description: '',
},
],
},
{
tier: 'reviewed',
@@ -554,11 +603,18 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
'https://resources.gdevelop-app.com/extensions/ArrayTools-header.json',
tags:
'array,variable,index,tool,math,string,sort,find,slice,cut,random,copy,combine,concat,append,insert',
category: 'General',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/code-array.svg',
eventsBasedBehaviorsCount: 0,
eventsFunctionsCount: 31,
authors: [{ id: 'ZgrsWuRTAkXgeuPV9bo0zuEcA2w1', username: 'arthuro555' }],
authors: [
{
id: 'ZgrsWuRTAkXgeuPV9bo0zuEcA2w1',
username: 'arthuro555',
description: '',
},
],
},
{
tier: 'reviewed',
@@ -573,11 +629,18 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/AutoTyping-header.json',
tags: 'text,bbtext,dialogue,visual novel,autotyping,bitmap',
category: 'User interface',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/typewriter.svg',
eventsBasedBehaviorsCount: 3,
eventsFunctionsCount: 0,
authors: [{ id: '2OwwM8ToR9dx9RJ2sAKTcrLmCB92', username: 'Bouh' }],
authors: [
{
id: '2OwwM8ToR9dx9RJ2sAKTcrLmCB92',
username: 'Bouh',
description: '',
},
],
},
{
tier: 'reviewed',
@@ -591,11 +654,18 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/BackButton-header.json',
tags: 'back,mobile,button,input',
category: 'Input',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/keyboard-backspace.svg',
eventsBasedBehaviorsCount: 0,
eventsFunctionsCount: 4,
authors: [{ id: 'ZgrsWuRTAkXgeuPV9bo0zuEcA2w1', username: 'arthuro555' }],
authors: [
{
id: 'ZgrsWuRTAkXgeuPV9bo0zuEcA2w1',
username: 'arthuro555',
description: '',
},
],
},
{
tier: 'reviewed',
@@ -610,12 +680,17 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/BaseConversion-header.json',
tags: 'binary,numbers,number,base,hex,decimal',
category: 'Advanced',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/hexadecimal.svg',
eventsBasedBehaviorsCount: 0,
eventsFunctionsCount: 2,
authors: [
{ id: 'onPsboRtDkUHNOsx7OPr8R8G1oj2', username: 'Fake user #oj2' },
{
id: 'onPsboRtDkUHNOsx7OPr8R8G1oj2',
username: 'Fake user #oj2',
description: '',
},
],
},
{
@@ -631,12 +706,17 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/BehaviorRemapper-header.json',
tags: 'remapper,key,bindings,presets,platformer,top-down',
category: 'Input',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/alpha-w-box-outline.svg',
eventsBasedBehaviorsCount: 2,
eventsFunctionsCount: 0,
authors: [
{ id: 'AlZ3D1xkH0QDao7T37VZZUeYNpn1', username: 'Fake user #pn1' },
{
id: 'AlZ3D1xkH0QDao7T37VZZUeYNpn1',
username: 'Fake user #pn1',
description: '',
},
],
},
{
@@ -654,13 +734,22 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/BoidsMovement-header.json',
tags: 'flock,swarm,boids,crowd,horde',
category: 'Movement',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/Glyphster Pack/Master/SVG/Restaurant/Restaurant_restaurant_seafood_animal_fish.svg',
eventsBasedBehaviorsCount: 1,
eventsFunctionsCount: 1,
authors: [
{ id: 'rotBq28wITdtfsrE7McHQri4k2w2', username: 'Fake user #2w2' },
{ id: 'IWykYNRvhCZBN3vEgKEbBPOR3Oc2', username: 'D8H' },
{
id: 'rotBq28wITdtfsrE7McHQri4k2w2',
username: 'Fake user #2w2',
description: '',
},
{
id: 'IWykYNRvhCZBN3vEgKEbBPOR3Oc2',
username: 'D8H',
description: '',
},
],
},
{
@@ -676,13 +765,18 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/Boomerang-header.json',
tags: 'boomerang,throw,attack,projectile,ricochet,rebound,launch',
category: 'Movement',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/boomerang.svg',
eventsBasedBehaviorsCount: 1,
eventsFunctionsCount: 0,
authors: [
{ id: 'this-is-a-fake-id', username: 'Fake author' },
{ id: 'gqDaZjCfevOOxBYkK6zlhtZnXCg1', username: 'Fake user #Cg1' },
{ id: 'this-is-a-fake-id', username: 'Fake author', description: '' },
{
id: 'gqDaZjCfevOOxBYkK6zlhtZnXCg1',
username: 'Fake user #Cg1',
description: '',
},
],
},
{
@@ -698,11 +792,18 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/Bounce-header.json',
tags: 'bounce,bullet',
category: 'Movement',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/volleyball.svg',
eventsBasedBehaviorsCount: 1,
eventsFunctionsCount: 0,
authors: [{ id: 'wWP8BSlAW0UP4NeaHa2LcmmDzmH2', username: '4ian' }],
authors: [
{
id: 'wWP8BSlAW0UP4NeaHa2LcmmDzmH2',
username: '4ian',
description: '',
},
],
},
{
tier: 'reviewed',
@@ -720,13 +821,22 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/CameraShake-header.json',
tags: 'shaking,camera,effect,screen,shake,zoom,position,rotate',
category: 'Camera',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/vector-difference-ab.svg',
eventsBasedBehaviorsCount: 0,
eventsFunctionsCount: 4,
authors: [
{ id: 'gqDaZjCfevOOxBYkK6zlhtZnXCg1', username: 'Fake user #Cg1' },
{ id: 'm4hBMBTUilft4s1V4FQQPakVDGx1', username: 'Fake user #Gx1' },
{
id: 'gqDaZjCfevOOxBYkK6zlhtZnXCg1',
username: 'Fake user #Cg1',
description: '',
},
{
id: 'm4hBMBTUilft4s1V4FQQPakVDGx1',
username: 'Fake user #Gx1',
description: '',
},
],
},
{
@@ -745,13 +855,22 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/CameraZoom-header.json',
tags: 'Camera,Layer,Zoom',
category: 'Camera',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/UI Essentials/UI Essentials_zoom_in_plus.svg',
eventsBasedBehaviorsCount: 0,
eventsFunctionsCount: 3,
authors: [
{ id: 'IWykYNRvhCZBN3vEgKEbBPOR3Oc2', username: 'D8H' },
{ id: '30b1QQoYi1gQQHzIjMlNY8aLyYV2', username: 'Fake user #YV2' },
{
id: 'IWykYNRvhCZBN3vEgKEbBPOR3Oc2',
username: 'D8H',
description: '',
},
{
id: '30b1QQoYi1gQQHzIjMlNY8aLyYV2',
username: 'Fake user #YV2',
description: '',
},
],
},
{
@@ -768,11 +887,18 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/CancellableDraggable-header.json',
tags: 'drag,drop',
category: 'User interface',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/step-backward.svg',
eventsBasedBehaviorsCount: 1,
eventsFunctionsCount: 0,
authors: [{ id: 'IWykYNRvhCZBN3vEgKEbBPOR3Oc2', username: 'D8H' }],
authors: [
{
id: 'IWykYNRvhCZBN3vEgKEbBPOR3Oc2',
username: 'D8H',
description: '',
},
],
},
{
tier: 'reviewed',
@@ -787,12 +913,17 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/Checkbox-header.json',
tags: 'checkbox,ui,widget,shape painter,toggle,checkmark',
category: 'User interface',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/checkbox-marked.svg',
eventsBasedBehaviorsCount: 1,
eventsFunctionsCount: 0,
authors: [
{ id: 'gqDaZjCfevOOxBYkK6zlhtZnXCg1', username: 'Fake user #Cg1' },
{
id: 'gqDaZjCfevOOxBYkK6zlhtZnXCg1',
username: 'Fake user #Cg1',
description: '',
},
],
},
{
@@ -810,13 +941,22 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/Checkpoints-header.json',
tags: 'position,checkpoint',
category: 'Game mechanic',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/flag-variant.svg',
eventsBasedBehaviorsCount: 0,
eventsFunctionsCount: 3,
authors: [
{ id: '30b1QQoYi1gQQHzIjMlNY8aLyYV2', username: 'Fake user #YV2' },
{ id: '2OwwM8ToR9dx9RJ2sAKTcrLmCB92', username: 'Bouh' },
{
id: '30b1QQoYi1gQQHzIjMlNY8aLyYV2',
username: 'Fake user #YV2',
description: '',
},
{
id: '2OwwM8ToR9dx9RJ2sAKTcrLmCB92',
username: 'Bouh',
description: '',
},
],
},
{
@@ -832,12 +972,17 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/Choose-header.json',
tags: 'choose,random',
category: 'General',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/dice-multiple.svg',
eventsBasedBehaviorsCount: 0,
eventsFunctionsCount: 2,
authors: [
{ id: 'ZShmW1xkW7WWl9AkB78VITJMiTw1', username: 'Fake user #Tw1' },
{
id: 'ZShmW1xkW7WWl9AkB78VITJMiTw1',
username: 'Fake user #Tw1',
description: '',
},
],
},
{
@@ -855,13 +1000,22 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/Clipboard-header.json',
tags: 'clipboard,pasteboard,paste,copy,write',
category: 'User interface',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/clipboard-text-multiple-outline.svg',
eventsBasedBehaviorsCount: 0,
eventsFunctionsCount: 3,
authors: [
{ id: '2OwwM8ToR9dx9RJ2sAKTcrLmCB92', username: 'Bouh' },
{ id: 'ZgrsWuRTAkXgeuPV9bo0zuEcA2w1', username: 'arthuro555' },
{
id: '2OwwM8ToR9dx9RJ2sAKTcrLmCB92',
username: 'Bouh',
description: '',
},
{
id: 'ZgrsWuRTAkXgeuPV9bo0zuEcA2w1',
username: 'arthuro555',
description: '',
},
],
},
{
@@ -881,14 +1035,27 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/ColorConversion-header.json',
tags: 'color,conversion,hexadecimal,rgb,hsl,hsv,hsb',
category: 'Advanced',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/invert-colors.svg',
eventsBasedBehaviorsCount: 0,
eventsFunctionsCount: 9,
authors: [
{ id: 'gqDaZjCfevOOxBYkK6zlhtZnXCg1', username: 'Fake user #Cg1' },
{ id: 'AlZ3D1xkH0QDao7T37VZZUeYNpn1', username: 'Fake user #pn1' },
{ id: 'IWykYNRvhCZBN3vEgKEbBPOR3Oc2', username: 'D8H' },
{
id: 'gqDaZjCfevOOxBYkK6zlhtZnXCg1',
username: 'Fake user #Cg1',
description: '',
},
{
id: 'AlZ3D1xkH0QDao7T37VZZUeYNpn1',
username: 'Fake user #pn1',
description: '',
},
{
id: 'IWykYNRvhCZBN3vEgKEbBPOR3Oc2',
username: 'D8H',
description: '',
},
],
},
{
@@ -903,11 +1070,18 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/Compressor-header.json',
tags: 'string,compression,zip',
category: 'Advanced',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/folder-zip-outline.svg',
eventsBasedBehaviorsCount: 0,
eventsFunctionsCount: 3,
authors: [{ id: 'ZgrsWuRTAkXgeuPV9bo0zuEcA2w1', username: 'arthuro555' }],
authors: [
{
id: 'ZgrsWuRTAkXgeuPV9bo0zuEcA2w1',
username: 'arthuro555',
description: '',
},
],
},
{
tier: 'reviewed',
@@ -923,12 +1097,17 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/CopyCameraSettings-header.json',
tags: 'camera,clone,zoom,position,layer,angle,copy',
category: 'Camera',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/layers-triple-outline.svg',
eventsBasedBehaviorsCount: 0,
eventsFunctionsCount: 1,
authors: [
{ id: 'gqDaZjCfevOOxBYkK6zlhtZnXCg1', username: 'Fake user #Cg1' },
{
id: 'gqDaZjCfevOOxBYkK6zlhtZnXCg1',
username: 'Fake user #Cg1',
description: '',
},
],
},
{
@@ -945,12 +1124,17 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/CreateMultipleCopiesOfObject-header.json',
tags: 'create,multiple,object,grid,row,column',
category: 'Visual effect',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/grid.svg',
eventsBasedBehaviorsCount: 0,
eventsFunctionsCount: 1,
authors: [
{ id: 'gqDaZjCfevOOxBYkK6zlhtZnXCg1', username: 'Fake user #Cg1' },
{
id: 'gqDaZjCfevOOxBYkK6zlhtZnXCg1',
username: 'Fake user #Cg1',
description: '',
},
],
},
{
@@ -967,12 +1151,17 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/CurrentGameVersion-header.json',
tags: 'version',
category: 'Advanced',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/numeric.svg',
eventsBasedBehaviorsCount: 0,
eventsFunctionsCount: 1,
authors: [
{ id: 'ZShmW1xkW7WWl9AkB78VITJMiTw1', username: 'Fake user #Tw1' },
{
id: 'ZShmW1xkW7WWl9AkB78VITJMiTw1',
username: 'Fake user #Tw1',
description: '',
},
],
},
{
@@ -988,11 +1177,18 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/CursorMovement-header.json',
tags: 'mouse,pointer,cursor',
category: 'Input',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Computers and Hardware/Computers and Hardware_mouse_pc.svg',
eventsBasedBehaviorsCount: 0,
eventsFunctionsCount: 3,
authors: [{ id: 'IWykYNRvhCZBN3vEgKEbBPOR3Oc2', username: 'D8H' }],
authors: [
{
id: 'IWykYNRvhCZBN3vEgKEbBPOR3Oc2',
username: 'D8H',
description: '',
},
],
},
{
tier: 'community',
@@ -1010,13 +1206,22 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/CursorType-header.json',
tags: 'cursor,javascript,desktop',
category: 'User interface',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/cursor-default-outline.svg',
eventsBasedBehaviorsCount: 1,
eventsFunctionsCount: 2,
authors: [
{ id: 'ZgrsWuRTAkXgeuPV9bo0zuEcA2w1', username: 'arthuro555' },
{ id: '2OwwM8ToR9dx9RJ2sAKTcrLmCB92', username: 'Bouh' },
{
id: 'ZgrsWuRTAkXgeuPV9bo0zuEcA2w1',
username: 'arthuro555',
description: '',
},
{
id: '2OwwM8ToR9dx9RJ2sAKTcrLmCB92',
username: 'Bouh',
description: '',
},
],
},
{
@@ -1032,12 +1237,17 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/DepthEffect-header.json',
tags: 'depth,effect,scale,y,text,sprite',
category: 'Visual effect',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Virtual Reality/Virtual Reality_vr_computer_3d_cube_screen_tv.svg',
eventsBasedBehaviorsCount: 2,
eventsFunctionsCount: 0,
authors: [
{ id: 'gqDaZjCfevOOxBYkK6zlhtZnXCg1', username: 'Fake user #Cg1' },
{
id: 'gqDaZjCfevOOxBYkK6zlhtZnXCg1',
username: 'Fake user #Cg1',
description: '',
},
],
},
{
@@ -1053,11 +1263,18 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/DiscordRichPresence-header.json',
tags: 'discord,rich,presence,integration,status',
category: 'Third-party',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/discord.svg',
eventsBasedBehaviorsCount: 0,
eventsFunctionsCount: 3,
authors: [{ id: 'ZgrsWuRTAkXgeuPV9bo0zuEcA2w1', username: 'arthuro555' }],
authors: [
{
id: 'ZgrsWuRTAkXgeuPV9bo0zuEcA2w1',
username: 'arthuro555',
description: '',
},
],
},
{
tier: 'reviewed',
@@ -1072,12 +1289,17 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/DoubleClick-header.json',
tags: 'double-click,double-tap',
category: 'Input',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Computers and Hardware/Computers and Hardware_mouse_wireless_pc.svg',
eventsBasedBehaviorsCount: 0,
eventsFunctionsCount: 3,
authors: [
{ id: '8Ih1aa8f5gWUp4UB2BdhQ2iXWxJ3', username: 'Fake user #xJ3' },
{
id: '8Ih1aa8f5gWUp4UB2BdhQ2iXWxJ3',
username: 'Fake user #xJ3',
description: '',
},
],
},
{
@@ -1096,13 +1318,22 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/DragCameraWithPointer-header.json',
tags: 'pointer,drag,camera,scroll,gestures',
category: 'Camera',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/drag-variant.svg',
eventsBasedBehaviorsCount: 0,
eventsFunctionsCount: 1,
authors: [
{ id: 'GfzRsieyUFVnsRR8OZThsPR29oq2', username: 'Fake user #oq2' },
{ id: 'gqDaZjCfevOOxBYkK6zlhtZnXCg1', username: 'Fake user #Cg1' },
{
id: 'GfzRsieyUFVnsRR8OZThsPR29oq2',
username: 'Fake user #oq2',
description: '',
},
{
id: 'gqDaZjCfevOOxBYkK6zlhtZnXCg1',
username: 'Fake user #Cg1',
description: '',
},
],
},
{
@@ -1118,12 +1349,17 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/DraggablePhysics-header.json',
tags: 'draggable,mouse,touch,physics,object,joint,fling',
category: 'Movement',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/Glyphster Pack/Master/SVG/Virtual Reality/Virtual Reality_hand_vr_ar_360.svg',
eventsBasedBehaviorsCount: 1,
eventsFunctionsCount: 0,
authors: [
{ id: 'gqDaZjCfevOOxBYkK6zlhtZnXCg1', username: 'Fake user #Cg1' },
{
id: 'gqDaZjCfevOOxBYkK6zlhtZnXCg1',
username: 'Fake user #Cg1',
description: '',
},
],
},
{
@@ -1143,13 +1379,22 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/DraggableSliderControl-header.json',
tags: 'draggable,slider,shape painter,ui,widget',
category: 'User interface',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/UI Essentials/UI Essentials_sliders_options.svg',
eventsBasedBehaviorsCount: 1,
eventsFunctionsCount: 0,
authors: [
{ id: 'IWykYNRvhCZBN3vEgKEbBPOR3Oc2', username: 'D8H' },
{ id: 'gqDaZjCfevOOxBYkK6zlhtZnXCg1', username: 'Fake user #Cg1' },
{
id: 'IWykYNRvhCZBN3vEgKEbBPOR3Oc2',
username: 'D8H',
description: '',
},
{
id: 'gqDaZjCfevOOxBYkK6zlhtZnXCg1',
username: 'Fake user #Cg1',
description: '',
},
],
},
{
@@ -1165,11 +1410,14 @@ export const fakeExtensionsRegistry: ExtensionsRegistry = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/DrawPathfinding-header.json',
tags: 'pathfinding,debug,shape painter,draw',
category: 'Movement',
previewIconUrl:
'https://resources.gdevelop-app.com/assets/Icons/resistor-nodes.svg',
eventsBasedBehaviorsCount: 1,
eventsFunctionsCount: 0,
authors: [{ id: 'this-is-a-fake-id', username: 'Fake author' }],
authors: [
{ id: 'this-is-a-fake-id', username: 'Fake author', description: '' },
],
},
],
};

View File

@@ -796,6 +796,7 @@ export const fakeAssetShortHeader1: AssetShortHeader = {
export const fireBulletExtensionShortHeader: ExtensionShortHeader = {
tier: 'reviewed',
authorIds: [],
shortDescription:
'Allow the object to fire bullets, with customizable speed, angle and fire rate.',
extensionNamespace: '',
@@ -806,6 +807,7 @@ export const fireBulletExtensionShortHeader: ExtensionShortHeader = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/FireBullet-header.json',
tags: ['fire', 'bullets', 'spawn', 'firerate'],
category: 'Movement',
previewIconUrl: 'https://resources.gdevelop-app.com/assets/Icons/repeat.svg',
eventsBasedBehaviorsCount: 1,
eventsFunctionsCount: 0,
@@ -837,6 +839,7 @@ export const alreadyInstalledCommunityExtensionShortHeader: ExtensionShortHeader
export const flashExtensionShortHeader: ExtensionShortHeader = {
tier: 'reviewed',
authorIds: [],
shortDescription:
'Make the object flash (blink) for a period of time, so that it is alternately visible and invisible.\nTrigger the effect by using the Flash action.',
extensionNamespace: '',
@@ -846,6 +849,7 @@ export const flashExtensionShortHeader: ExtensionShortHeader = {
url: 'Extensions/Flash.json',
headerUrl: 'Extensions/Flash-header.json',
tags: ['flash', 'blink', 'visible', 'invisible', 'hit', 'damage'],
category: 'Visual effect',
previewIconUrl: 'https://resources.gdevelop-app.com/assets/Icons/repeat.svg',
eventsBasedBehaviorsCount: 1,
eventsFunctionsCount: 0,
@@ -853,6 +857,7 @@ export const flashExtensionShortHeader: ExtensionShortHeader = {
export const communityTierExtensionShortHeader: ExtensionShortHeader = {
tier: 'community',
authorIds: [],
shortDescription:
'This is an example of an extension that is a community extension (not reviewed).',
extensionNamespace: '',
@@ -864,6 +869,7 @@ export const communityTierExtensionShortHeader: ExtensionShortHeader = {
headerUrl:
'https://resources.gdevelop-app.com/extensions/FakeCommunityExtension-header.json',
tags: ['fire', 'bullets', 'spawn', 'firerate'],
category: '',
previewIconUrl: 'https://resources.gdevelop-app.com/assets/Icons/repeat.svg',
eventsBasedBehaviorsCount: 1,
eventsFunctionsCount: 0,