import React from 'react'; import WifiOffIcon from '@material-ui/icons/WifiOff'; import LocalMallIcon from '@material-ui/icons/LocalMall'; import Item from '../Item'; import Items from '../Items'; import Dropdown from '../../settings/Dropdown'; import MarketplaceFunctions from '../../../../../modules/helpers/marketplace'; import { toast } from 'react-toastify'; export default class Marketplace extends React.PureComponent { constructor() { super(); this.state = { items: [], button: '', featured: {}, done: false, item: {} }; this.buttons = { uninstall: , install: }; this.language = window.language.modals.main.marketplace; this.controller = new AbortController(); } async toggle(type, data) { if (type === 'item') { let info; // get item info try { info = await (await fetch(`${window.constants.MARKETPLACE_URL}/item/${this.props.type}/${data}`, { signal: this.controller.signal })).json(); } catch (e) { if (this.controller.signal.aborted === false) { return toast(window.language.toasts.error); } } if (this.controller.signal.aborted === true) { return; } // check if already installed let button = this.buttons.install; const installed = JSON.parse(localStorage.getItem('installed')); if (installed.some((item) => item.name === info.data.name)) { button = this.buttons.uninstall; } this.setState({ item: { type: info.data.type, display_name: info.data.name, author: info.data.author, description: MarketplaceFunctions.urlParser(info.data.description.replace(/\n/g, '
')), //updated: info.updated, version: info.data.version, icon: info.data.screenshot_url, data: info.data }, button: button }); window.stats.postEvent('marketplace-item', `${this.state.item.display_name} viewed`); } else { this.setState({ item: {} }); } } async getItems() { const { data } = await (await fetch(window.constants.MARKETPLACE_URL + '/items/' + this.props.type, { signal: this.controller.signal })).json(); const featured = await (await fetch(window.constants.MARKETPLACE_URL + '/featured', { signal: this.controller.signal })).json(); if (this.controller.signal.aborted === true) { return; } this.setState({ items: data, oldItems: data, featured: featured.data, done: true }); this.sortMarketplace(localStorage.getItem('sortMarketplace'), false); } manage(type) { if (type === 'install') { MarketplaceFunctions.install(this.state.item.type, this.state.item.data); } else { MarketplaceFunctions.uninstall(this.state.item.type, this.state.item.display_name); } toast(window.language.toasts[type + 'ed']); this.setState({ button: (type === 'install') ? this.buttons.uninstall : this.buttons.install }); window.stats.postEvent('marketplace-item', `${this.state.item.display_name} ${(type === 'install' ? 'installed': 'uninstalled')}`); window.stats.postEvent('marketplace', (type === 'install' ? 'Install': 'Uninstall')); } sortMarketplace(value, sendEvent) { let items = this.state.oldItems; switch (value) { case 'a-z': items.sort(); // fix sort not working sometimes if (this.state.sortType === 'z-a') { items.reverse(); } break; case 'z-a': items.sort(); items.reverse(); break; default: break; } this.setState({ items: items, sortType: value }); if (sendEvent) { window.stats.postEvent('marketplace', 'Sort'); } } componentDidMount() { if (navigator.onLine === false || localStorage.getItem('offlineMode') === 'true') { return; } this.getItems(); } componentWillUnmount() { // stop making requests this.controller.abort(); } render() { const errorMessage = (msg) => { return (
{msg}
); }; const featured = () => { const openFeatured = () => { window.stats.postEvent('marketplace', 'Featured clicked'); window.open(this.state.featured.buttonLink); } return (

{this.state.featured.title}

{this.state.featured.name}

); } if (navigator.onLine === false || localStorage.getItem('offlineMode') === 'true') { return errorMessage(<>

{this.language.offline.title}

{this.language.offline.description}

); } if (this.state.done === false) { return errorMessage(

{window.language.modals.main.loading}

); } if (this.state.items.length === 0) { return ( <> {featured()} {errorMessage(<>

{window.language.modals.main.addons.empty.title}

{this.language.no_items}

)} ) } if (this.state.item.display_name) { return this.toggle()}/>; } return ( <> {featured()}
this.sortMarketplace(value)}>
this.toggle('item', input)} /> ); } }