Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
F
frontend
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
vicotor
frontend
Commits
621f86f5
Commit
621f86f5
authored
May 08, 2023
by
tom
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
renaming
parent
9c38cc4f
Changes
18
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
81 additions
and
78 deletions
+81
-78
[id].tsx
pages/apps/[id].tsx
+2
-2
index.tsx
pages/apps/index.tsx
+5
-5
marketplace.ts
types/client/marketplace.ts
+3
-3
MarketplaceAppCard.tsx
ui/marketplace/MarketplaceAppCard.tsx
+6
-6
MarketplaceAppCardLink.tsx
ui/marketplace/MarketplaceAppCardLink.tsx
+2
-2
MarketplaceAppCardSkeleton.tsx
ui/marketplace/MarketplaceAppCardSkeleton.tsx
+3
-1
MarketplaceAppModal.tsx
ui/marketplace/MarketplaceAppModal.tsx
+6
-6
MarketplaceAppModalLink.tsx
ui/marketplace/MarketplaceAppModalLink.tsx
+2
-2
MarketplaceCategoriesMenu.tsx
ui/marketplace/MarketplaceCategoriesMenu.tsx
+7
-7
MarketplaceCategoriesMenuItem.tsx
ui/marketplace/MarketplaceCategoriesMenuItem.tsx
+4
-4
MarketplaceList.tsx
ui/marketplace/MarketplaceList.tsx
+8
-7
MarketplaceListSkeleton.tsx
ui/marketplace/MarketplaceListSkeleton.tsx
+4
-4
useMarketplace.tsx
ui/marketplace/useMarketplace.tsx
+10
-10
Marketplace.tsx
ui/pages/Marketplace.tsx
+12
-12
MarketplaceApp.tsx
ui/pages/MarketplaceApp.tsx
+4
-4
DataListDisplay.tsx
ui/shared/DataListDisplay.tsx
+1
-1
EmptySearchResult.tsx
ui/shared/EmptySearchResult.tsx
+0
-0
ChartsWidgetsList.tsx
ui/stats/ChartsWidgetsList.tsx
+2
-2
No files found.
pages/apps/[id].tsx
View file @
621f86f5
...
@@ -5,7 +5,7 @@ import React from 'react';
...
@@ -5,7 +5,7 @@ import React from 'react';
import
MarketplaceApp
from
'
ui/pages/MarketplaceApp
'
;
import
MarketplaceApp
from
'
ui/pages/MarketplaceApp
'
;
import
Page
from
'
ui/shared/Page/Page
'
;
import
Page
from
'
ui/shared/Page/Page
'
;
const
AppPage
:
NextPage
=
()
=>
{
const
Marketplace
AppPage
:
NextPage
=
()
=>
{
return
(
return
(
<
Page
wrapChildren=
{
false
}
>
<
Page
wrapChildren=
{
false
}
>
<
Head
><
title
>
Blockscout | Marketplace
</
title
></
Head
>
<
Head
><
title
>
Blockscout | Marketplace
</
title
></
Head
>
...
@@ -14,6 +14,6 @@ const AppPage: NextPage = () => {
...
@@ -14,6 +14,6 @@ const AppPage: NextPage = () => {
);
);
};
};
export
default
AppPage
;
export
default
Marketplace
AppPage
;
export
{
getServerSideProps
}
from
'
lib/next/getServerSideProps
'
;
export
{
getServerSideProps
}
from
'
lib/next/getServerSideProps
'
;
pages/apps/index.tsx
View file @
621f86f5
...
@@ -2,21 +2,21 @@ import type { NextPage } from 'next';
...
@@ -2,21 +2,21 @@ import type { NextPage } from 'next';
import
Head
from
'
next/head
'
;
import
Head
from
'
next/head
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
Apps
from
'
ui/pages/Apps
'
;
import
Marketplace
from
'
ui/pages/Marketplace
'
;
import
Page
from
'
ui/shared/Page/Page
'
;
import
Page
from
'
ui/shared/Page/Page
'
;
import
PageTitle
from
'
ui/shared/Page/PageTitle
'
;
import
PageTitle
from
'
ui/shared/Page/PageTitle
'
;
const
Apps
Page
:
NextPage
=
()
=>
{
const
Marketplace
Page
:
NextPage
=
()
=>
{
return
(
return
(
<
Page
>
<
Page
>
<
PageTitle
text=
"
Apps
"
/>
<
PageTitle
text=
"
Marketplace
"
/>
<
Head
><
title
>
Blockscout | Marketplace
</
title
></
Head
>
<
Head
><
title
>
Blockscout | Marketplace
</
title
></
Head
>
<
Apps
/>
<
Marketplace
/>
</
Page
>
</
Page
>
);
);
};
};
export
default
Apps
Page
;
export
default
Marketplace
Page
;
export
{
getServerSideProps
}
from
'
lib/next/getServerSideProps
'
;
export
{
getServerSideProps
}
from
'
lib/next/getServerSideProps
'
;
types/client/
apps
.ts
→
types/client/
marketplace
.ts
View file @
621f86f5
export
type
AppItem
Preview
=
{
export
type
MarketplaceApp
Preview
=
{
id
:
string
;
id
:
string
;
external
?:
boolean
;
external
?:
boolean
;
title
:
string
;
title
:
string
;
...
@@ -8,7 +8,7 @@ export type AppItemPreview = {
...
@@ -8,7 +8,7 @@ export type AppItemPreview = {
url
:
string
;
url
:
string
;
}
}
export
type
AppItemOverview
=
AppItem
Preview
&
{
export
type
MarketplaceAppOverview
=
MarketplaceApp
Preview
&
{
author
:
string
;
author
:
string
;
description
:
string
;
description
:
string
;
site
?:
string
;
site
?:
string
;
...
@@ -17,7 +17,7 @@ export type AppItemOverview = AppItemPreview & {
...
@@ -17,7 +17,7 @@ export type AppItemOverview = AppItemPreview & {
github
?:
string
;
github
?:
string
;
}
}
export
enum
App
Category
{
export
enum
Marketplace
Category
{
ALL
=
'
All apps
'
,
ALL
=
'
All apps
'
,
FAVORITES
=
'
Favorites
'
,
FAVORITES
=
'
Favorites
'
,
}
}
ui/
apps/
AppCard.tsx
→
ui/
marketplace/Marketplace
AppCard.tsx
View file @
621f86f5
...
@@ -2,21 +2,21 @@ import { Box, Heading, Icon, IconButton, Image, Link, LinkBox, Text, useColorMod
...
@@ -2,21 +2,21 @@ import { Box, Heading, Icon, IconButton, Image, Link, LinkBox, Text, useColorMod
import
type
{
MouseEvent
}
from
'
react
'
;
import
type
{
MouseEvent
}
from
'
react
'
;
import
React
,
{
useCallback
}
from
'
react
'
;
import
React
,
{
useCallback
}
from
'
react
'
;
import
type
{
AppItemPreview
}
from
'
types/client/apps
'
;
import
type
{
MarketplaceAppPreview
}
from
'
types/client/marketplace
'
;
import
northEastIcon
from
'
icons/arrows/north-east.svg
'
;
import
northEastIcon
from
'
icons/arrows/north-east.svg
'
;
import
starFilledIcon
from
'
icons/star_filled.svg
'
;
import
starFilledIcon
from
'
icons/star_filled.svg
'
;
import
starOutlineIcon
from
'
icons/star_outline.svg
'
;
import
starOutlineIcon
from
'
icons/star_outline.svg
'
;
import
AppCardLink
from
'
./
AppCardLink
'
;
import
MarketplaceAppCardLink
from
'
./Marketplace
AppCardLink
'
;
interface
Props
extends
AppItem
Preview
{
interface
Props
extends
MarketplaceApp
Preview
{
onInfoClick
:
(
id
:
string
)
=>
void
;
onInfoClick
:
(
id
:
string
)
=>
void
;
isFavorite
:
boolean
;
isFavorite
:
boolean
;
onFavoriteClick
:
(
id
:
string
,
isFavorite
:
boolean
)
=>
void
;
onFavoriteClick
:
(
id
:
string
,
isFavorite
:
boolean
)
=>
void
;
}
}
const
AppCard
=
({
const
Marketplace
AppCard
=
({
id
,
id
,
url
,
url
,
external
,
external
,
...
@@ -85,7 +85,7 @@ const AppCard = ({
...
@@ -85,7 +85,7 @@ const AppCard = ({
size=
{
{
base
:
'
xs
'
,
sm
:
'
sm
'
}
}
size=
{
{
base
:
'
xs
'
,
sm
:
'
sm
'
}
}
fontWeight=
"semibold"
fontWeight=
"semibold"
>
>
<
AppCardLink
<
Marketplace
AppCardLink
id=
{
id
}
id=
{
id
}
url=
{
url
}
url=
{
url
}
external=
{
external
}
external=
{
external
}
...
@@ -158,4 +158,4 @@ const AppCard = ({
...
@@ -158,4 +158,4 @@ const AppCard = ({
);
);
};
};
export
default
React
.
memo
(
AppCard
);
export
default
React
.
memo
(
Marketplace
AppCard
);
ui/
apps/
AppCardLink.tsx
→
ui/
marketplace/Marketplace
AppCardLink.tsx
View file @
621f86f5
...
@@ -9,7 +9,7 @@ type Props = {
...
@@ -9,7 +9,7 @@ type Props = {
title
:
string
;
title
:
string
;
}
}
const
App
Link
=
({
url
,
external
,
id
,
title
}:
Props
)
=>
{
const
MarketplaceAppCard
Link
=
({
url
,
external
,
id
,
title
}:
Props
)
=>
{
return
external
?
(
return
external
?
(
<
LinkOverlay
href=
{
url
}
isExternal=
{
true
}
>
<
LinkOverlay
href=
{
url
}
isExternal=
{
true
}
>
{
title
}
{
title
}
...
@@ -23,4 +23,4 @@ const AppLink = ({ url, external, id, title }: Props) => {
...
@@ -23,4 +23,4 @@ const AppLink = ({ url, external, id, title }: Props) => {
);
);
};
};
export
default
App
Link
;
export
default
MarketplaceAppCard
Link
;
ui/
apps/
AppCardSkeleton.tsx
→
ui/
marketplace/Marketplace
AppCardSkeleton.tsx
View file @
621f86f5
import
{
Box
,
Heading
,
Skeleton
,
SkeletonCircle
,
useColorModeValue
}
from
'
@chakra-ui/react
'
;
import
{
Box
,
Heading
,
Skeleton
,
SkeletonCircle
,
useColorModeValue
}
from
'
@chakra-ui/react
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
export
const
AppCardSkeleton
=
()
=>
{
const
Marketplace
AppCardSkeleton
=
()
=>
{
return
(
return
(
<
Box
<
Box
borderRadius=
"md"
borderRadius=
"md"
...
@@ -43,3 +43,5 @@ export const AppCardSkeleton = () => {
...
@@ -43,3 +43,5 @@ export const AppCardSkeleton = () => {
</
Box
>
</
Box
>
);
);
};
};
export
default
MarketplaceAppCardSkeleton
;
ui/
apps/
AppModal.tsx
→
ui/
marketplace/Marketplace
AppModal.tsx
View file @
621f86f5
...
@@ -4,7 +4,7 @@ import {
...
@@ -4,7 +4,7 @@ import {
}
from
'
@chakra-ui/react
'
;
}
from
'
@chakra-ui/react
'
;
import
React
,
{
useCallback
}
from
'
react
'
;
import
React
,
{
useCallback
}
from
'
react
'
;
import
type
{
AppItemOverview
}
from
'
types/client/apps
'
;
import
type
{
MarketplaceAppOverview
}
from
'
types/client/marketplace
'
;
import
linkIcon
from
'
icons/link.svg
'
;
import
linkIcon
from
'
icons/link.svg
'
;
import
ghIcon
from
'
icons/social/git.svg
'
;
import
ghIcon
from
'
icons/social/git.svg
'
;
...
@@ -15,16 +15,16 @@ import starOutlineIcon from 'icons/star_outline.svg';
...
@@ -15,16 +15,16 @@ import starOutlineIcon from 'icons/star_outline.svg';
import
useIsMobile
from
'
lib/hooks/useIsMobile
'
;
import
useIsMobile
from
'
lib/hooks/useIsMobile
'
;
import
{
nbsp
}
from
'
lib/html-entities
'
;
import
{
nbsp
}
from
'
lib/html-entities
'
;
import
AppModalLink
from
'
./
AppModalLink
'
;
import
MarketplaceAppModalLink
from
'
./Marketplace
AppModalLink
'
;
type
Props
=
{
type
Props
=
{
onClose
:
()
=>
void
;
onClose
:
()
=>
void
;
isFavorite
:
boolean
;
isFavorite
:
boolean
;
onFavoriteClick
:
(
id
:
string
,
isFavorite
:
boolean
)
=>
void
;
onFavoriteClick
:
(
id
:
string
,
isFavorite
:
boolean
)
=>
void
;
data
:
AppItem
Overview
;
data
:
MarketplaceApp
Overview
;
}
}
const
AppModal
=
({
const
Marketplace
AppModal
=
({
onClose
,
onClose
,
isFavorite
,
isFavorite
,
onFavoriteClick
,
onFavoriteClick
,
...
@@ -120,7 +120,7 @@ const AppModal = ({
...
@@ -120,7 +120,7 @@ const AppModal = ({
marginTop=
{
{
base
:
6
,
sm
:
0
}
}
marginTop=
{
{
base
:
6
,
sm
:
0
}
}
>
>
<
Box
display=
"flex"
>
<
Box
display=
"flex"
>
<
AppModalLink
<
Marketplace
AppModalLink
id=
{
data
.
id
}
id=
{
data
.
id
}
url=
{
url
}
url=
{
url
}
external=
{
external
}
external=
{
external
}
...
@@ -241,4 +241,4 @@ const AppModal = ({
...
@@ -241,4 +241,4 @@ const AppModal = ({
);
);
};
};
export
default
AppModal
;
export
default
Marketplace
AppModal
;
ui/
apps/
AppModalLink.tsx
→
ui/
marketplace/Marketplace
AppModalLink.tsx
View file @
621f86f5
...
@@ -9,7 +9,7 @@ type Props = {
...
@@ -9,7 +9,7 @@ type Props = {
title
:
string
;
title
:
string
;
}
}
const
AppModalLink
=
({
url
,
external
,
id
}:
Props
)
=>
{
const
Marketplace
AppModalLink
=
({
url
,
external
,
id
}:
Props
)
=>
{
const
buttonProps
=
{
const
buttonProps
=
{
size
:
'
sm
'
,
size
:
'
sm
'
,
marginRight
:
2
,
marginRight
:
2
,
...
@@ -36,4 +36,4 @@ const AppModalLink = ({ url, external, id }: Props) => {
...
@@ -36,4 +36,4 @@ const AppModalLink = ({ url, external, id }: Props) => {
);
);
};
};
export
default
AppModalLink
;
export
default
Marketplace
AppModalLink
;
ui/
apps/
CategoriesMenu.tsx
→
ui/
marketplace/Marketplace
CategoriesMenu.tsx
View file @
621f86f5
import
{
Box
,
Button
,
Icon
,
Menu
,
MenuButton
,
MenuList
}
from
'
@chakra-ui/react
'
;
import
{
Box
,
Button
,
Icon
,
Menu
,
MenuButton
,
MenuList
}
from
'
@chakra-ui/react
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
{
AppCategory
}
from
'
types/client/apps
'
;
import
{
MarketplaceCategory
}
from
'
types/client/marketplace
'
;
import
eastMiniArrowIcon
from
'
icons/arrows/east-mini.svg
'
;
import
eastMiniArrowIcon
from
'
icons/arrows/east-mini.svg
'
;
import
CategoriesMenuItem
from
'
./
CategoriesMenuItem
'
;
import
MarketplaceCategoriesMenuItem
from
'
./Marketplace
CategoriesMenuItem
'
;
type
Props
=
{
type
Props
=
{
categories
:
Array
<
string
>
;
categories
:
Array
<
string
>
;
...
@@ -13,10 +13,10 @@ type Props = {
...
@@ -13,10 +13,10 @@ type Props = {
onSelect
:
(
category
:
string
)
=>
void
;
onSelect
:
(
category
:
string
)
=>
void
;
}
}
const
CategoriesMenu
=
({
selectedCategoryId
,
onSelect
,
categories
}:
Props
)
=>
{
const
Marketplace
CategoriesMenu
=
({
selectedCategoryId
,
onSelect
,
categories
}:
Props
)
=>
{
const
options
=
React
.
useMemo
(()
=>
([
const
options
=
React
.
useMemo
(()
=>
([
App
Category
.
FAVORITES
,
Marketplace
Category
.
FAVORITES
,
App
Category
.
ALL
,
Marketplace
Category
.
ALL
,
...
categories
,
...
categories
,
]),
[
categories
]);
]),
[
categories
]);
...
@@ -43,7 +43,7 @@ const CategoriesMenu = ({ selectedCategoryId, onSelect, categories }: Props) =>
...
@@ -43,7 +43,7 @@ const CategoriesMenu = ({ selectedCategoryId, onSelect, categories }: Props) =>
<
MenuList
zIndex=
{
3
}
>
<
MenuList
zIndex=
{
3
}
>
{
options
.
map
((
category
:
string
)
=>
(
{
options
.
map
((
category
:
string
)
=>
(
<
CategoriesMenuItem
<
Marketplace
CategoriesMenuItem
key=
{
category
}
key=
{
category
}
id=
{
category
}
id=
{
category
}
onClick=
{
onSelect
}
onClick=
{
onSelect
}
...
@@ -54,4 +54,4 @@ const CategoriesMenu = ({ selectedCategoryId, onSelect, categories }: Props) =>
...
@@ -54,4 +54,4 @@ const CategoriesMenu = ({ selectedCategoryId, onSelect, categories }: Props) =>
);
);
};
};
export
default
React
.
memo
(
CategoriesMenu
);
export
default
React
.
memo
(
Marketplace
CategoriesMenu
);
ui/
apps/
CategoriesMenuItem.tsx
→
ui/
marketplace/Marketplace
CategoriesMenuItem.tsx
View file @
621f86f5
...
@@ -2,7 +2,7 @@ import { Icon, MenuItem } from '@chakra-ui/react';
...
@@ -2,7 +2,7 @@ import { Icon, MenuItem } from '@chakra-ui/react';
import
type
{
FunctionComponent
,
SVGAttributes
}
from
'
react
'
;
import
type
{
FunctionComponent
,
SVGAttributes
}
from
'
react
'
;
import
React
,
{
useCallback
}
from
'
react
'
;
import
React
,
{
useCallback
}
from
'
react
'
;
import
{
AppCategory
}
from
'
types/client/apps
'
;
import
{
MarketplaceCategory
}
from
'
types/client/marketplace
'
;
import
starFilledIcon
from
'
icons/star_filled.svg
'
;
import
starFilledIcon
from
'
icons/star_filled.svg
'
;
...
@@ -12,10 +12,10 @@ type Props = {
...
@@ -12,10 +12,10 @@ type Props = {
}
}
const
ICONS
:
Record
<
string
,
FunctionComponent
<
SVGAttributes
<
SVGElement
>>>
=
{
const
ICONS
:
Record
<
string
,
FunctionComponent
<
SVGAttributes
<
SVGElement
>>>
=
{
[
App
Category
.
FAVORITES
]:
starFilledIcon
,
[
Marketplace
Category
.
FAVORITES
]:
starFilledIcon
,
};
};
const
CategoriesMenuItem
=
({
id
,
onClick
}:
Props
)
=>
{
const
Marketplace
CategoriesMenuItem
=
({
id
,
onClick
}:
Props
)
=>
{
const
handleSelection
=
useCallback
(()
=>
{
const
handleSelection
=
useCallback
(()
=>
{
onClick
(
id
);
onClick
(
id
);
},
[
id
,
onClick
]);
},
[
id
,
onClick
]);
...
@@ -33,4 +33,4 @@ const CategoriesMenuItem = ({ id, onClick }: Props) => {
...
@@ -33,4 +33,4 @@ const CategoriesMenuItem = ({ id, onClick }: Props) => {
);
);
};
};
export
default
CategoriesMenuItem
;
export
default
Marketplace
CategoriesMenuItem
;
ui/
apps/App
List.tsx
→
ui/
marketplace/Marketplace
List.tsx
View file @
621f86f5
import
{
Grid
,
GridItem
}
from
'
@chakra-ui/react
'
;
import
{
Grid
,
GridItem
}
from
'
@chakra-ui/react
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
type
{
AppItemPreview
}
from
'
types/client/apps
'
;
import
type
{
MarketplaceAppPreview
}
from
'
types/client/marketplace
'
;
import
{
apos
}
from
'
lib/html-entities
'
;
import
{
apos
}
from
'
lib/html-entities
'
;
import
AppCard
from
'
ui/apps/AppCard
'
;
import
EmptySearchResult
from
'
ui/shared/EmptySearchResult
'
;
import
EmptySearchResult
from
'
ui/apps/EmptySearchResult
'
;
import
MarketplaceAppCard
from
'
./MarketplaceAppCard
'
;
type
Props
=
{
type
Props
=
{
apps
:
Array
<
AppItem
Preview
>
;
apps
:
Array
<
MarketplaceApp
Preview
>
;
onAppClick
:
(
id
:
string
)
=>
void
;
onAppClick
:
(
id
:
string
)
=>
void
;
favoriteApps
:
Array
<
string
>
;
favoriteApps
:
Array
<
string
>
;
onFavoriteClick
:
(
id
:
string
,
isFavorite
:
boolean
)
=>
void
;
onFavoriteClick
:
(
id
:
string
,
isFavorite
:
boolean
)
=>
void
;
}
}
const
App
List
=
({
apps
,
onAppClick
,
favoriteApps
,
onFavoriteClick
}:
Props
)
=>
{
const
Marketplace
List
=
({
apps
,
onAppClick
,
favoriteApps
,
onFavoriteClick
}:
Props
)
=>
{
return
apps
.
length
>
0
?
(
return
apps
.
length
>
0
?
(
<
Grid
<
Grid
templateColumns=
{
{
templateColumns=
{
{
...
@@ -28,7 +29,7 @@ const AppList = ({ apps, onAppClick, favoriteApps, onFavoriteClick }: Props) =>
...
@@ -28,7 +29,7 @@ const AppList = ({ apps, onAppClick, favoriteApps, onFavoriteClick }: Props) =>
<
GridItem
<
GridItem
key=
{
app
.
id
}
key=
{
app
.
id
}
>
>
<
AppCard
<
Marketplace
AppCard
onInfoClick=
{
onAppClick
}
onInfoClick=
{
onAppClick
}
id=
{
app
.
id
}
id=
{
app
.
id
}
external=
{
app
.
external
}
external=
{
app
.
external
}
...
@@ -48,4 +49,4 @@ const AppList = ({ apps, onAppClick, favoriteApps, onFavoriteClick }: Props) =>
...
@@ -48,4 +49,4 @@ const AppList = ({ apps, onAppClick, favoriteApps, onFavoriteClick }: Props) =>
);
);
};
};
export
default
React
.
memo
(
App
List
);
export
default
React
.
memo
(
Marketplace
List
);
ui/
apps/App
ListSkeleton.tsx
→
ui/
marketplace/Marketplace
ListSkeleton.tsx
View file @
621f86f5
import
{
Grid
,
GridItem
}
from
'
@chakra-ui/react
'
;
import
{
Grid
,
GridItem
}
from
'
@chakra-ui/react
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
{
AppCardSkeleton
}
from
'
ui/apps/
AppCardSkeleton
'
;
import
MarketplaceAppCardSkeleton
from
'
./Marketplace
AppCardSkeleton
'
;
const
applicationStubs
=
[
...
Array
(
12
)
];
const
applicationStubs
=
[
...
Array
(
12
)
];
const
App
ListSkeleton
=
()
=>
{
const
Marketplace
ListSkeleton
=
()
=>
{
return
(
return
(
<
Grid
<
Grid
templateColumns=
{
{
templateColumns=
{
{
...
@@ -19,11 +19,11 @@ const AppListSkeleton = () => {
...
@@ -19,11 +19,11 @@ const AppListSkeleton = () => {
<
GridItem
<
GridItem
key=
{
index
}
key=
{
index
}
>
>
<
AppCardSkeleton
/>
<
Marketplace
AppCardSkeleton
/>
</
GridItem
>
</
GridItem
>
))
}
))
}
</
Grid
>
</
Grid
>
);
);
};
};
export
default
App
ListSkeleton
;
export
default
Marketplace
ListSkeleton
;
ui/
apps/useMarketplaceApps
.tsx
→
ui/
marketplace/useMarketplace
.tsx
View file @
621f86f5
...
@@ -2,8 +2,8 @@ import { useQuery } from '@tanstack/react-query';
...
@@ -2,8 +2,8 @@ import { useQuery } from '@tanstack/react-query';
import
_unique
from
'
lodash/uniq
'
;
import
_unique
from
'
lodash/uniq
'
;
import
React
,
{
useCallback
,
useEffect
,
useState
}
from
'
react
'
;
import
React
,
{
useCallback
,
useEffect
,
useState
}
from
'
react
'
;
import
type
{
AppItemOverview
}
from
'
types/client/apps
'
;
import
type
{
MarketplaceAppOverview
}
from
'
types/client/marketplace
'
;
import
{
AppCategory
}
from
'
types/client/apps
'
;
import
{
MarketplaceCategory
}
from
'
types/client/marketplace
'
;
import
appConfig
from
'
configs/app/config
'
;
import
appConfig
from
'
configs/app/config
'
;
import
type
{
ResourceError
}
from
'
lib/api/resources
'
;
import
type
{
ResourceError
}
from
'
lib/api/resources
'
;
...
@@ -20,28 +20,28 @@ function getFavoriteApps() {
...
@@ -20,28 +20,28 @@ function getFavoriteApps() {
}
}
}
}
function
isAppNameMatches
(
q
:
string
,
app
:
AppItem
Overview
)
{
function
isAppNameMatches
(
q
:
string
,
app
:
MarketplaceApp
Overview
)
{
return
app
.
title
.
toLowerCase
().
includes
(
q
.
toLowerCase
());
return
app
.
title
.
toLowerCase
().
includes
(
q
.
toLowerCase
());
}
}
function
isAppCategoryMatches
(
category
:
string
,
app
:
AppItem
Overview
,
favoriteApps
:
Array
<
string
>
)
{
function
isAppCategoryMatches
(
category
:
string
,
app
:
MarketplaceApp
Overview
,
favoriteApps
:
Array
<
string
>
)
{
return
category
===
App
Category
.
ALL
||
return
category
===
Marketplace
Category
.
ALL
||
(
category
===
App
Category
.
FAVORITES
&&
favoriteApps
.
includes
(
app
.
id
))
||
(
category
===
Marketplace
Category
.
FAVORITES
&&
favoriteApps
.
includes
(
app
.
id
))
||
app
.
categories
.
includes
(
category
);
app
.
categories
.
includes
(
category
);
}
}
export
default
function
useMarketplace
Apps
()
{
export
default
function
useMarketplace
()
{
const
[
selectedAppId
,
setSelectedAppId
]
=
useState
<
string
|
null
>
(
null
);
const
[
selectedAppId
,
setSelectedAppId
]
=
useState
<
string
|
null
>
(
null
);
const
[
selectedCategoryId
,
setSelectedCategoryId
]
=
useState
<
string
>
(
App
Category
.
ALL
);
const
[
selectedCategoryId
,
setSelectedCategoryId
]
=
useState
<
string
>
(
Marketplace
Category
.
ALL
);
const
[
filterQuery
,
setFilterQuery
]
=
useState
(
''
);
const
[
filterQuery
,
setFilterQuery
]
=
useState
(
''
);
const
[
favoriteApps
,
setFavoriteApps
]
=
useState
<
Array
<
string
>>
([]);
const
[
favoriteApps
,
setFavoriteApps
]
=
useState
<
Array
<
string
>>
([]);
const
apiFetch
=
useApiFetch
();
const
apiFetch
=
useApiFetch
();
const
{
isLoading
,
isError
,
error
,
data
}
=
useQuery
<
unknown
,
ResourceError
<
unknown
>
,
Array
<
AppItem
Overview
>>
(
const
{
isLoading
,
isError
,
error
,
data
}
=
useQuery
<
unknown
,
ResourceError
<
unknown
>
,
Array
<
MarketplaceApp
Overview
>>
(
[
'
marketplace-apps
'
],
[
'
marketplace-apps
'
],
async
()
=>
apiFetch
(
appConfig
.
marketplaceConfigUrl
||
''
),
async
()
=>
apiFetch
(
appConfig
.
marketplaceConfigUrl
||
''
),
{
{
select
:
(
data
)
=>
(
data
as
Array
<
AppItem
Overview
>
).
sort
((
a
,
b
)
=>
a
.
title
.
localeCompare
(
b
.
title
)),
select
:
(
data
)
=>
(
data
as
Array
<
MarketplaceApp
Overview
>
).
sort
((
a
,
b
)
=>
a
.
title
.
localeCompare
(
b
.
title
)),
});
});
const
handleFavoriteClick
=
useCallback
((
id
:
string
,
isFavorite
:
boolean
)
=>
{
const
handleFavoriteClick
=
useCallback
((
id
:
string
,
isFavorite
:
boolean
)
=>
{
...
...
ui/pages/
Apps
.tsx
→
ui/pages/
Marketplace
.tsx
View file @
621f86f5
...
@@ -3,15 +3,15 @@ import React from 'react';
...
@@ -3,15 +3,15 @@ import React from 'react';
import
config
from
'
configs/app/config
'
;
import
config
from
'
configs/app/config
'
;
import
PlusIcon
from
'
icons/plus.svg
'
;
import
PlusIcon
from
'
icons/plus.svg
'
;
import
AppList
from
'
ui/apps/AppList
'
;
import
MarketplaceAppModal
from
'
ui/marketplace/MarketplaceAppModal
'
;
import
AppListSkeleton
from
'
ui/apps/AppListSkeleton
'
;
import
MarketplaceCategoriesMenu
from
'
ui/marketplace/MarketplaceCategoriesMenu
'
;
import
AppModal
from
'
ui/apps/AppModal
'
;
import
MarketplaceList
from
'
ui/marketplace/MarketplaceList
'
;
import
CategoriesMenu
from
'
ui/apps/CategoriesMenu
'
;
import
MarketplaceListSkeleton
from
'
ui/marketplace/MarketplaceListSkeleton
'
;
import
FilterInput
from
'
ui/shared/filters/FilterInput
'
;
import
FilterInput
from
'
ui/shared/filters/FilterInput
'
;
import
useMarketplace
Apps
from
'
../apps/useMarketplaceApps
'
;
import
useMarketplace
from
'
../marketplace/useMarketplace
'
;
const
Apps
=
()
=>
{
const
Marketplace
=
()
=>
{
const
{
const
{
isLoading
,
isLoading
,
isError
,
isError
,
...
@@ -26,7 +26,7 @@ const Apps = () => {
...
@@ -26,7 +26,7 @@ const Apps = () => {
clearSelectedAppId
,
clearSelectedAppId
,
favoriteApps
,
favoriteApps
,
onFavoriteClick
,
onFavoriteClick
,
}
=
useMarketplace
Apps
();
}
=
useMarketplace
();
if
(
isError
)
{
if
(
isError
)
{
throw
new
Error
(
'
Unable to get apps list
'
,
{
cause
:
error
});
throw
new
Error
(
'
Unable to get apps list
'
,
{
cause
:
error
});
...
@@ -40,7 +40,7 @@ const Apps = () => {
...
@@ -40,7 +40,7 @@ const Apps = () => {
display=
"flex"
display=
"flex"
flexDirection=
{
{
base
:
'
column
'
,
sm
:
'
row
'
}
}
flexDirection=
{
{
base
:
'
column
'
,
sm
:
'
row
'
}
}
>
>
<
CategoriesMenu
<
Marketplace
CategoriesMenu
categories=
{
categories
}
categories=
{
categories
}
selectedCategoryId=
{
selectedCategoryId
}
selectedCategoryId=
{
selectedCategoryId
}
onSelect=
{
onCategoryChange
}
onSelect=
{
onCategoryChange
}
...
@@ -49,8 +49,8 @@ const Apps = () => {
...
@@ -49,8 +49,8 @@ const Apps = () => {
<
FilterInput
onChange=
{
onSearchInputChange
}
marginBottom=
{
{
base
:
'
4
'
,
lg
:
'
6
'
}
}
placeholder=
"Find app"
/>
<
FilterInput
onChange=
{
onSearchInputChange
}
marginBottom=
{
{
base
:
'
4
'
,
lg
:
'
6
'
}
}
placeholder=
"Find app"
/>
</
Box
>
</
Box
>
{
isLoading
?
<
App
ListSkeleton
/>
:
(
{
isLoading
?
<
Marketplace
ListSkeleton
/>
:
(
<
App
List
<
Marketplace
List
apps=
{
displayedApps
}
apps=
{
displayedApps
}
onAppClick=
{
showAppInfo
}
onAppClick=
{
showAppInfo
}
favoriteApps=
{
favoriteApps
}
favoriteApps=
{
favoriteApps
}
...
@@ -59,7 +59,7 @@ const Apps = () => {
...
@@ -59,7 +59,7 @@ const Apps = () => {
)
}
)
}
{
selectedApp
&&
(
{
selectedApp
&&
(
<
AppModal
<
Marketplace
AppModal
onClose=
{
clearSelectedAppId
}
onClose=
{
clearSelectedAppId
}
isFavorite=
{
favoriteApps
.
includes
(
selectedApp
.
id
)
}
isFavorite=
{
favoriteApps
.
includes
(
selectedApp
.
id
)
}
onFavoriteClick=
{
onFavoriteClick
}
onFavoriteClick=
{
onFavoriteClick
}
...
@@ -90,4 +90,4 @@ const Apps = () => {
...
@@ -90,4 +90,4 @@ const Apps = () => {
);
);
};
};
export
default
Apps
;
export
default
Marketplace
;
ui/pages/MarketplaceApp.tsx
View file @
621f86f5
...
@@ -4,7 +4,7 @@ import { useRouter } from 'next/router';
...
@@ -4,7 +4,7 @@ import { useRouter } from 'next/router';
import
{
route
}
from
'
nextjs-routes
'
;
import
{
route
}
from
'
nextjs-routes
'
;
import
React
,
{
useCallback
,
useEffect
,
useRef
,
useState
}
from
'
react
'
;
import
React
,
{
useCallback
,
useEffect
,
useRef
,
useState
}
from
'
react
'
;
import
type
{
AppItemOverview
}
from
'
types/client/apps
'
;
import
type
{
MarketplaceAppOverview
}
from
'
types/client/marketplace
'
;
import
appConfig
from
'
configs/app/config
'
;
import
appConfig
from
'
configs/app/config
'
;
import
type
{
ResourceError
}
from
'
lib/api/resources
'
;
import
type
{
ResourceError
}
from
'
lib/api/resources
'
;
...
@@ -26,15 +26,15 @@ const MarketplaceApp = () => {
...
@@ -26,15 +26,15 @@ const MarketplaceApp = () => {
const
router
=
useRouter
();
const
router
=
useRouter
();
const
id
=
getQueryParamString
(
router
.
query
.
id
);
const
id
=
getQueryParamString
(
router
.
query
.
id
);
const
{
isLoading
,
isError
,
error
,
data
}
=
useQuery
<
unknown
,
ResourceError
<
unknown
>
,
AppItem
Overview
>
(
const
{
isLoading
,
isError
,
error
,
data
}
=
useQuery
<
unknown
,
ResourceError
<
unknown
>
,
MarketplaceApp
Overview
>
(
[
'
marketplace-apps
'
,
id
],
[
'
marketplace-apps
'
,
id
],
async
()
=>
{
async
()
=>
{
const
result
=
await
apiFetch
<
Array
<
AppItem
Overview
>
,
unknown
>
(
appConfig
.
marketplaceConfigUrl
||
''
);
const
result
=
await
apiFetch
<
Array
<
MarketplaceApp
Overview
>
,
unknown
>
(
appConfig
.
marketplaceConfigUrl
||
''
);
if
(
!
Array
.
isArray
(
result
))
{
if
(
!
Array
.
isArray
(
result
))
{
throw
result
;
throw
result
;
}
}
const
item
=
result
.
find
((
app
:
AppItem
Overview
)
=>
app
.
id
===
id
);
const
item
=
result
.
find
((
app
:
MarketplaceApp
Overview
)
=>
app
.
id
===
id
);
if
(
!
item
)
{
if
(
!
item
)
{
throw
{
status
:
404
};
throw
{
status
:
404
};
}
}
...
...
ui/shared/DataListDisplay.tsx
View file @
621f86f5
import
{
Box
,
Text
,
chakra
}
from
'
@chakra-ui/react
'
;
import
{
Box
,
Text
,
chakra
}
from
'
@chakra-ui/react
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
EmptySearchResult
from
'
ui/
apps
/EmptySearchResult
'
;
import
EmptySearchResult
from
'
ui/
shared
/EmptySearchResult
'
;
import
DataFetchAlert
from
'
./DataFetchAlert
'
;
import
DataFetchAlert
from
'
./DataFetchAlert
'
;
import
SkeletonList
from
'
./skeletons/SkeletonList
'
;
import
SkeletonList
from
'
./skeletons/SkeletonList
'
;
...
...
ui/
apps
/EmptySearchResult.tsx
→
ui/
shared
/EmptySearchResult.tsx
View file @
621f86f5
File moved
ui/stats/ChartsWidgetsList.tsx
View file @
621f86f5
...
@@ -5,9 +5,9 @@ import type { StatsChartsSection } from 'types/api/stats';
...
@@ -5,9 +5,9 @@ import type { StatsChartsSection } from 'types/api/stats';
import
type
{
StatsIntervalIds
}
from
'
types/client/stats
'
;
import
type
{
StatsIntervalIds
}
from
'
types/client/stats
'
;
import
{
apos
}
from
'
lib/html-entities
'
;
import
{
apos
}
from
'
lib/html-entities
'
;
import
ChartWidgetSkeleton
from
'
ui/shared/chart/ChartWidgetSkeleton
'
;
import
EmptySearchResult
from
'
ui/shared/EmptySearchResult
'
;
import
EmptySearchResult
from
'
../apps/EmptySearchResult
'
;
import
ChartWidgetSkeleton
from
'
../shared/chart/ChartWidgetSkeleton
'
;
import
ChartsLoadingErrorAlert
from
'
./ChartsLoadingErrorAlert
'
;
import
ChartsLoadingErrorAlert
from
'
./ChartsLoadingErrorAlert
'
;
import
ChartWidgetContainer
from
'
./ChartWidgetContainer
'
;
import
ChartWidgetContainer
from
'
./ChartWidgetContainer
'
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment