UNPKG

@simoko/tw-zip

Version:

台灣縣市、行政區、郵遞區號(3碼/6碼)查詢工具,支援 React/Vue/Svelte/SolidJS/Angular

3 lines 3.9 kB
'use strict';var react=require('react');var V="https://cdn.jsdelivr.net/npm/@simoko/tw-zip/data/zip6",k=new Map,P=null,I=null;async function Y(n={}){if(P)return P;if(I)return I;let e=n.baseUrl||V;return I=fetch(`${e}/cities.json`).then(t=>{if(!t.ok)throw new Error(`Failed to load cities data: HTTP ${t.status}`);return t.json()}).then(t=>(P=t,t)).catch(t=>{throw I=null,t}),I}async function N(n,e={}){let t=n.trim();if(!t)throw new Error("City name cannot be empty");let r=k.get(t);if(r)return r;let s=e.baseUrl||V,d=await fetch(`${s}/${encodeURIComponent(t)}.json`);if(!d.ok)throw new Error(`Failed to load city data for ${t}: HTTP ${d.status}`);let A=await d.json();return k.set(t,A),A}async function F(n,e={}){await Promise.all(n.map(t=>N(t,e)));}function v(n){return k.has(n)}function G(){k.clear(),P=null,I=null;}var J=new Map;function at(n){if(!n)return [];let e=J.get(n);if(e)return e;let t=n.split("|").map(r=>{let s=r.split(",");return [s[0],...s.slice(1).map(Number)]});return J.set(n,t),t}function ot(n,e,t,r,s,d,A,U){if(!A)return;let E=A[e];if(!E)return;let g=E[t];if(!g)return;let m=U[n]?.[e];if(!m)return;let D=at(g);for(let x of D){let[O,c=0,f=0,h=0,y=0,R=0,z=0,Z=0,w=0,S=0]=x;if(f>0||h>0){if(!s)continue;if(f>0&&h>0){if(s<f||s>h)continue}else if(f>0){if(w===9999||w===9998){if(s<f)continue}else if(s!==f)continue}}if(y>0||R>0){if(!d)continue;if(y>0&&R>0){if(d<y||d>R)continue}else if(y>0&&d!==y)continue}if(r!==void 0&&(z>0||w>0)){if(c===1&&r%2===0||c===2&&r%2===1)continue;let L=w===9999||w===9998?Number.POSITIVE_INFINITY:w;if(z>0&&r<z||L!==Number.POSITIVE_INFINITY&&r>L)continue}else if(c!==0&&r!==void 0&&(c===1&&r%2===0||c===2&&r%2===1))continue;return {zipcode:m+O,zip3:m,city:n,area:e,road:t}}if(D.length>0){let[x]=D[0];return {zipcode:m+x,zip3:m,city:n,area:e,road:t}}}function ft(n={}){let{baseUrl:e,preload:t}=n,[r,s]=react.useState(true),[d,A]=react.useState([]),[U,E]=react.useState({}),[g,m]=react.useState(""),[D,x]=react.useState(""),[O,c]=react.useState(""),[f,h]=react.useState(void 0),[y,R]=react.useState(void 0),[z,Z]=react.useState(void 0),[w,S]=react.useState([]),[L,j]=react.useState([]),[K,_]=react.useState([]),[C,B]=react.useState(void 0),M=react.useRef(0);react.useEffect(()=>{let i=true;async function u(){s(true);let a=await Y({baseUrl:e});if(!i)return;A(a.cities),E(a.zip3);let p=a.cities[0]??"";if(m(p),t&&t.length>0&&await F(t,{baseUrl:e}),p){let b=await N(p,{baseUrl:e});if(!i)return;B(b);let l=Object.keys(b);if(S(l),x(l[0]??""),l[0]){let q=b[l[0]];if(q){let H=Object.keys(q);j(H),c(H[0]??"");}}}s(false);}return u(),()=>{i=false;}},[e]);let Q=react.useCallback(async i=>{let u=++M.current;m(i),s(true);try{let a=await N(i,{baseUrl:e});if(M.current!==u)return;B(a);let p=Object.keys(a);if(S(p),x(p[0]??""),j([]),c(""),h(void 0),R(void 0),Z(void 0),p[0]){let b=a[p[0]];if(b){let l=Object.keys(b);j(l),c(l[0]??"");}}}catch(a){M.current===u&&console.error(`Failed to load city data for ${i}:`,a);}finally{M.current===u&&s(false);}},[e]),W=react.useCallback(i=>{if(x(i),C){let u=C[i];if(u){let a=Object.keys(u);j(a),c(a[0]??"");}else j([]),c("");}h(void 0),R(void 0),Z(void 0);},[C]),X=react.useCallback(i=>{c(i),h(void 0),R(void 0),Z(void 0);},[]),tt=react.useCallback(i=>{if(!i.trim()){_([]);return}let u=[],a=i.trim();if(C)for(let[p,b]of Object.entries(C))for(let l of Object.keys(b))l.includes(a)&&u.push({city:g,area:p,road:l});_(u);},[g,C]),$=react.useMemo(()=>{if(!(!g||!D||!O||!C))return ot(g,D,O,f,y,z,C,U)},[g,D,O,f,y,z,C,U]),et=$?.zipcode??"",nt=$?.zip3??"";return {loading:r,cities:d,areas:w,roads:L,city:g,area:D,road:O,number:f,lane:y,alley:z,setCity:Q,setArea:W,setRoad:X,setNumber:h,setLane:R,setAlley:Z,searchRoads:tt,searchResults:K,zipCode:et,zip3:nt,result:$,preloadCities:react.useCallback(i=>F(i,{baseUrl:e}),[e]),isCityCached:v,clearCache:G}} exports.useTwZip6=ft;//# sourceMappingURL=lazy.cjs.map //# sourceMappingURL=lazy.cjs.map