@@ -18,6 +18,121 @@ import ContextMenu from "../interface/context-menu";
1818import Tabs from "../misc/tabs" ;
1919import { 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+
21136function 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