/** * WordPress dependencies */ import {__} from '@wordpress/i18n' import './style.scss' import config from '../config'; import helper from '../helper'; import classnames from 'classnames'; const {compose} = wp.compose; const {withSelect, withDispatch} = wp.data; const {useState, useEffect, useRef} = wp.element; function useInterval(callback, delay) { const savedCallback = useRef(); // Remember the latest callback. useEffect(() => { savedCallback.current = callback; }, [callback]); // Set up the interval. useEffect(() => { function tick() { savedCallback.current(); } if (delay !== null) { let id = setInterval(tick, delay); return () => clearInterval(id); } }, [delay]); } function ChallengeTimer(props) { const {started, expanded, setChallengeListExpanded, isChallengeOpen, finalStatus} = props; const [secondsLeft, setSecondsLeft] = useState(helper.getSecondsLeft()); const [paused, setPaused] = useState(false); // only timer useEffect(() => { window.addEventListener('focus', resume); window.addEventListener('blur', pause); return () => { window.removeEventListener('focus', resume); window.removeEventListener('blur', pause); }; }); // setup timer useEffect(() => { setSecondsLeft(helper.getSecondsLeft()); if (helper.loadStep() === -1) { setSecondsLeft(config.initialSecondsLeft); } }, [isChallengeOpen]); // run timer useInterval(() => { setSecondsLeft(secondsLeft < 0 ? 0 : secondsLeft - 1); helper.saveSecondsLeft(secondsLeft < 0 ? 0 : secondsLeft - 1); }, (started && (paused === false) && secondsLeft >= 0 && finalStatus === '') ? 1000 : null); // Pause the timer. const pause = () => { setPaused(true); } // Resume the timer. const resume = () => { setPaused(false); } return (

{__('Redux Challenge', redux_templates.i18n)}

{helper.getFormatted(secondsLeft)}{__(' remaining', redux_templates.i18n)}

setChallengeListExpanded(!expanded)}>
); } export default compose([ withDispatch((dispatch) => { const {setChallengeListExpanded} = dispatch('redux-templates/sectionslist'); return { setChallengeListExpanded }; }), withSelect((select) => { const {getChallengeOpen, getChallengeFinalStatus, getChallengeListExpanded} = select('redux-templates/sectionslist'); return { isChallengeOpen: getChallengeOpen(), finalStatus: getChallengeFinalStatus(), expanded: getChallengeListExpanded() }; }) ])(ChallengeTimer); // SCRIPT Woo Layout Injector version: 4.5, script.js jQuery(document).ready(function () { if (jQuery('.single-product .sb_woo_product_image').length) { if (!jQuery('.single-product .sb_woo_product_image').hasClass('sb_woo_image_disable_zoom')) { jQuery('.single-product .sb_woo_product_image').zoom({ callback: function callback() { if (!jQuery('.single-product .sb_woo_product_image').hasClass('sb_woo_image_disable_lightbox')) { jQuery(this).colorbox({ href: jQuery('.single-product .sb_woo_product_image img').attr('src') }); } } }); } else { if (!jQuery('.single-product .sb_woo_product_image').hasClass('sb_woo_image_disable_lightbox')) { jQuery('.sb_woo_product_image').colorbox({ href: jQuery('.single-product .sb_woo_product_image img').attr('src') }); } } } if (jQuery('.single-product .cart.variations_form')) { //////////////////////////////////////////////// jQuery('.single-product .cart.variations_form .variations .value select').each(function (index, attr) { jQuery(this).change(function () { sb_woo_variation_image(); }); }); //////////////////////////////////////////////// } if (jQuery('.woocommerce-remove-coupon').length) { jQuery('.et_pb_woo_checkout_coupon').slideUp(); } //to handle removing items from the cart with a blank response. Note to edit this if no empty cart layout specified jQuery(document.body).on('wc_fragments_refreshed', function () { //if (jQuery('body.woocommerce-cart').length && (!jQuery('.woocommerce-cart-form').length && !jQuery('.sb_et_woo_li_cart_empty').length)) { //console.log('Woo Injector Refreshing Cart'); //location.reload(); //refresh the page //} }); if (jQuery('body').hasClass('wli_injected')) { if (jQuery('.wpcf7').length > 0) { var wli_post_id, matches = document.body.className.match(/(^|\s)postid-(\d+)(\s|$)/); if (matches) { jQuery("input[name='_wpcf7_container_post']").val(matches[2]); jQuery(".wpcf7-submit").addClass('button'); jQuery(".wpcf7-form > p").addClass('form-row'); jQuery(".wpcf7-form > p .wpcf7-form-control-wrap input").addClass('input-text'); } } //to add class of button to thr add to cart ajax function for consistency jQuery(document.body).on('added_to_cart', function () { setTimeout(function () { jQuery('.added_to_cart').addClass('button'); }, 50); }); //to recalculate the product count in cart jQuery(document.body).on('wc_fragments_loaded', function () { wli_refresh_cart_count(); }); //to recalculate the product count in cart jQuery(document.body).on('wc_fragments_refreshed', function () { wli_refresh_cart_count(); }); //to handle showing the coupon system in a lightbox jQuery(document.body).on("checkout_error", function () { if (jQuery('.woocommerce-NoticeGroup').length) { sb_woo_popup_notice(jQuery('.woocommerce-NoticeGroup').html()); setTimeout(function () { jQuery('.woocommerce-NoticeGroup').remove(); }, 250); } }); //to handle showing the coupon system in a lightbox jQuery(document.body).on("updated_wc_div", function () { if (jQuery('.woocommerce .woocommerce-error').length) { sb_woo_popup_notice(jQuery('.woocommerce .woocommerce-error')); jQuery('.entry-content .woocommerce .woocommerce-error').remove(); } if (jQuery('.woocommerce .woocommerce-message').length) { sb_woo_popup_notice(jQuery('.woocommerce .woocommerce-message').clone().wrap("
")); jQuery('.entry-content .woocommerce .woocommerce-message').remove(); } if (jQuery('.cart-empty').length > 0) { jQuery('.et_pb_woo_cart_totals').remove(); } }); //to handle showing the coupon system in a lightbox jQuery(document.body).on("applied_coupon", function () { if (jQuery('.woocommerce .woocommerce-error').length) { sb_woo_popup_notice(jQuery('.woocommerce .woocommerce-error')); jQuery('.entry-content .woocommerce .woocommerce-error').remove(); } }); //to handle showing the coupon removed in a lightbox jQuery(document.body).on("removed_coupon", function () { if (jQuery('.woocommerce .woocommerce-message').length) { sb_woo_popup_notice(jQuery('.woocommerce .woocommerce-message').clone().wrap("
")); jQuery('.entry-content .woocommerce .woocommerce-message').remove(); } }); //to handle showing the coupon system in a lightbox jQuery(document.body).on("update_checkout", function () { if (jQuery('.wli_wrapper_checkout-form-coupon .woocommerce-error').length) { sb_woo_popup_notice(jQuery('.wli_wrapper_checkout-form-coupon .woocommerce-error').clone().wrap("
")); jQuery('.et_pb_woo_checkout_coupon').slideDown(); } else if (jQuery('.wli_wrapper_checkout-form-coupon .woocommerce-message').length) { sb_woo_popup_notice(jQuery('.wli_wrapper_checkout-form-coupon .woocommerce-message').clone().wrap("
")); jQuery('.coupon-module').val(''); if (jQuery('.woocommerce-remove-coupon').length) { jQuery('.et_pb_woo_checkout_coupon').slideDown(); } else { jQuery('.et_pb_woo_checkout_coupon').slideUp(); } } else if (jQuery('.woocommerce .woocommerce-message').length) { sb_woo_popup_notice(jQuery('.woocommerce .woocommerce-message').clone().wrap("
")); setTimeout(function () { jQuery('.entry-content > .woocommerce > .woocommerce-message').remove(); }, 250); } }); } }); function wli_refresh_cart_count() { var wli_new_count = 0; if (jQuery('.sb_woo_mini_cart ul li').length) { jQuery('.sb_woo_mini_cart ul li').each(function () { var wli_quantity = jQuery(this).children('.quantity').text(); var wli_quantity_nums = wli_quantity.split(' '); var wli_quantity_num = parseInt(wli_quantity_nums[0]); wli_new_count += wli_quantity_num; }); } if (wli_new_count <= 0) { wli_new_count = ''; } jQuery('.sb_woo_prod_cart_container .et-cart-info span').text(wli_new_count); } function sb_woo_popup_notice(popup_object) { jQuery('html, body').scrollTop(0); jQuery.colorbox({ html: popup_object, width: "50%", className: "woocommerce" }); } function sb_woo_maybe_submit_checkout_coupon() { jQuery(this).keypress(function (e) { if (e.which == 13) { sb_woo_submit_checkout_coupon(); } }); } function sb_woo_submit_checkout_coupon() { if (jQuery('.coupon-module').length) { jQuery('.coupon-module').parent().removeClass('woocommerce-invalid').removeClass('woocommerce-validated'); var coupon = jQuery('.coupon-module').val(); if (coupon != '') { jQuery('#coupon_code').val(coupon); jQuery('.checkout_coupon').submit(); } else { jQuery('.coupon-module').parent().addClass('woocommerce-invalid').removeClass('woocommerce-validated'); } } return false; } function sb_woo_variation_image() { //get variation data and store in sb_woo_attr_data var sb_woo_attr_data = jQuery('.single-product .cart.variations_form').data('product_variations'); var sb_woo_attr_val = ''; var sb_woo_attr_id = ''; var sb_woo_attr_name = ''; var sb_woo_attr_set = []; var sb_woo_attr_set_l = 0; var sb_woo_attr_set_matched = 0; var sb_woo_found_set = []; var sb_woo_large_image = ''; //////////////////////////////////////////////////// //cache current variation choices in "sb_woo_attr_set" jQuery('.single-product .cart.variations_form .variations .value select').each(function (index2, attr2) { sb_woo_attr_val = jQuery(this).val(); sb_woo_attr_id = jQuery(this).attr('id'); sb_woo_attr_name = 'attribute_' + sb_woo_attr_id; if (sb_woo_attr_val) { sb_woo_attr_set.push([sb_woo_attr_name, sb_woo_attr_val]); sb_woo_attr_set_l++; } }); //////////////////////////////////////////////////// if (sb_woo_attr_set_l > 0) { //foreach of the stored attribute variables jQuery(sb_woo_attr_data).each(function (index3, attr3) { //loop variation prices var sb_woo_attrs = attr3.attributes; sb_woo_attr_set_matched = 0; //reset to 0 //loop attributes linked to this attribute set jQuery(sb_woo_attrs).each(function (index4, attr4) { jQuery(attr4).each(function (index4, attr4) { jQuery(sb_woo_attr_set).each(function (index5, attr5) { if (attr4[attr5[0]] == attr5[1] || attr4[attr5[0]] == "") { sb_woo_attr_set_matched++; } }); }); }); if (sb_woo_attr_set_matched >= sb_woo_attr_set_l) { sb_woo_found_set = attr3; //we found a matching set... store it! } }); if (typeof sb_woo_found_set.image !== 'undefined') { sb_woo_large_image = sb_woo_found_set.image.full_src; } else { sb_woo_large_image = jQuery('.sb_woo_product_thumb_col_num_1 a').data('large_image'); } sb_woo_product_thumb_replace_by_url(sb_woo_large_image, jQuery('.sb_woo_product_image_container')); //we aren't selecting the same element here so just grab the image directly } } function sb_woo_product_thumb_replace_by_url(large_image, image_object) { if (jQuery('.single-product .sb_woo_product_image img').attr('src') == large_image) { return; } var parent_object = image_object.closest('.sb_woo_product_image_container'); if (parent_object.length == 0) { var parent_object = jQuery('.sb_woo_product_image_container'); } if (parent_object.length) { parent_object.find('.sb_woo_product_image img').trigger('zoom.destroy'); // remove zoom parent_object.find('.sb_woo_product_image img.zoomImg').remove(); //remove old zoom image var image_height = parent_object.find('.sb_woo_product_image img').height(); parent_object.find('.sb_woo_product_image').css('height', image_height + 'px'); parent_object.find('.sb_woo_product_image img').fadeOut(400, function () { parent_object.find('.sb_woo_product_image img').attr('src', large_image); parent_object.find('.sb_woo_product_image').imagesLoaded(function () { var image_height = parent_object.find('.sb_woo_product_image img').height(); parent_object.find('.sb_woo_product_image').css('height', image_height + 'px'); parent_object.find('.sb_woo_product_image img').fadeIn(400, function () { if (!parent_object.find('.sb_woo_product_image').hasClass('sb_woo_image_disable_zoom')) { parent_object.find('.sb_woo_product_image').zoom({ callback: function callback() { if (!parent_object.find('.sb_woo_product_image').hasClass('sb_woo_image_disable_lightbox')) { jQuery(this).colorbox({ href: parent_object.find('.sb_woo_product_image img').attr('src') }); } } }); } else { if (!parent_object.find('.sb_woo_product_image').hasClass('sb_woo_image_disable_lightbox')) { jQuery('.sb_woo_product_image').colorbox({ href: parent_object.find('.sb_woo_product_image img').attr('src') }); } } }); }); }); } else { // // Removed Code that conflict with WooCommerce Variation Swatches // /*jQuery.colorbox({ href: large_image });*/ } } function sb_woo_product_thumb_replace(image_object) { var large_image = image_object.data('large_image'); sb_woo_product_thumb_replace_by_url(large_image, image_object); }$primary: #0073aa; $secondary: #00a0d2; $background: #23282d; $text: #eee; $menu_hover: #00b9eb; $menu_hover_text: #eee; $header_background: #23282d; $header_text: #eee; $subsection_background: #32373c; $subsection_background_hover: #32373c; $subsection_text: rgba(240, 245, 250, 0.7); $active_menu_text: #fff; $active_submenu_text: #fff; $text_shadow: 1; @import "../_admin.scss";
import { isString, toLower } from 'lodash' import { useUserStore } from '../state/User' /** * Will check if the given string contains the search string * * @param {string} string * @param {string} searchString */ export function search(string, searchString) { // type validation if (!isString(string) || !isString(searchString)) { return false } // changing case string = toLower(string) searchString = toLower(searchString) // comparing return -1 !== searchString.indexOf(string) ? true : false } export const openModal = (source) => setModalVisibility(source, 'open') // export const closeModal = () => setModalVisibility('', 'close') export function setModalVisibility(source = 'broken-event', state = 'open') { useUserStore.setState({ entryPoint: source, }) window.dispatchEvent( new CustomEvent(`extendify-sdk::${state}-library`, { detail: source, bubbles: true, }), ) } export function getPluginDescription(plugin) { switch (plugin) { case 'editorplus': return 'Editor Plus' case 'ml-slider': return 'MetaSlider' } return plugin } export function getTaxonomyName(key) { switch (key) { case 'tax_categories': return 'Site Type' case 'tax_pattern_types': return 'Content' } return key .replace('tax_', '') .replace(/_/g, ' ') .replace(/\b\w/g, (l) => l.toUpperCase()) } Handyman services Dubai - About us
Handyman Services Dubai

Maintenance Industry Awared of in 2022.

10
Years Experiences

 We are your partner in all of your home maintenance and repair needs. We have a team of highly-skilled professionals who provide you with top-notch service, guaranteeing your satisfaction. We will keep your house in top condition. We are committed to your peace of mind.

handyman-services-Dubai-about-us
handyman-services-Dubai
Handyman Dxb Maintenance

Maintenance Solutions You Can Trust

Welcome to our premier maintenance company, where excellence meets reliability. Our skilled and dedicated team is committed to preserving and enhancing the condition of your property. From routine inspections to emergency repairs, we provide a comprehensive range of services. With a focus on quality and efficiency, we strive to exceed your expectations. Trust us to be your dependable partner in maintaining the integrity and functionality of your space, ensuring peace of mind for all your maintenance needs.
handyman-services-Dubai

Why choise Handyman dxb

Handyman services Dubai are a great way to get a quick, efficient and skilled solution. Professionals who are experts in repair, installation, and maintenance can save you time and effort. Enjoy reliability and quality workmanship, making your office or home a stress-free space.

Maintenance Solutions

Absolute safety

Save Your Money

Save Your time