UNPKG

vue-awesome-countdown

Version:

Countdown plug-in with high performance and high accuracy for Vue 2.5.0+ and Vue 3, with TypeScript support.

2 lines (1 loc) 8.58 kB
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("vue"),I=(e,o)=>{const r=e.__vccOpts||e;for(const[a,i]of o)r[a]=i;return r},O={name:"vue-awesome-countdown",props:{startTime:{type:[String,Number,Date],default:null,validator:function(e){return new Date(e).toString()!=="Invalid Date"}},endTime:{type:[String,Number,Date],default:null,validator:function(e){return new Date(e).toString()!=="Invalid Date"}},leftTime:{type:Number,default:0},autoStart:{type:Boolean,default:!0},speed:{type:Number,default:1e3,validator:function(e){return e>=0}},tag:{type:String,default:"span"}},computed:{thousandSpeed(){return this.speed>0&&this.speed%1e3===0}},data:function(){return{state:"beforeStart",attrs:{},actualStartTime:null,actualEndTime:null,timeObj:{},countdownTimer:null,runTimes:0,usedTime:0,remainingTime:0}},watch:{speed(e,o){const r=this;if(e<0&&(e=0),e!==o){clearTimeout(r.countdownTimer);const a=Date.now(),i=Math.floor((a-r.actualStartTime)/e),n=a%e;r.runTimes=i,r.$nextTick(()=>{r.countdownTimer=setTimeout(r.doCountdown,n)})}}},created(){const e=this,o=e.startTime&&new Date(e.startTime).getTime()||0,r=o&&o-Date.now()||0;e.autoStart&&(e.state="preheat",setTimeout(()=>{e.startCountdown(!0)},r))},beforeDestroy(){this.countdownTimer&&clearTimeout(this.countdownTimer)},methods:{startCountdown(e){const o=this;o.state!=="beforeStart"&&o.state!=="stopped"&&o.state!=="paused"&&!e||(e&&Object.assign(o.$data,o.$options.data.call(o)),o.state==="stopped"&&(o.remainingTime=o.actualEndTime-Date.now()),o.actualEndTime||(o.actualEndTime=o.endTime||Date.now()+(o.remainingTime||o.leftTime)),o.state==="paused"&&(o.actualEndTime=Date.now()+o.remainingTime),o.$emit("start",o),o.state="process",o.doCountdown())},stopCountdown(){const e=this;e.state==="process"&&(clearTimeout(e.countdownTimer),e.$emit("stop",e),e.state="stopped")},pauseCountdown(){const e=this;e.state==="process"&&(clearTimeout(e.countdownTimer),e.remainingTime=e.actualEndTime-Date.now(),e.$emit("paused",e),e.state="paused")},switchCountdown(){const e=this;if(e.state==="stopped"||e.state==="beforeStart")return e.startCountdown();if(e.state==="process")return e.stopCountdown()},finishCountdown(){const e=this;e.state="finished",e.timeObj={},e.usedTime=Date.now()-e.actualStartTime,e.$emit("finish",e)},doCountdown(){const e=this;if(e.state!=="process")return;e.actualStartTime||(e.actualStartTime=Date.now());let o=new Date(e.actualEndTime).getTime()-Date.now();if(o>0){const a={};let i=o/1e3,n=o%1e3;e.thousandSpeed&&n>990&&(i=Math.ceil(i),n=0);const c={d:i/60/60/24,h:i/60/60%24,m:i/60%60,s:i%60,ms:n},d={d:parseInt(c.d,10).toString(),h:parseInt(c.h,10).toString().padStart(2,"0"),m:parseInt(c.m,10).toString().padStart(2,"0"),s:parseInt(c.s,10).toString().padStart(2,"0"),ms:c.ms.toString().padStart(3,"0")},m={d:parseInt(Math.ceil(i/60/60/24),10),h:parseInt(Math.ceil(i/60/60),10),m:parseInt(Math.ceil(i/60),10),s:parseInt(Math.ceil(i),10)};a.endTime=e.actualEndTime,a.speed=e.speed,e.usedTime=Date.now()-e.actualStartTime,a.leftTime=o,e.remainingTime=o,e.timeObj=Object.assign({},a,d,{org:c,ceil:m}),e.$emit("process",e)}else{e.finishCountdown();return}let r=e.speed+(e.actualStartTime+e.runTimes++*e.speed-Date.now());r<0&&(r=r+e.speed),o<e.speed&&(r=o),e.countdownTimer=setTimeout(e.doCountdown,r)}}};function j(e,o,r,a,i,n){return t.openBlock(),t.createBlock(t.resolveDynamicComponent(r.tag),t.mergeProps(e.attrs,t.toHandlers(e.$listeners)),{default:t.withCtx(()=>[t.renderSlot(e.$slots,"prev",t.normalizeProps(t.guardReactiveProps(this._self))),e.state==="beforeStart"?t.renderSlot(e.$slots,"before",t.normalizeProps(t.mergeProps({key:0},this._self))):t.createCommentVNode("",!0),e.state==="preheat"?t.renderSlot(e.$slots,"preheat",t.normalizeProps(t.mergeProps({key:1},this._self))):t.createCommentVNode("",!0),e.state==="process"||e.state==="stopped"||e.state==="paused"?t.renderSlot(e.$slots,"process",t.normalizeProps(t.mergeProps({key:2},this._self))):t.createCommentVNode("",!0),e.state==="finished"?t.renderSlot(e.$slots,"finish",t.normalizeProps(t.mergeProps({key:3},this._self))):t.createCommentVNode("",!0),t.renderSlot(e.$slots,"default",t.normalizeProps(t.guardReactiveProps(this._self)))]),_:3},16)}const B=I(O,[["render",j]]),R=t.defineComponent({__name:"vue-awesome-countdown-v3",props:{startTime:{default:void 0},endTime:{default:void 0},leftTime:{default:0},autoStart:{type:Boolean,default:!0},speed:{default:1e3},tag:{default:"span"}},emits:["start","stop","paused","finish","process"],setup(e,{expose:o,emit:r}){const a=e,i=r,n=t.ref("beforeStart"),c=t.ref({}),d=t.ref(null),m=t.ref(null),w=t.ref({endTime:null,speed:a.speed,leftTime:0,usedTime:0,remainingTime:0,d:"0",h:"00",m:"00",s:"00",ms:"000",org:{d:0,h:0,m:0,s:0,ms:0},ceil:{d:0,h:0,m:0,s:0}}),T=t.ref(null),C=t.ref(0),g=t.ref(0),f=t.ref(0),b=t.computed(()=>a.speed>0&&a.speed%1e3===0);t.watch(()=>a.speed,(s,p)=>{if(s<0&&(s=0),s!==p){h();const u=Date.now(),S=Math.floor((u-(d.value||0))/s),v=u%s;C.value=S,T.value=setTimeout(P,v)}});const h=()=>{T.value&&(clearTimeout(T.value),T.value=null)};t.onMounted(()=>{if(a.autoStart)if(n.value="preheat",a.startTime){const p=new Date(a.startTime).getTime()-Date.now();T.value=setTimeout(()=>{D(!0)},p)}else T.value=setTimeout(()=>{D(!0)},0)}),t.onUnmounted(()=>{h()});const D=s=>{n.value!=="beforeStart"&&n.value!=="stopped"&&n.value!=="paused"&&!s||(h(),s&&(n.value="beforeStart",d.value=null,m.value=null,C.value=0,g.value=0,f.value=0,w.value={...w.value,leftTime:0,remainingTime:0,d:"0",h:"00",m:"00",s:"00",ms:"000"}),n.value==="stopped"&&(f.value=(m.value||0)-Date.now()),m.value||(m.value=a.endTime?new Date(a.endTime).getTime():Date.now()+(f.value||a.leftTime)),n.value==="paused"&&(m.value=Date.now()+f.value),i("start",l),n.value="process",P())},$=()=>{n.value==="process"&&(h(),i("stop",l),n.value="stopped")},V=()=>{n.value==="process"&&(h(),f.value=(m.value||0)-Date.now(),i("paused",l),n.value="paused")},k=()=>{if(n.value==="stopped"||n.value==="beforeStart")return D();if(n.value==="process")return $()},z=()=>{h(),n.value="finished",w.value={...w.value,leftTime:0,remainingTime:0,d:"0",h:"00",m:"00",s:"00",ms:"000"},g.value=Date.now()-(d.value||0),i("finish",l)},P=()=>{if(n.value!=="process")return;d.value||(d.value=Date.now());let s=(m.value||0)-Date.now();if(s>0){let u=s/1e3,S=s%1e3;b.value&&S>990&&(u=Math.ceil(u),S=0);const v={d:u/60/60/24,h:u/60/60%24,m:u/60%60,s:u%60,ms:S},N={d:Math.floor(v.d).toString(),h:Math.floor(v.h).toString().padStart(2,"0"),m:Math.floor(v.m).toString().padStart(2,"0"),s:Math.floor(v.s).toString().padStart(2,"0"),ms:v.ms.toString().padStart(3,"0")},E={d:Math.ceil(u/60/60/24),h:Math.ceil(u/60/60),m:Math.ceil(u/60),s:Math.ceil(u)};g.value=Date.now()-(d.value||0),f.value=s,w.value={endTime:m.value,speed:a.speed,leftTime:s,usedTime:g.value,remainingTime:f.value,...N,org:v,ceil:E},i("process",l)}else{z();return}let p=a.speed+((d.value||0)+C.value++*a.speed-Date.now());p<0&&(p=p+a.speed),s<a.speed&&(p=s),T.value=setTimeout(P,p)},l={get state(){return n.value},get attrs(){return c.value},get actualStartTime(){return d.value},get actualEndTime(){return m.value},get timeObj(){return w.value},get runTimes(){return C.value},get usedTime(){return g.value},get remainingTime(){return f.value},get thousandSpeed(){return b.value},startCountdown:D,stopCountdown:$,pauseCountdown:V,switchCountdown:k};return o(l),(s,p)=>(t.openBlock(),t.createBlock(t.resolveDynamicComponent(e.tag),t.normalizeProps(t.guardReactiveProps(c.value)),{default:t.withCtx(()=>[t.renderSlot(s.$slots,"prev",t.normalizeProps(t.guardReactiveProps(l))),n.value==="beforeStart"?t.renderSlot(s.$slots,"before",t.normalizeProps(t.mergeProps({key:0},l))):t.createCommentVNode("",!0),n.value==="preheat"?t.renderSlot(s.$slots,"preheat",t.normalizeProps(t.mergeProps({key:1},l))):t.createCommentVNode("",!0),n.value==="process"||n.value==="stopped"||n.value==="paused"?t.renderSlot(s.$slots,"process",t.normalizeProps(t.mergeProps({key:2},l))):t.createCommentVNode("",!0),n.value==="finished"?t.renderSlot(s.$slots,"finish",t.normalizeProps(t.mergeProps({key:3},l))):t.createCommentVNode("",!0),t.renderSlot(s.$slots,"default",t.normalizeProps(t.guardReactiveProps(l)))]),_:3},16))}}),y=()=>typeof window<"u"&&window.Vue&&window.Vue.version&&window.Vue.version.startsWith("2.")?B:R,_=(e,o)=>{const r=o||"vac",a=y();a&&(e.component(r,a),e.component("countdown",a))},M={install:_};typeof window<"u"&&window.Vue&&window.Vue.use(M);const A=y();exports.VueAwesomeCountdown=A;exports.default=M;