/* -------------------------------------------------------------------------- */ /* Libraries */ /* -------------------------------------------------------------------------- */ import React, { useEffect, useState } from "react"; /* -------------------------------------------------------------------------- */ /* Components */ /* -------------------------------------------------------------------------- */ import ServiceComponent from "components/containers/ServiceComponent"; import Switch from "components/controls/Switch"; import TextAction from "components/controls/TextAction"; import ThinSingleColumn from "components/layouts/ThinSingleColumn"; import { useServicesStore } from "services/data/servicesSlice"; import { useServicesViewModel } from "services/controller/servicesViewModel"; import _ from "lodash"; import { useUIStore } from "ui/data/uiSlice"; import { useSubscriptionsStore } from "subscriptions/data/subscriptionsSlice"; import { useSubscriptionsViewModel } from "subscriptions/controller/subscriptionsViewModel"; import { Service } from "services/domain/serviceEntity"; import PasswordConfirmation from "user/views/PasswordConfirmation"; import CircleLoader from "components/CircleLoader"; import Failure from "core/failure"; /* -------------------------------------------------------------------------- */ /* Component */ /* -------------------------------------------------------------------------- */ const Services = () => { const [password, setPassword] = useState(); const [confirmShown, toggleConfirm] = useState(false); const [selectedService, setSelectedService] = useState< Service["id"] | null >(); /* ---------------------------------- Store --------------------------------- */ const servicesStore = useServicesStore(); const uiStore = useUIStore(); const subscriptionsStore = useSubscriptionsStore(); const { services, isLoading, loadServices } = useServicesViewModel({ ...servicesStore, notify: uiStore.notify, }); const { hasSubscription, subscribe, processingSubscription } = useSubscriptionsViewModel(subscriptionsStore, uiStore); /* ---------------------------------- Hooks --------------------------------- */ useEffect(() => { loadServices(); }, [loadServices]); useEffect(() => { if(!selectedService || password) return; toggleConfirm(true); }, [selectedService, password]); useEffect(() => { if (!selectedService) { return; } if (hasSubscription(selectedService)) { return; } if (!password) { return; } if (password !== null) { subscribe(selectedService, password!)?.catch((failure) => { if(Failure.isFailure(failure) && failure.status === 403) { setPassword(null); } }); setSelectedService(null); } }, [selectedService, hasSubscription, subscribe, password]); const handleSubscription = (serviceId: Service["id"]) => { setSelectedService(serviceId); }; /* --------------------------------- Markup --------------------------------- */ return (
{!services?.length || isLoading ? _.times(3, (number) => (
Techpal
about service
null} />
)) : services!.map((item, index) => { return (
{item.name}
about service
{processingSubscription(item.id) ? (
) : ( handleSubscription(item.id)} /> )}
); })}
{confirmShown && selectedService && ( setPassword(p)} isShown={true} onClose={() => toggleConfirm(false)} /> )}
); }; export default Services;