Skip to content

Commit 35bf110

Browse files
committed
List extensions from marketplace
1 parent 8ebf3d9 commit 35bf110

File tree

1 file changed

+117
-78
lines changed

1 file changed

+117
-78
lines changed

web/components/modals/extension-modal.tsx

Lines changed: 117 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,121 @@ import ContextMenu from "../interface/context-menu";
1818
import Tabs from "../misc/tabs";
1919
import { EditorContext } from "../providers/editor-context-provider";
2020

21+
export default function ExtensionModal({
22+
isOpen,
23+
setIsOpen,
24+
}: {
25+
isOpen: boolean;
26+
setIsOpen: (open: boolean) => void;
27+
}) {
28+
const {} = useExtensions();
29+
const { platformApi } = usePlatformApi();
30+
31+
const [recommendedExtensions, setRecommendedExtensions] = useState<
32+
Extension[]
33+
>([]);
34+
const [marketplaceExtensions, setMarketplaceExtensions] = useState<
35+
Extension[]
36+
>([]);
37+
const [installedExtensions, setInstalledExtensions] = useState<Extension[]>(
38+
[],
39+
);
40+
41+
const extensionCategories: TabItem[] = [
42+
{
43+
name: "Recommended",
44+
description: "Recommended extensions",
45+
},
46+
{
47+
name: "Marketplace",
48+
description: "Browse the marketplace",
49+
},
50+
{
51+
name: "Installed",
52+
description: "Installed extensions",
53+
},
54+
];
55+
56+
const [selectedCategory, setSelectedCategory] = useState<TabItem | undefined>(
57+
extensionCategories[1],
58+
);
59+
60+
const editorContext = useContext(EditorContext);
61+
62+
useEffect(() => {
63+
if (isOpen) {
64+
setInstalledExtensions(editorContext?.persistSettings?.extensions ?? []);
65+
}
66+
}, [isOpen, editorContext?.persistSettings?.extensions]);
67+
68+
useEffect(() => {
69+
if (selectedCategory?.name === "Marketplace") {
70+
console.log("Fetching marketplace extensions...");
71+
fetch("https://pulse-editor.com/api/extension/list")
72+
.then((res) => res.json())
73+
.then((data) => {
74+
const fechtedExts: {
75+
name: string;
76+
version: string;
77+
user: {
78+
name: string;
79+
};
80+
org: {
81+
name: string;
82+
};
83+
}[] = data;
84+
85+
const extensions: Extension[] = fechtedExts.map((ext) => {
86+
return {
87+
config: {
88+
id: ext.name,
89+
version: ext.version,
90+
author: ext.user ? ext.user.name : ext.org.name,
91+
},
92+
isEnabled: false,
93+
remoteOrigin: `https://cdn.pulse-editor.com/extension`,
94+
};
95+
});
96+
setMarketplaceExtensions(extensions);
97+
});
98+
}
99+
}, [selectedCategory]);
100+
101+
useEffect(() => {
102+
console.log("Fetched extensions: ", marketplaceExtensions);
103+
}, [marketplaceExtensions]);
104+
105+
return (
106+
<ModalWrapper
107+
isOpen={isOpen}
108+
setIsOpen={setIsOpen}
109+
title={"Extension Marketplace"}
110+
>
111+
<div className="h-full w-full space-y-2 overflow-y-auto px-2">
112+
<div className="flex justify-center">
113+
{isOpen && (
114+
<Tabs
115+
tabItems={extensionCategories}
116+
selectedItem={selectedCategory}
117+
setSelectedItem={setSelectedCategory}
118+
/>
119+
)}
120+
</div>
121+
122+
<ExtensionListView
123+
extensions={
124+
selectedCategory?.name === "Recommended"
125+
? recommendedExtensions
126+
: selectedCategory?.name === "Marketplace"
127+
? marketplaceExtensions
128+
: installedExtensions
129+
}
130+
/>
131+
</div>
132+
</ModalWrapper>
133+
);
134+
}
135+
21136
function EnableCheckBox({
22137
isEnabled,
23138
toggleExtension,
@@ -114,7 +229,7 @@ function ExtensionPreview({ extension }: { extension: Extension }) {
114229
return (
115230
<div className="w-full">
116231
<div className="relative h-28 w-full">
117-
<div className="absolute right-0.5 top-0 z-10">
232+
<div className="absolute top-0 right-0.5 z-10">
118233
<EnableCheckBox
119234
isEnabled={isEnabled}
120235
toggleExtension={toggleExtension}
@@ -139,7 +254,7 @@ function ExtensionPreview({ extension }: { extension: Extension }) {
139254
<ContextMenu state={contextMenuState} setState={setContextMenuState}>
140255
<div className="flex flex-col">
141256
<Button
142-
className="h-12 text-medium sm:h-8 sm:text-sm"
257+
className="text-medium h-12 sm:h-8 sm:text-sm"
143258
variant="light"
144259
onPress={(e) => {
145260
uninstallExtension(extension.config.id).then(() => {
@@ -179,79 +294,3 @@ function ExtensionListView({ extensions }: { extensions: Extension[] }) {
179294
</>
180295
);
181296
}
182-
183-
export default function ExtensionModal({
184-
isOpen,
185-
setIsOpen,
186-
}: {
187-
isOpen: boolean;
188-
setIsOpen: (open: boolean) => void;
189-
}) {
190-
const {} = useExtensions();
191-
const { platformApi } = usePlatformApi();
192-
193-
const [recommendedExtensions, setRecommendedExtensions] = useState<
194-
Extension[]
195-
>([]);
196-
const [allExtensions, setAllExtensions] = useState<Extension[]>([]);
197-
const [installedExtensions, setInstalledExtensions] = useState<Extension[]>(
198-
[],
199-
);
200-
201-
const extensionCategories: TabItem[] = [
202-
{
203-
name: "Recommended",
204-
description: "Recommended extensions",
205-
},
206-
{
207-
name: "All",
208-
description: "All extensions",
209-
},
210-
{
211-
name: "Installed",
212-
description: "Installed extensions",
213-
},
214-
];
215-
216-
const [selectedCategory, setSelectedCategory] = useState<TabItem | undefined>(
217-
extensionCategories[2],
218-
);
219-
220-
const editorContext = useContext(EditorContext);
221-
222-
useEffect(() => {
223-
if (isOpen) {
224-
setInstalledExtensions(editorContext?.persistSettings?.extensions ?? []);
225-
}
226-
}, [isOpen, editorContext?.persistSettings?.extensions]);
227-
228-
return (
229-
<ModalWrapper
230-
isOpen={isOpen}
231-
setIsOpen={setIsOpen}
232-
title={"Extension Marketplace"}
233-
>
234-
<div className="h-full w-full space-y-2 overflow-y-auto px-2">
235-
<div className="flex justify-center">
236-
{isOpen && (
237-
<Tabs
238-
tabItems={extensionCategories}
239-
selectedItem={selectedCategory}
240-
setSelectedItem={setSelectedCategory}
241-
/>
242-
)}
243-
</div>
244-
245-
<ExtensionListView
246-
extensions={
247-
selectedCategory?.name === "Recommended"
248-
? recommendedExtensions
249-
: selectedCategory?.name === "All"
250-
? allExtensions
251-
: installedExtensions
252-
}
253-
/>
254-
</div>
255-
</ModalWrapper>
256-
);
257-
}

0 commit comments

Comments
 (0)