@bwg-ui/core 1.1.11 → 1.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/BwgLargeUploader-CgrJUwFW.cjs +3 -0
- package/dist/chunks/BwgLargeUploader-CgrJUwFW.cjs.map +1 -0
- package/dist/chunks/{BwgLargeUploader-B5EtYKUz.js → BwgLargeUploader-Nx2-wiD8.js} +802 -776
- package/dist/chunks/BwgLargeUploader-Nx2-wiD8.js.map +1 -0
- package/dist/chunks/{FileUtils-CaU9Bzu2.js → FileUtils-Bbz3AvQn.js} +2 -2
- package/dist/chunks/{FileUtils-CaU9Bzu2.js.map → FileUtils-Bbz3AvQn.js.map} +1 -1
- package/dist/chunks/FileUtils-D73GVmB8.cjs +2 -0
- package/dist/chunks/{FileUtils-BweAWoJt.cjs.map → FileUtils-D73GVmB8.cjs.map} +1 -1
- package/dist/chunks/SSOHandler-CZHPiuEh.js +25397 -0
- package/dist/chunks/SSOHandler-CZHPiuEh.js.map +1 -0
- package/dist/chunks/SSOHandler-rq0OGrpX.cjs +236 -0
- package/dist/chunks/SSOHandler-rq0OGrpX.cjs.map +1 -0
- package/dist/chunks/{SearchBoxContext-CY4tAQcg.js → SearchBoxContext-BxtHF9BO.js} +2 -2
- package/dist/chunks/{SearchBoxContext-CY4tAQcg.js.map → SearchBoxContext-BxtHF9BO.js.map} +1 -1
- package/dist/chunks/SearchBoxContext-Cpr9xa1S.cjs +2 -0
- package/dist/chunks/{SearchBoxContext-DDBY44Wr.cjs.map → SearchBoxContext-Cpr9xa1S.cjs.map} +1 -1
- package/dist/chunks/TabContainer-B7-6AQXV.js +254 -0
- package/dist/chunks/TabContainer-B7-6AQXV.js.map +1 -0
- package/dist/chunks/TabContainer-Dx2PVShz.cjs +36 -0
- package/dist/chunks/TabContainer-Dx2PVShz.cjs.map +1 -0
- package/dist/chunks/_commonjsHelpers-DKOUU3wS.cjs +2 -0
- package/dist/chunks/_commonjsHelpers-DKOUU3wS.cjs.map +1 -0
- package/dist/chunks/_commonjsHelpers-DaMA6jEr.js +9 -0
- package/dist/chunks/_commonjsHelpers-DaMA6jEr.js.map +1 -0
- package/dist/chunks/apiUtils-C45AWfu-.js +957 -0
- package/dist/chunks/apiUtils-C45AWfu-.js.map +1 -0
- package/dist/chunks/apiUtils-Cbg6NQLv.cjs +4 -0
- package/dist/chunks/apiUtils-Cbg6NQLv.cjs.map +1 -0
- package/dist/chunks/codeStore-BGLhSpAM.cjs +2 -0
- package/dist/chunks/{codeStore-KPL92rcv.cjs.map → codeStore-BGLhSpAM.cjs.map} +1 -1
- package/dist/chunks/{codeStore-IIp25egq.js → codeStore-BzT5wSd9.js} +2 -2
- package/dist/chunks/{codeStore-IIp25egq.js.map → codeStore-BzT5wSd9.js.map} +1 -1
- package/dist/chunks/commonUtils-BH6QwGUb.cjs +2 -0
- package/dist/chunks/commonUtils-BH6QwGUb.cjs.map +1 -0
- package/dist/chunks/{commonUtils-Cvx6_eK2.js → commonUtils-Bb16Yqjk.js} +24 -25
- package/dist/chunks/commonUtils-Bb16Yqjk.js.map +1 -0
- package/dist/chunks/envUtils-C9Gf5aek.js.map +1 -1
- package/dist/chunks/envUtils-CduTHoHu.cjs.map +1 -1
- package/dist/chunks/favoriteStore-3YceyayF.cjs +2 -0
- package/dist/chunks/favoriteStore-3YceyayF.cjs.map +1 -0
- package/dist/chunks/favoriteStore-C9utQ6sm.js +112 -0
- package/dist/chunks/favoriteStore-C9utQ6sm.js.map +1 -0
- package/dist/chunks/{popupStore-D8RI04bU.js → popupStore-DmFbkkjd.js} +19 -18
- package/dist/chunks/popupStore-DmFbkkjd.js.map +1 -0
- package/dist/chunks/popupStore-DnWLaQ70.cjs +2 -0
- package/dist/chunks/popupStore-DnWLaQ70.cjs.map +1 -0
- package/dist/chunks/usePopup-C8FrbrDD.cjs +2 -0
- package/dist/chunks/{UtilsContext-JSHHfnWl.js.map → usePopup-C8FrbrDD.cjs.map} +1 -1
- package/dist/chunks/{UtilsContext-JSHHfnWl.js → usePopup-pfh-ajfP.js} +82 -82
- package/dist/chunks/usePopup-pfh-ajfP.js.map +1 -0
- package/dist/components/common/BwgDetail.d.ts +5 -0
- package/dist/components/common/BwgDetail.d.ts.map +1 -0
- package/dist/components/common/BwgDrawer.d.ts.map +1 -1
- package/dist/components/common/BwgEditor.d.ts +7 -0
- package/dist/components/common/BwgEditor.d.ts.map +1 -0
- package/dist/components/common/BwgView.d.ts.map +1 -1
- package/dist/components/common/index.cjs +1 -1
- package/dist/components/common/index.d.ts +2 -0
- package/dist/components/common/index.d.ts.map +1 -1
- package/dist/components/common/index.js +23 -21
- package/dist/components/core/BwgDatePicker.d.ts +1 -1
- package/dist/components/core/BwgDatePicker.d.ts.map +1 -1
- package/dist/components/core/BwgRangePicker.d.ts +1 -1
- package/dist/components/core/BwgRangePicker.d.ts.map +1 -1
- package/dist/components/core/BwgUploader.d.ts.map +1 -1
- package/dist/components/core/index.cjs +1 -1
- package/dist/components/core/index.js +1 -1
- package/dist/components/layout/ErrorBound.d.ts +29 -0
- package/dist/components/layout/ErrorBound.d.ts.map +1 -0
- package/dist/components/layout/TabContainer.d.ts +9 -0
- package/dist/components/layout/TabContainer.d.ts.map +1 -0
- package/dist/components/layout/index.cjs +1 -1
- package/dist/components/layout/index.d.ts +3 -1
- package/dist/components/layout/index.d.ts.map +1 -1
- package/dist/components/layout/index.js +6 -4
- package/dist/index.cjs +1 -1
- package/dist/index.js +301 -296
- package/dist/provider/index.cjs +1 -1
- package/dist/provider/index.js +2 -2
- package/dist/stores/favoriteStore.d.ts.map +1 -1
- package/dist/stores/index.cjs +1 -1
- package/dist/stores/index.cjs.map +1 -1
- package/dist/stores/index.d.ts +3 -1
- package/dist/stores/index.d.ts.map +1 -1
- package/dist/stores/index.js +18 -16
- package/dist/stores/index.js.map +1 -1
- package/dist/stores/loadingStore.d.ts +9 -0
- package/dist/stores/loadingStore.d.ts.map +1 -0
- package/dist/stores/menuViewStore.d.ts +28 -3
- package/dist/stores/menuViewStore.d.ts.map +1 -1
- package/dist/stores/popupStore.d.ts.map +1 -1
- package/dist/styles/assets/images/header/icon/ico-bell.svg +3 -3
- package/dist/styles/assets/images/header/icon/ico-logout.svg +10 -10
- package/dist/styles/assets/images/header/icon/ico-setting.svg +4 -4
- package/dist/styles/assets/images/header/icon/ico-sidebar-arrow.svg +3 -3
- package/dist/utils/apiUtils.d.ts +3 -2
- package/dist/utils/apiUtils.d.ts.map +1 -1
- package/dist/utils/index.cjs +1 -1
- package/dist/utils/index.js +3 -3
- package/dist/utils/notificationUtils.d.ts +0 -1
- package/dist/utils/notificationUtils.d.ts.map +1 -1
- package/package.json +6 -7
- package/dist/chunks/BwgLargeUploader-B5EtYKUz.js.map +0 -1
- package/dist/chunks/BwgLargeUploader-BPJcShgF.cjs +0 -3
- package/dist/chunks/BwgLargeUploader-BPJcShgF.cjs.map +0 -1
- package/dist/chunks/FileUtils-BweAWoJt.cjs +0 -2
- package/dist/chunks/PublicLayout-3v46YZdi.cjs +0 -36
- package/dist/chunks/PublicLayout-3v46YZdi.cjs.map +0 -1
- package/dist/chunks/PublicLayout-B4wGo0ut.js +0 -139
- package/dist/chunks/PublicLayout-B4wGo0ut.js.map +0 -1
- package/dist/chunks/SSOHandler-C72Do3RD.js +0 -15717
- package/dist/chunks/SSOHandler-C72Do3RD.js.map +0 -1
- package/dist/chunks/SSOHandler-ColywAGZ.cjs +0 -184
- package/dist/chunks/SSOHandler-ColywAGZ.cjs.map +0 -1
- package/dist/chunks/SearchBoxContext-DDBY44Wr.cjs +0 -2
- package/dist/chunks/UtilsContext-C4tlOndT.cjs +0 -2
- package/dist/chunks/UtilsContext-C4tlOndT.cjs.map +0 -1
- package/dist/chunks/_commonjsHelpers-C6fGbg64.js +0 -7
- package/dist/chunks/_commonjsHelpers-C6fGbg64.js.map +0 -1
- package/dist/chunks/_commonjsHelpers-DwGv2jUC.cjs +0 -2
- package/dist/chunks/_commonjsHelpers-DwGv2jUC.cjs.map +0 -1
- package/dist/chunks/codeStore-KPL92rcv.cjs +0 -2
- package/dist/chunks/commonUtils-Cvx6_eK2.js.map +0 -1
- package/dist/chunks/commonUtils-DaFg0y7C.cjs +0 -2
- package/dist/chunks/commonUtils-DaFg0y7C.cjs.map +0 -1
- package/dist/chunks/menuViewStore-DuS0VmkB.cjs +0 -3
- package/dist/chunks/menuViewStore-DuS0VmkB.cjs.map +0 -1
- package/dist/chunks/menuViewStore-OKcSQq-s.js +0 -343
- package/dist/chunks/menuViewStore-OKcSQq-s.js.map +0 -1
- package/dist/chunks/popupStore-BEoWGajT.cjs +0 -2
- package/dist/chunks/popupStore-BEoWGajT.cjs.map +0 -1
- package/dist/chunks/popupStore-D8RI04bU.js.map +0 -1
- package/dist/chunks/serviceConfig-9dHegQIK.cjs +0 -3
- package/dist/chunks/serviceConfig-9dHegQIK.cjs.map +0 -1
- package/dist/chunks/serviceConfig-Dhe7neaj.js +0 -709
- package/dist/chunks/serviceConfig-Dhe7neaj.js.map +0 -1
- package/scripts/gen-component-registry.js +0 -138
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commonUtils-Bb16Yqjk.js","sources":["../../node_modules/dayjs/locale/ko.js","../../node_modules/dayjs/plugin/relativeTime.js","../../node_modules/dayjs/plugin/utc.js","../../node_modules/dayjs/plugin/timezone.js","../../src/utils/dateUtils.ts","../../src/utils/objectUtils.ts","../../src/utils/arrayUtils.ts","../../src/utils/commonUtils.ts"],"sourcesContent":["!function(e,_){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=_(require(\"dayjs\")):\"function\"==typeof define&&define.amd?define([\"dayjs\"],_):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_locale_ko=_(e.dayjs)}(this,(function(e){\"use strict\";function _(e){return e&&\"object\"==typeof e&&\"default\"in e?e:{default:e}}var d=_(e),t={name:\"ko\",weekdays:\"일요일_월요일_화요일_수요일_목요일_금요일_토요일\".split(\"_\"),weekdaysShort:\"일_월_화_수_목_금_토\".split(\"_\"),weekdaysMin:\"일_월_화_수_목_금_토\".split(\"_\"),months:\"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월\".split(\"_\"),monthsShort:\"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월\".split(\"_\"),ordinal:function(e){return e+\"일\"},formats:{LT:\"A h:mm\",LTS:\"A h:mm:ss\",L:\"YYYY.MM.DD.\",LL:\"YYYY년 MMMM D일\",LLL:\"YYYY년 MMMM D일 A h:mm\",LLLL:\"YYYY년 MMMM D일 dddd A h:mm\",l:\"YYYY.MM.DD.\",ll:\"YYYY년 MMMM D일\",lll:\"YYYY년 MMMM D일 A h:mm\",llll:\"YYYY년 MMMM D일 dddd A h:mm\"},meridiem:function(e){return e<12?\"오전\":\"오후\"},relativeTime:{future:\"%s 후\",past:\"%s 전\",s:\"몇 초\",m:\"1분\",mm:\"%d분\",h:\"한 시간\",hh:\"%d시간\",d:\"하루\",dd:\"%d일\",M:\"한 달\",MM:\"%d달\",y:\"일 년\",yy:\"%d년\"}};return d.default.locale(t,null,!0),t}));","!function(r,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(r=\"undefined\"!=typeof globalThis?globalThis:r||self).dayjs_plugin_relativeTime=e()}(this,(function(){\"use strict\";return function(r,e,t){r=r||{};var n=e.prototype,o={future:\"in %s\",past:\"%s ago\",s:\"a few seconds\",m:\"a minute\",mm:\"%d minutes\",h:\"an hour\",hh:\"%d hours\",d:\"a day\",dd:\"%d days\",M:\"a month\",MM:\"%d months\",y:\"a year\",yy:\"%d years\"};function i(r,e,t,o){return n.fromToBase(r,e,t,o)}t.en.relativeTime=o,n.fromToBase=function(e,n,i,d,u){for(var f,a,s,l=i.$locale().relativeTime||o,h=r.thresholds||[{l:\"s\",r:44,d:\"second\"},{l:\"m\",r:89},{l:\"mm\",r:44,d:\"minute\"},{l:\"h\",r:89},{l:\"hh\",r:21,d:\"hour\"},{l:\"d\",r:35},{l:\"dd\",r:25,d:\"day\"},{l:\"M\",r:45},{l:\"MM\",r:10,d:\"month\"},{l:\"y\",r:17},{l:\"yy\",d:\"year\"}],m=h.length,c=0;c<m;c+=1){var y=h[c];y.d&&(f=d?t(e).diff(i,y.d,!0):i.diff(e,y.d,!0));var p=(r.rounding||Math.round)(Math.abs(f));if(s=f>0,p<=y.r||!y.r){p<=1&&c>0&&(y=h[c-1]);var v=l[y.l];u&&(p=u(\"\"+p)),a=\"string\"==typeof v?v.replace(\"%d\",p):v(p,n,y.l,s);break}}if(n)return a;var M=s?l.future:l.past;return\"function\"==typeof M?M(a):M.replace(\"%s\",a)},n.to=function(r,e){return i(r,e,this,!0)},n.from=function(r,e){return i(r,e,this)};var d=function(r){return r.$u?t.utc():t()};n.toNow=function(r){return this.to(d(this),r)},n.fromNow=function(r){return this.from(d(this),r)}}}));","!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_utc=i()}(this,(function(){\"use strict\";var t=\"minute\",i=/[+-]\\d\\d(?::?\\d\\d)?/g,e=/([+-]|\\d\\d)/g;return function(s,f,n){var u=f.prototype;n.utc=function(t){var i={date:t,utc:!0,args:arguments};return new f(i)},u.utc=function(i){var e=n(this.toDate(),{locale:this.$L,utc:!0});return i?e.add(this.utcOffset(),t):e},u.local=function(){return n(this.toDate(),{locale:this.$L,utc:!1})};var r=u.parse;u.parse=function(t){t.utc&&(this.$u=!0),this.$utils().u(t.$offset)||(this.$offset=t.$offset),r.call(this,t)};var o=u.init;u.init=function(){if(this.$u){var t=this.$d;this.$y=t.getUTCFullYear(),this.$M=t.getUTCMonth(),this.$D=t.getUTCDate(),this.$W=t.getUTCDay(),this.$H=t.getUTCHours(),this.$m=t.getUTCMinutes(),this.$s=t.getUTCSeconds(),this.$ms=t.getUTCMilliseconds()}else o.call(this)};var a=u.utcOffset;u.utcOffset=function(s,f){var n=this.$utils().u;if(n(s))return this.$u?0:n(this.$offset)?a.call(this):this.$offset;if(\"string\"==typeof s&&(s=function(t){void 0===t&&(t=\"\");var s=t.match(i);if(!s)return null;var f=(\"\"+s[0]).match(e)||[\"-\",0,0],n=f[0],u=60*+f[1]+ +f[2];return 0===u?0:\"+\"===n?u:-u}(s),null===s))return this;var u=Math.abs(s)<=16?60*s:s;if(0===u)return this.utc(f);var r=this.clone();if(f)return r.$offset=u,r.$u=!1,r;var o=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();return(r=this.local().add(u+o,t)).$offset=u,r.$x.$localOffset=o,r};var h=u.format;u.format=function(t){var i=t||(this.$u?\"YYYY-MM-DDTHH:mm:ss[Z]\":\"\");return h.call(this,i)},u.valueOf=function(){var t=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*t},u.isUTC=function(){return!!this.$u},u.toISOString=function(){return this.toDate().toISOString()},u.toString=function(){return this.toDate().toUTCString()};var l=u.toDate;u.toDate=function(t){return\"s\"===t&&this.$offset?n(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\")).toDate():l.call(this)};var c=u.diff;u.diff=function(t,i,e){if(t&&this.$u===t.$u)return c.call(this,t,i,e);var s=this.local(),f=n(t).local();return c.call(s,f,i,e)}}}));","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_timezone=e()}(this,(function(){\"use strict\";var t={year:0,month:1,day:2,hour:3,minute:4,second:5},e={};return function(n,i,o){var r,a=function(t,n,i){void 0===i&&(i={});var o=new Date(t),r=function(t,n){void 0===n&&(n={});var i=n.timeZoneName||\"short\",o=t+\"|\"+i,r=e[o];return r||(r=new Intl.DateTimeFormat(\"en-US\",{hour12:!1,timeZone:t,year:\"numeric\",month:\"2-digit\",day:\"2-digit\",hour:\"2-digit\",minute:\"2-digit\",second:\"2-digit\",timeZoneName:i}),e[o]=r),r}(n,i);return r.formatToParts(o)},u=function(e,n){for(var i=a(e,n),r=[],u=0;u<i.length;u+=1){var f=i[u],s=f.type,m=f.value,c=t[s];c>=0&&(r[c]=parseInt(m,10))}var d=r[3],l=24===d?0:d,h=r[0]+\"-\"+r[1]+\"-\"+r[2]+\" \"+l+\":\"+r[4]+\":\"+r[5]+\":000\",v=+e;return(o.utc(h).valueOf()-(v-=v%1e3))/6e4},f=i.prototype;f.tz=function(t,e){void 0===t&&(t=r);var n,i=this.utcOffset(),a=this.toDate(),u=a.toLocaleString(\"en-US\",{timeZone:t}),f=Math.round((a-new Date(u))/1e3/60),s=15*-Math.round(a.getTimezoneOffset()/15)-f;if(!Number(s))n=this.utcOffset(0,e);else if(n=o(u,{locale:this.$L}).$set(\"millisecond\",this.$ms).utcOffset(s,!0),e){var m=n.utcOffset();n=n.add(i-m,\"minute\")}return n.$x.$timezone=t,n},f.offsetName=function(t){var e=this.$x.$timezone||o.tz.guess(),n=a(this.valueOf(),e,{timeZoneName:t}).find((function(t){return\"timezonename\"===t.type.toLowerCase()}));return n&&n.value};var s=f.startOf;f.startOf=function(t,e){if(!this.$x||!this.$x.$timezone)return s.call(this,t,e);var n=o(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\"),{locale:this.$L});return s.call(n,t,e).tz(this.$x.$timezone,!0)},o.tz=function(t,e,n){var i=n&&e,a=n||e||r,f=u(+o(),a);if(\"string\"!=typeof t)return o(t).tz(a);var s=function(t,e,n){var i=t-60*e*1e3,o=u(i,n);if(e===o)return[i,e];var r=u(i-=60*(o-e)*1e3,n);return o===r?[i,o]:[t-60*Math.min(o,r)*1e3,Math.max(o,r)]}(o.utc(t,i).valueOf(),f,a),m=s[0],c=s[1],d=o(m).utcOffset(c);return d.$x.$timezone=a,d},o.tz.guess=function(){return Intl.DateTimeFormat().resolvedOptions().timeZone},o.tz.setDefault=function(t){r=t}}}));","import dayjs, { Dayjs } from 'dayjs'\r\nimport 'dayjs/locale/ko'\r\nimport relativeTime from 'dayjs/plugin/relativeTime'\r\nimport utc from 'dayjs/plugin/utc'\r\nimport timezone from 'dayjs/plugin/timezone'\r\n\r\n// dayjs 플러그인 설정\r\ndayjs.extend(relativeTime)\r\ndayjs.extend(utc)\r\ndayjs.extend(timezone)\r\ndayjs.locale('ko')\r\n\r\n/**\r\n * 날짜 유틸리티 함수들\r\n */\r\n\r\n// 현재 날짜/시간 가져오기\r\nexport const getCurrentDate = (): Dayjs => dayjs()\r\nexport const getCurrentDateString = (format: string = 'YYYY-MM-DD'): string => dayjs().format(format)\r\n\r\n// 날짜 포맷팅\r\nexport const formatDate = (date: string | Date | Dayjs, format: string = 'YYYY-MM-DD'): string => {\r\n return dayjs(date).format(format)\r\n}\r\n\r\n// 한국 시간대로 포맷팅\r\nexport const formatDateKST = (date: string | Date | Dayjs, format: string = 'YYYY-MM-DD HH:mm:ss'): string => {\r\n return dayjs(date).tz('Asia/Seoul').format(format)\r\n}\r\n\r\n// 상대적 시간 표시 (예: 3분 전, 1시간 전)\r\nexport const getRelativeTime = (date: string | Date | Dayjs): string => {\r\n return dayjs(date).fromNow()\r\n}\r\n\r\n// 날짜 차이 계산\r\nexport const getDateDiff = (date1: string | Date | Dayjs, date2: string | Date | Dayjs, unit: 'day' | 'hour' | 'minute' = 'day'): number => {\r\n return dayjs(date1).diff(dayjs(date2), unit)\r\n}\r\n\r\n// 특정 날짜가 오늘인지 확인\r\nexport const isToday = (date: string | Date | Dayjs): boolean => {\r\n return dayjs(date).isSame(dayjs(), 'day')\r\n}\r\n\r\n// 특정 날짜가 이번 주인지 확인\r\nexport const isThisWeek = (date: string | Date | Dayjs): boolean => {\r\n return dayjs(date).isSame(dayjs(), 'week')\r\n}\r\n\r\n// 특정 날짜가 이번 달인지 확인\r\nexport const isThisMonth = (date: string | Date | Dayjs): boolean => {\r\n return dayjs(date).isSame(dayjs(), 'month')\r\n}\r\n\r\n// 주의 시작일 (월요일)\r\nexport const getWeekStart = (date: string | Date | Dayjs = dayjs()): Dayjs => {\r\n return dayjs(date).startOf('week')\r\n}\r\n\r\n// 주의 마지막일 (일요일)\r\nexport const getWeekEnd = (date: string | Date | Dayjs = dayjs()): Dayjs => {\r\n return dayjs(date).endOf('week')\r\n}\r\n\r\n// 월의 시작일\r\nexport const getMonthStart = (date: string | Date | Dayjs = dayjs()): Dayjs => {\r\n return dayjs(date).startOf('month')\r\n}\r\n\r\n// 월의 마지막일\r\nexport const getMonthEnd = (date: string | Date | Dayjs = dayjs()): Dayjs => {\r\n return dayjs(date).endOf('month')\r\n}\r\n\r\n// 날짜 범위 생성 (시작일부터 종료일까지)\r\nexport const getDateRange = (startDate: string | Date | Dayjs, endDate: string | Date | Dayjs): Dayjs[] => {\r\n const dates: Dayjs[] = []\r\n let current = dayjs(startDate)\r\n const end = dayjs(endDate)\r\n \r\n while (current.isBefore(end) || current.isSame(end, 'day')) {\r\n dates.push(current)\r\n current = current.add(1, 'day')\r\n }\r\n \r\n return dates\r\n}\r\n\r\n// Ant Design DatePicker용 날짜 범위\r\nexport const getDateRangeForPicker = (startDate: string | Date | Dayjs, endDate: string | Date | Dayjs): [Dayjs, Dayjs] => {\r\n return [dayjs(startDate), dayjs(endDate)]\r\n}\r\n\r\n// 날짜 유효성 검사\r\nexport const isValidDate = (date: string | Date | Dayjs): boolean => {\r\n return dayjs(date).isValid()\r\n}\r\n\r\n// 나이 계산\r\nexport const calculateAge = (birthDate: string | Date | Dayjs): number => {\r\n return dayjs().diff(dayjs(birthDate), 'year')\r\n}\r\n\r\n// 주말 여부 확인\r\nexport const isWeekend = (date: string | Date | Dayjs): boolean => {\r\n const day = dayjs(date).day()\r\n return day === 0 || day === 6\r\n}\r\n\r\n// 평일 여부 확인\r\nexport const isWeekday = (date: string | Date | Dayjs): boolean => {\r\n return !isWeekend(date)\r\n}\r\n\r\n// 날짜를 한국어로 표시\r\nexport const formatDateKorean = (date: string | Date | Dayjs): string => {\r\n return dayjs(date).format('YYYY년 MM월 DD일')\r\n}\r\n\r\n// 시간을 한국어로 표시\r\nexport const formatTimeKorean = (date: string | Date | Dayjs): string => {\r\n return dayjs(date).format('HH시 mm분')\r\n}\r\n\r\n// 날짜와 시간을 한국어로 표시\r\nexport const formatDateTimeKorean = (date: string | Date | Dayjs): string => {\r\n return dayjs(date).format('YYYY년 MM월 DD일 HH시 mm분')\r\n} ","/**\r\n * 객체 유틸리티 함수들\r\n */\r\n\r\n// 객체가 비어있는지 확인\r\nexport const isEmptyObject = (obj: object): boolean => {\r\n return Object.keys(obj).length === 0;\r\n};\r\n\r\n// 객체가 비어있지 않은지 확인\r\nexport const isNotEmptyObject = (obj: object): boolean => {\r\n return !isEmptyObject(obj);\r\n};\r\n\r\n// 객체의 깊은 복사\r\nexport const deepClone = <T>(obj: T): T => {\r\n if (obj === null || typeof obj !== 'object') return obj;\r\n if (obj instanceof Date) return new Date(obj.getTime()) as T;\r\n if (obj instanceof Array) return obj.map(item => deepClone(item)) as T;\r\n if (typeof obj === 'object') {\r\n const clonedObj = {} as T;\r\n for (const key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n clonedObj[key] = deepClone(obj[key]);\r\n }\r\n }\r\n return clonedObj;\r\n }\r\n return obj;\r\n};\r\n\r\n// 객체에서 특정 키들만 선택\r\nexport const pick = <T extends object, K extends keyof T>(\r\n obj: T,\r\n keys: K[]\r\n): Pick<T, K> => {\r\n const result = {} as Pick<T, K>;\r\n keys.forEach(key => {\r\n if (key in obj) {\r\n result[key] = obj[key];\r\n }\r\n });\r\n return result;\r\n};\r\n\r\n// 객체에서 특정 키들 제외\r\nexport const omit = <T extends object, K extends keyof T>(\r\n obj: T,\r\n keys: K[]\r\n): Omit<T, K> => {\r\n const result = { ...obj } as Omit<T, K>;\r\n keys.forEach(key => {\r\n delete (result as any)[key];\r\n });\r\n return result;\r\n};\r\n\r\n// 객체의 모든 값 가져오기\r\nexport const values = <T extends object>(obj: T): T[keyof T][] => {\r\n return Object.values(obj);\r\n};\r\n\r\n// 객체의 모든 키 가져오기\r\nexport const keys = <T extends object>(obj: T): (keyof T)[] => {\r\n return Object.keys(obj) as (keyof T)[];\r\n};\r\n\r\n// 객체의 모든 키-값 쌍 가져오기\r\nexport const entries = <T extends object>(obj: T): [keyof T, T[keyof T]][] => {\r\n return Object.entries(obj) as [keyof T, T[keyof T]][];\r\n};\r\n\r\n// 객체 병합 (깊은 병합)\r\nexport const merge = <T extends object>(\r\n target: T,\r\n ...sources: Partial<T>[]\r\n): T => {\r\n const result = deepClone(target);\r\n\r\n sources.forEach(source => {\r\n if (source) {\r\n Object.keys(source).forEach(key => {\r\n const targetKey = key as keyof T;\r\n const sourceValue = source[targetKey];\r\n const targetValue = result[targetKey];\r\n\r\n if (\r\n sourceValue &&\r\n typeof sourceValue === 'object' &&\r\n !Array.isArray(sourceValue) &&\r\n targetValue &&\r\n typeof targetValue === 'object' &&\r\n !Array.isArray(targetValue)\r\n ) {\r\n result[targetKey] = merge(targetValue, sourceValue);\r\n } else {\r\n result[targetKey] = sourceValue;\r\n }\r\n });\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\n// 객체에서 null/undefined 값 제거\r\nexport const removeNullValues = <T extends object>(obj: T): Partial<T> => {\r\n const result = {} as Partial<T>;\r\n\r\n Object.keys(obj).forEach(key => {\r\n const value = obj[key as keyof T];\r\n if (value !== null && value !== undefined) {\r\n result[key as keyof T] = value;\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\n// 객체에서 빈 문자열 제거\r\nexport const removeEmptyStrings = <T extends object>(obj: T): Partial<T> => {\r\n const result = {} as Partial<T>;\r\n\r\n Object.keys(obj).forEach(key => {\r\n const value = obj[key as keyof T];\r\n if (value !== '') {\r\n result[key as keyof T] = value;\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\n// 객체를 쿼리 문자열로 변환\r\nexport const toQueryString = (obj: Record<string, any>): string => {\r\n const params = new URLSearchParams();\r\n\r\n Object.keys(obj).forEach(key => {\r\n const value = obj[key];\r\n if (value !== null && value !== undefined) {\r\n params.append(key, String(value));\r\n }\r\n });\r\n\r\n return params.toString();\r\n};\r\n\r\n// 쿼리 문자열을 객체로 변환\r\nexport const fromQueryString = (\r\n queryString: string\r\n): Record<string, string> => {\r\n const params = new URLSearchParams(queryString);\r\n const result: Record<string, string> = {};\r\n\r\n params.forEach((value, key) => {\r\n result[key] = value;\r\n });\r\n\r\n return result;\r\n};\r\n\r\n// 객체의 중첩된 속성 값 가져오기\r\nexport const get = <T>(\r\n obj: any,\r\n path: string,\r\n defaultValue?: T\r\n): T | undefined => {\r\n const keys = path.split('.');\r\n let result = obj;\r\n\r\n for (const key of keys) {\r\n if (result === null || result === undefined) {\r\n return defaultValue;\r\n }\r\n result = result[key];\r\n }\r\n\r\n return result !== undefined ? result : defaultValue;\r\n};\r\n\r\n// 객체의 중첩된 속성 값 설정\r\nexport const set = <T extends object>(obj: T, path: string, value: any): T => {\r\n const keys = path.split('.');\r\n const result = deepClone(obj);\r\n let current = result;\r\n\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n const key = keys[i];\r\n if (!(key in current) || typeof current[key] !== 'object') {\r\n current[key] = {};\r\n }\r\n current = current[key];\r\n }\r\n\r\n current[keys[keys.length - 1]] = value;\r\n return result;\r\n};\r\n\r\n// 객체의 모든 중첩된 키들 가져오기\r\nexport const getAllKeys = (obj: any, prefix = ''): string[] => {\r\n const keys: string[] = [];\r\n\r\n for (const key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n const newKey = prefix ? `${prefix}.${key}` : key;\r\n keys.push(newKey);\r\n\r\n if (\r\n obj[key] &&\r\n typeof obj[key] === 'object' &&\r\n !Array.isArray(obj[key])\r\n ) {\r\n keys.push(...getAllKeys(obj[key], newKey));\r\n }\r\n }\r\n }\r\n\r\n return keys;\r\n};\r\n\r\n// 객체를 플랫하게 만들기\r\nexport const flatten = (obj: any, prefix = ''): Record<string, any> => {\r\n const result: Record<string, any> = {};\r\n\r\n for (const key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n const newKey = prefix ? `${prefix}.${key}` : key;\r\n\r\n if (\r\n obj[key] &&\r\n typeof obj[key] === 'object' &&\r\n !Array.isArray(obj[key])\r\n ) {\r\n Object.assign(result, flatten(obj[key], newKey));\r\n } else {\r\n result[newKey] = obj[key];\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n\r\n// 객체 비교 (깊은 비교)\r\nexport const isEqual = (obj1: any, obj2: any): boolean => {\r\n if (obj1 === obj2) return true;\r\n if (obj1 == null || obj2 == null) return false;\r\n if (typeof obj1 !== typeof obj2) return false;\r\n\r\n if (typeof obj1 !== 'object') return obj1 === obj2;\r\n\r\n const keys1 = Object.keys(obj1);\r\n const keys2 = Object.keys(obj2);\r\n\r\n if (keys1.length !== keys2.length) return false;\r\n\r\n for (const key of keys1) {\r\n if (!keys2.includes(key)) return false;\r\n if (!isEqual(obj1[key], obj2[key])) return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\n// 객체 크기 (키 개수)\r\nexport const size = (obj: object): number => {\r\n return Object.keys(obj).length;\r\n};\r\n\r\n// 객체가 특정 키를 가지고 있는지 확인\r\nexport const has = (obj: object, key: string): boolean => {\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n};\r\n\r\n// 객체의 모든 값이 조건을 만족하는지 확인\r\nexport const every = <T extends object>(\r\n obj: T,\r\n predicate: (value: T[keyof T], key: keyof T) => boolean\r\n): boolean => {\r\n return Object.keys(obj).every(key =>\r\n predicate(obj[key as keyof T], key as keyof T)\r\n );\r\n};\r\n\r\n// 객체의 일부 값이 조건을 만족하는지 확인\r\nexport const some = <T extends object>(\r\n obj: T,\r\n predicate: (value: T[keyof T], key: keyof T) => boolean\r\n): boolean => {\r\n return Object.keys(obj).some(key =>\r\n predicate(obj[key as keyof T], key as keyof T)\r\n );\r\n};\r\n\r\n// 객체를 필터링\r\nexport const filter = <T extends object>(\r\n obj: T,\r\n predicate: (value: T[keyof T], key: keyof T) => boolean\r\n): Partial<T> => {\r\n const result = {} as Partial<T>;\r\n\r\n Object.keys(obj).forEach(key => {\r\n const k = key as keyof T;\r\n if (predicate(obj[k], k)) {\r\n result[k] = obj[k];\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\n// 객체를 매핑\r\nexport const map = <T extends object, U>(\r\n obj: T,\r\n mapper: (value: T[keyof T], key: keyof T) => U\r\n): Record<keyof T, U> => {\r\n const result = {} as Record<keyof T, U>;\r\n\r\n Object.keys(obj).forEach(key => {\r\n const k = key as keyof T;\r\n result[k] = mapper(obj[k], k);\r\n });\r\n\r\n return result;\r\n};\r\n","/**\r\n * 배열 유틸리티 함수들\r\n */\r\n\r\n// 배열이 비어있는지 확인\r\nexport const isEmptyArray = <T>(arr: T[]): boolean => {\r\n return !arr || arr.length === 0\r\n}\r\n\r\n// 배열이 비어있지 않은지 확인\r\nexport const isNotEmptyArray = <T>(arr: T[]): boolean => {\r\n return !isEmptyArray(arr)\r\n}\r\n\r\n// 배열 중복 제거\r\nexport const unique = <T>(arr: T[]): T[] => {\r\n return [...new Set(arr)]\r\n}\r\n\r\n// 객체 배열에서 특정 키로 중복 제거\r\nexport const uniqueBy = <T>(arr: T[], key: keyof T): T[] => {\r\n const seen = new Set()\r\n return arr.filter(item => {\r\n const value = item[key]\r\n if (seen.has(value)) {\r\n return false\r\n }\r\n seen.add(value)\r\n return true\r\n })\r\n}\r\n\r\n// 배열을 청크로 나누기\r\nexport const chunk = <T>(arr: T[], size: number): T[][] => {\r\n const chunks: T[][] = []\r\n for (let i = 0; i < arr.length; i += size) {\r\n chunks.push(arr.slice(i, i + size))\r\n }\r\n return chunks\r\n}\r\n\r\n// 배열 섞기 (Fisher-Yates 알고리즘)\r\nexport const shuffle = <T>(arr: T[]): T[] => {\r\n const shuffled = [...arr]\r\n for (let i = shuffled.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1))\r\n ;[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]\r\n }\r\n return shuffled\r\n}\r\n\r\n// 배열에서 랜덤 요소 가져오기\r\nexport const randomFromArray = <T>(arr: T[]): T | undefined => {\r\n if (isEmptyArray(arr)) return undefined\r\n return arr[Math.floor(Math.random() * arr.length)]\r\n}\r\n\r\n// 배열에서 여러 개의 랜덤 요소 가져오기\r\nexport const randomMultiple = <T>(arr: T[], count: number): T[] => {\r\n const shuffled = shuffle(arr)\r\n return shuffled.slice(0, Math.min(count, arr.length))\r\n}\r\n\r\n// 배열 정렬 (숫자)\r\nexport const sortNumbers = (arr: number[], ascending: boolean = true): number[] => {\r\n return [...arr].sort((a, b) => ascending ? a - b : b - a)\r\n}\r\n\r\n// 객체 배열을 특정 키로 정렬\r\nexport const sortBy = <T>(arr: T[], key: keyof T, ascending: boolean = true): T[] => {\r\n return [...arr].sort((a, b) => {\r\n const aVal = a[key]\r\n const bVal = b[key]\r\n \r\n if (aVal < bVal) return ascending ? -1 : 1\r\n if (aVal > bVal) return ascending ? 1 : -1\r\n return 0\r\n })\r\n}\r\n\r\n// 배열에서 최대값 찾기\r\nexport const max = (arr: number[]): number | undefined => {\r\n if (isEmptyArray(arr)) return undefined\r\n return Math.max(...arr)\r\n}\r\n\r\n// 배열에서 최소값 찾기\r\nexport const min = (arr: number[]): number | undefined => {\r\n if (isEmptyArray(arr)) return undefined\r\n return Math.min(...arr)\r\n}\r\n\r\n// 배열 평균 계산\r\nexport const average = (arr: number[]): number | undefined => {\r\n if (isEmptyArray(arr)) return undefined\r\n return arr.reduce((sum, num) => sum + num, 0) / arr.length\r\n}\r\n\r\n// 배열 합계 계산\r\nexport const sum = (arr: number[]): number => {\r\n return arr.reduce((sum, num) => sum + num, 0)\r\n}\r\n\r\n// 배열에서 특정 조건을 만족하는 요소 개수 세기\r\nexport const count = <T>(arr: T[], predicate: (item: T) => boolean): number => {\r\n return arr.filter(predicate).length\r\n}\r\n\r\n// 배열에서 특정 요소의 인덱스 찾기 (마지막)\r\nexport const lastIndexOf = <T>(arr: T[], item: T): number => {\r\n for (let i = arr.length - 1; i >= 0; i--) {\r\n if (arr[i] === item) return i\r\n }\r\n return -1\r\n}\r\n\r\n// 배열에서 특정 조건을 만족하는 첫 번째 요소 찾기\r\nexport const find = <T>(arr: T[], predicate: (item: T) => boolean): T | undefined => {\r\n return arr.find(predicate)\r\n}\r\n\r\n// 배열에서 특정 조건을 만족하는 마지막 요소 찾기\r\nexport const findLast = <T>(arr: T[], predicate: (item: T) => boolean): T | undefined => {\r\n for (let i = arr.length - 1; i >= 0; i--) {\r\n if (predicate(arr[i])) return arr[i]\r\n }\r\n return undefined\r\n}\r\n\r\n// 배열에서 특정 요소 제거\r\nexport const remove = <T>(arr: T[], item: T): T[] => {\r\n return arr.filter(i => i !== item)\r\n}\r\n\r\n// 배열에서 특정 인덱스의 요소 제거\r\nexport const removeAt = <T>(arr: T[], index: number): T[] => {\r\n if (index < 0 || index >= arr.length) return arr\r\n return [...arr.slice(0, index), ...arr.slice(index + 1)]\r\n}\r\n\r\n// 배열에서 특정 조건을 만족하는 요소들 제거\r\nexport const removeWhere = <T>(arr: T[], predicate: (item: T) => boolean): T[] => {\r\n return arr.filter(item => !predicate(item))\r\n}\r\n\r\n// 배열에서 특정 요소가 포함되어 있는지 확인\r\nexport const includes = <T>(arr: T[], item: T): boolean => {\r\n return arr.includes(item)\r\n}\r\n\r\n// 두 배열의 교집합\r\nexport const intersection = <T>(arr1: T[], arr2: T[]): T[] => {\r\n return arr1.filter(item => arr2.includes(item))\r\n}\r\n\r\n// 두 배열의 합집합\r\nexport const union = <T>(arr1: T[], arr2: T[]): T[] => {\r\n return unique([...arr1, ...arr2])\r\n}\r\n\r\n// 두 배열의 차집합\r\nexport const difference = <T>(arr1: T[], arr2: T[]): T[] => {\r\n return arr1.filter(item => !arr2.includes(item))\r\n}\r\n\r\n// 배열을 그룹으로 나누기\r\nexport const groupBy = <T, K extends string | number | symbol>(\r\n arr: T[], \r\n keySelector: (item: T) => K\r\n): Record<K, T[]> => {\r\n return arr.reduce((groups, item) => {\r\n const key = keySelector(item)\r\n if (!groups[key]) {\r\n groups[key] = []\r\n }\r\n groups[key].push(item)\r\n return groups\r\n }, {} as Record<K, T[]>)\r\n}\r\n\r\n// 배열을 플랫하게 만들기 (중첩 배열)\r\nexport const flattenArray = <T>(arr: T[][]): T[] => {\r\n return arr.flat()\r\n}\r\n\r\n// 배열을 깊게 플랫하게 만들기\r\nexport const flattenDeep = (arr: any[]): any[] => {\r\n return arr.reduce((flat: any[], item) => {\r\n return flat.concat(Array.isArray(item) ? flattenDeep(item) : item)\r\n }, [])\r\n}\r\n\r\n// 배열에서 특정 범위의 요소들 가져오기\r\nexport const range = <T>(arr: T[], start: number, end?: number): T[] => {\r\n const endIndex = end ?? arr.length\r\n return arr.slice(start, endIndex)\r\n}\r\n\r\n// 배열을 뒤집기\r\nexport const reverse = <T>(arr: T[]): T[] => {\r\n return [...arr].reverse()\r\n}\r\n\r\n// 배열에서 중복 요소들 찾기\r\nexport const duplicates = <T>(arr: T[]): T[] => {\r\n const seen = new Set<T>()\r\n const duplicates = new Set<T>()\r\n \r\n arr.forEach(item => {\r\n if (seen.has(item)) {\r\n duplicates.add(item)\r\n } else {\r\n seen.add(item)\r\n }\r\n })\r\n \r\n return Array.from(duplicates)\r\n} ","/**\r\n * 일반적인 유틸리티 함수들\r\n */\r\n\r\n// 타입 가드 함수들\r\nexport const isString = (value: any): value is string => typeof value === 'string'\r\nexport const isNumber = (value: any): value is number => typeof value === 'number' && !isNaN(value)\r\nexport const isBoolean = (value: any): value is boolean => typeof value === 'boolean'\r\nexport const isFunction = (value: any): value is Function => typeof value === 'function'\r\nexport const isObject = (value: any): value is object => value !== null && typeof value === 'object'\r\nexport const isArray = (value: any): value is any[] => Array.isArray(value)\r\nexport const isNull = (value: any): value is null => value === null\r\nexport const isUndefined = (value: any): value is undefined => value === undefined\r\nexport const isNullOrUndefined = (value: any): value is null | undefined => value === null || value === undefined\r\n\r\n// 숫자 관련\r\nexport const clamp = (value: number, min: number, max: number): number => {\r\n return Math.min(Math.max(value, min), max)\r\n}\r\n\r\nexport const round = (value: number, decimals: number = 0): number => {\r\n return Math.round(value * Math.pow(10, decimals)) / Math.pow(10, decimals)\r\n}\r\n\r\nexport const formatNumber = (num: number, locale: string = 'ko-KR'): string => {\r\n return new Intl.NumberFormat(locale).format(num)\r\n}\r\n\r\nexport const formatCurrency = (amount: number, currency: string = 'KRW', locale: string = 'ko-KR'): string => {\r\n return new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currency: currency\r\n }).format(amount)\r\n}\r\n\r\nexport const formatPercent = (value: number, decimals: number = 2): string => {\r\n return `${(value * 100).toFixed(decimals)}%`\r\n}\r\n\r\n// 랜덤 관련\r\nexport const random = (min: number, max: number): number => {\r\n return Math.random() * (max - min) + min\r\n}\r\n\r\nexport const randomInt = (min: number, max: number): number => {\r\n return Math.floor(Math.random() * (max - min + 1)) + min\r\n}\r\n\r\nexport const randomChoice = <T>(array: T[]): T | undefined => {\r\n if (array.length === 0) return undefined\r\n return array[Math.floor(Math.random() * array.length)]\r\n}\r\n\r\n// 디바운스 함수\r\nexport const debounce = <T extends (...args: any[]) => any>(\r\n func: T,\r\n delay: number\r\n): ((...args: Parameters<T>) => void) => {\r\n let timeoutId: ReturnType<typeof setTimeout>\r\n \r\n return (...args: Parameters<T>) => {\r\n clearTimeout(timeoutId)\r\n timeoutId = setTimeout(() => func(...args), delay)\r\n }\r\n}\r\n\r\n// 쓰로틀 함수\r\nexport const throttle = <T extends (...args: any[]) => any>(\r\n func: T,\r\n delay: number\r\n): ((...args: Parameters<T>) => void) => {\r\n let lastCall = 0\r\n \r\n return (...args: Parameters<T>) => {\r\n const now = Date.now()\r\n if (now - lastCall >= delay) {\r\n lastCall = now\r\n func(...args)\r\n }\r\n }\r\n}\r\n\r\n// 딜레이 함수\r\nexport const delay = (ms: number): Promise<void> => {\r\n return new Promise(resolve => setTimeout(resolve, ms))\r\n}\r\n\r\n// 로컬 스토리지 관련\r\nexport const setLocalStorage = (key: string, value: any): void => {\r\n try {\r\n localStorage.setItem(key, JSON.stringify(value))\r\n } catch (error) {\r\n console.error('Error saving to localStorage:', error)\r\n }\r\n}\r\n\r\nexport const getLocalStorage = <T>(key: string, defaultValue?: T): T | null => {\r\n try {\r\n const item = localStorage.getItem(key)\r\n return item ? JSON.parse(item) : defaultValue || null\r\n } catch (error) {\r\n console.error('Error reading from localStorage:', error)\r\n return defaultValue || null\r\n }\r\n}\r\n\r\nexport const removeLocalStorage = (key: string): void => {\r\n try {\r\n localStorage.removeItem(key)\r\n } catch (error) {\r\n console.error('Error removing from localStorage:', error)\r\n }\r\n}\r\n\r\nexport const clearLocalStorage = (): void => {\r\n try {\r\n localStorage.clear()\r\n } catch (error) {\r\n console.error('Error clearing localStorage:', error)\r\n }\r\n}\r\n\r\n// 세션 스토리지 관련\r\nexport const setSessionStorage = (key: string, value: any): void => {\r\n try {\r\n sessionStorage.setItem(key, JSON.stringify(value))\r\n } catch (error) {\r\n console.error('Error saving to sessionStorage:', error)\r\n }\r\n}\r\n\r\nexport const getSessionStorage = <T>(key: string, defaultValue?: T): T | null => {\r\n try {\r\n const item = sessionStorage.getItem(key)\r\n return item ? JSON.parse(item) : defaultValue || null\r\n } catch (error) {\r\n console.error('Error reading from sessionStorage:', error)\r\n return defaultValue || null\r\n }\r\n}\r\n\r\nexport const removeSessionStorage = (key: string): void => {\r\n try {\r\n sessionStorage.removeItem(key)\r\n } catch (error) {\r\n console.error('Error removing from sessionStorage:', error)\r\n }\r\n}\r\n\r\nexport const clearSessionStorage = (): void => {\r\n try {\r\n sessionStorage.clear()\r\n } catch (error) {\r\n console.error('Error clearing sessionStorage:', error)\r\n }\r\n}\r\n\r\n// URL 관련\r\nexport const getUrlParams = (): Record<string, string> => {\r\n const params = new URLSearchParams(window.location.search)\r\n const result: Record<string, string> = {}\r\n \r\n params.forEach((value, key) => {\r\n result[key] = value\r\n })\r\n \r\n return result\r\n}\r\n\r\nexport const setUrlParams = (params: Record<string, string>): void => {\r\n const url = new URL(window.location.href)\r\n \r\n Object.keys(params).forEach(key => {\r\n url.searchParams.set(key, params[key])\r\n })\r\n \r\n window.history.pushState({}, '', url.toString())\r\n}\r\n\r\nexport const removeUrlParams = (keys: string[]): void => {\r\n const url = new URL(window.location.href)\r\n \r\n keys.forEach(key => {\r\n url.searchParams.delete(key)\r\n })\r\n \r\n window.history.pushState({}, '', url.toString())\r\n}\r\n\r\n// 파일 관련\r\nexport const formatFileSize = (bytes: number): string => {\r\n if (bytes === 0) return '0 Bytes'\r\n \r\n const k = 1024\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']\r\n const i = Math.floor(Math.log(bytes) / Math.log(k))\r\n \r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\r\n}\r\n\r\nexport const getFileExtension = (filename: string): string => {\r\n return filename.slice((filename.lastIndexOf('.') - 1 >>> 0) + 2)\r\n}\r\n\r\nexport const isValidFileType = (file: File, allowedTypes: string[]): boolean => {\r\n return allowedTypes.includes(file.type)\r\n}\r\n\r\nexport const isValidFileSize = (file: File, maxSize: number): boolean => {\r\n return file.size <= maxSize\r\n}\r\n\r\n// 색상 관련\r\nexport const hexToRgb = (hex: string): { r: number; g: number; b: number } | null => {\r\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex)\r\n return result ? {\r\n r: parseInt(result[1], 16),\r\n g: parseInt(result[2], 16),\r\n b: parseInt(result[3], 16)\r\n } : null\r\n}\r\n\r\nexport const rgbToHex = (r: number, g: number, b: number): string => {\r\n return '#' + [r, g, b].map(x => {\r\n const hex = x.toString(16)\r\n return hex.length === 1 ? '0' + hex : hex\r\n }).join('')\r\n}\r\n\r\nexport const generateRandomColor = (): string => {\r\n return '#' + Math.floor(Math.random() * 16777215).toString(16)\r\n}\r\n\r\n// 기타 유틸리티\r\nexport const copyToClipboard = async (text: string): Promise<boolean> => {\r\n try {\r\n await navigator.clipboard.writeText(text)\r\n return true\r\n } catch (error) {\r\n console.error('Error copying to clipboard:', error)\r\n return false\r\n }\r\n}\r\n\r\nexport const downloadFile = (data: string, filename: string, type: string = 'text/plain'): void => {\r\n const blob = new Blob([data], { type })\r\n const url = URL.createObjectURL(blob)\r\n const link = document.createElement('a')\r\n link.href = url\r\n link.download = filename\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n URL.revokeObjectURL(url)\r\n}\r\n\r\nexport const scrollToTop = (): void => {\r\n window.scrollTo({ top: 0, behavior: 'smooth' })\r\n}\r\n\r\nexport const scrollToElement = (elementId: string): void => {\r\n const element = document.getElementById(elementId)\r\n if (element) {\r\n element.scrollIntoView({ behavior: 'smooth' })\r\n }\r\n}\r\n\r\nexport const isInViewport = (element: HTMLElement): boolean => {\r\n const rect = element.getBoundingClientRect()\r\n return (\r\n rect.top >= 0 &&\r\n rect.left >= 0 &&\r\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\r\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\r\n )\r\n}\r\n\r\nexport const getDeviceType = (): 'mobile' | 'tablet' | 'desktop' => {\r\n const width = window.innerWidth\r\n if (width < 768) return 'mobile'\r\n if (width < 1024) return 'tablet'\r\n return 'desktop'\r\n}\r\n\r\nexport const isMobile = (): boolean => getDeviceType() === 'mobile'\r\nexport const isTablet = (): boolean => getDeviceType() === 'tablet'\r\nexport const isDesktop = (): boolean => getDeviceType() === 'desktop' "],"names":["e","_","module","require$$0","this","d","t","n","o","i","r","u","f","a","s","l","h","m","c","y","p","v","M","dayjs","relativeTime","utc","timezone","getCurrentDate","getCurrentDateString","format","formatDate","date","formatDateKST","getRelativeTime","getDateDiff","date1","date2","unit","isToday","isThisWeek","isThisMonth","getWeekStart","getWeekEnd","getMonthStart","getMonthEnd","getDateRange","startDate","endDate","dates","current","end","getDateRangeForPicker","isValidDate","calculateAge","birthDate","isWeekend","day","isWeekday","formatDateKorean","formatTimeKorean","formatDateTimeKorean","isEmptyObject","obj","isNotEmptyObject","deepClone","item","clonedObj","key","pick","keys","result","omit","values","entries","merge","target","sources","source","targetKey","sourceValue","targetValue","removeNullValues","value","removeEmptyStrings","toQueryString","params","fromQueryString","queryString","get","path","defaultValue","set","getAllKeys","prefix","newKey","flatten","isEqual","obj1","obj2","keys1","keys2","size","has","every","predicate","some","filter","k","map","mapper","isEmptyArray","arr","isNotEmptyArray","unique","uniqueBy","seen","chunk","chunks","shuffle","shuffled","j","randomFromArray","randomMultiple","count","sortNumbers","ascending","b","sortBy","aVal","bVal","max","min","average","sum","num","lastIndexOf","find","findLast","remove","removeAt","index","removeWhere","includes","intersection","arr1","arr2","union","difference","groupBy","keySelector","groups","flattenArray","flattenDeep","flat","range","start","endIndex","duplicates","isString","isNumber","isBoolean","isFunction","isObject","isArray","isNull","isUndefined","isNullOrUndefined","clamp","round","decimals","formatNumber","locale","formatCurrency","amount","currency","random","randomInt","randomChoice","array","debounce","func","delay","timeoutId","args","throttle","lastCall","now","ms","resolve","setLocalStorage","error","getLocalStorage","removeLocalStorage","clearLocalStorage","setSessionStorage","getSessionStorage","removeSessionStorage","clearSessionStorage","generateRandomColor","copyToClipboard","text","downloadFile","data","filename","type","blob","url","link","scrollToTop","scrollToElement","elementId","element","isInViewport","rect","getDeviceType","width","isMobile","isTablet","isDesktop"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"envUtils-C9Gf5aek.js","sources":["../../src/utils/envUtils.ts"],"sourcesContent":["/**\n * 현재 코드가 실행되는 최종 애플리케이션의 환경이 개발 환경인지 여부를 반환합니다.\n * 이 라이브러리를 사용하는 프로젝트의 빌드 도구(Vite 등)가 이 값을 결정합니다.\n *\n * @example\n * // 최종 앱이 `npm run dev`로 실행될 때: isLocal === true\n * // 최종 앱이 `npm run build`로 빌드될 때: isLocal === false\n */\nexport const isLocal: boolean = (() => {\n try {\n // `import.meta.env.DEV`는 Vite와 같은 모던 빌드 도구에서 제공하는 표준적인 방식입니다.\n // 라이브러리 빌드 시점에는 이 코드가 그대로 유지되며,\n // 최종 사용되는 프로젝트에서 빌드될 때 해당 프로젝트의 환경에 맞게 `true` 또는 `false`로 대체됩니다.\n if ((import.meta as any).env.DEV) {\n return true;\n }\n } catch (e) {\n // `import.meta`를 지원하지 않는 환경(예: CommonJS, 일부 테스트 환경)을 위한 폴백입니다.\n }\n return false;\n})();\n\nlet devHosts: string[] = [];\nlet prodHosts: string[] = [];\n\nexport function configureEnvUtils(opts: {\n devHosts?: string[];\n prodHosts?: string[];\n}) {\n if (opts.devHosts) devHosts = opts.devHosts;\n if (opts.prodHosts) prodHosts = opts.prodHosts;\n}\n\nfunction getHostName(): string | undefined {\n if (typeof window !== \"undefined\" && window.location) {\n return window.location.hostname;\n }\n return undefined;\n}\n\nexport const isDev: boolean = (() => {\n const host = getHostName();\n return !!(host && devHosts.includes(host));\n})();\n\nexport const isProd: boolean = (() => {\n const host = getHostName();\n return !!(host && prodHosts.includes(host));\n})();\n\n// ✅ 환경코드 반환 유틸\nexport function getEnvCode(): \"X\" | \"D\" | \"P\" {\n if (isLocal) return \"X\"; // Local\n if (isDev) return \"D\"; // Dev\n if (isProd) return \"P\"; // Prod\n return \"X\"; // 기본값은 Local로\n}\n"],"names":["isLocal","devHosts","prodHosts","getHostName","isDev","host","isProd","getEnvCode"],"mappings":"AAQO,MAAMA,KAAoB,MAAM;AACrC,MAAI;AAIF,QAAK,YAAA,IAAA;AACH,aAAO;AAAA,EAEX,QAAY;AAAA,EAEZ;AACA,SAAO;AACT,GAAA;AAEA,IAAIC,IAAqB,CAAA,GACrBC,IAAsB,CAAA;AAU1B,SAASC,IAAkC;AACzC,MAAI,OAAO,SAAW,OAAe,OAAO;AAC1C,WAAO,OAAO,SAAS;AAG3B;AAEO,MAAMC,KAAkB,MAAM;AACnC,QAAMC,IAAOF,EAAA;AACb,SAAO,CAAC,EAAEE,KAAQJ,EAAS,SAASI,CAAI;AAC1C,GAAA,GAEaC,KAAmB,MAAM;AACpC,QAAMD,IAAOF,EAAA;AACb,SAAO,CAAC,EAAEE,KAAQH,EAAU,SAASG,CAAI;AAC3C,GAAA;AAGO,SAASE,IAA8B;AAC5C,SAAIP,IAAgB,MAChBI,IAAc,MACdE,IAAe,MACZ;AACT;"}
|
|
1
|
+
{"version":3,"file":"envUtils-C9Gf5aek.js","sources":["../../src/utils/envUtils.ts"],"sourcesContent":["/**\r\n * 현재 코드가 실행되는 최종 애플리케이션의 환경이 개발 환경인지 여부를 반환합니다.\r\n * 이 라이브러리를 사용하는 프로젝트의 빌드 도구(Vite 등)가 이 값을 결정합니다.\r\n *\r\n * @example\r\n * // 최종 앱이 `npm run dev`로 실행될 때: isLocal === true\r\n * // 최종 앱이 `npm run build`로 빌드될 때: isLocal === false\r\n */\r\nexport const isLocal: boolean = (() => {\r\n try {\r\n // `import.meta.env.DEV`는 Vite와 같은 모던 빌드 도구에서 제공하는 표준적인 방식입니다.\r\n // 라이브러리 빌드 시점에는 이 코드가 그대로 유지되며,\r\n // 최종 사용되는 프로젝트에서 빌드될 때 해당 프로젝트의 환경에 맞게 `true` 또는 `false`로 대체됩니다.\r\n if ((import.meta as any).env.DEV) {\r\n return true;\r\n }\r\n } catch (e) {\r\n // `import.meta`를 지원하지 않는 환경(예: CommonJS, 일부 테스트 환경)을 위한 폴백입니다.\r\n }\r\n return false;\r\n})();\r\n\r\nlet devHosts: string[] = [];\r\nlet prodHosts: string[] = [];\r\n\r\nexport function configureEnvUtils(opts: {\r\n devHosts?: string[];\r\n prodHosts?: string[];\r\n}) {\r\n if (opts.devHosts) devHosts = opts.devHosts;\r\n if (opts.prodHosts) prodHosts = opts.prodHosts;\r\n}\r\n\r\nfunction getHostName(): string | undefined {\r\n if (typeof window !== \"undefined\" && window.location) {\r\n return window.location.hostname;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport const isDev: boolean = (() => {\r\n const host = getHostName();\r\n return !!(host && devHosts.includes(host));\r\n})();\r\n\r\nexport const isProd: boolean = (() => {\r\n const host = getHostName();\r\n return !!(host && prodHosts.includes(host));\r\n})();\r\n\r\n// ✅ 환경코드 반환 유틸\r\nexport function getEnvCode(): \"X\" | \"D\" | \"P\" {\r\n if (isLocal) return \"X\"; // Local\r\n if (isDev) return \"D\"; // Dev\r\n if (isProd) return \"P\"; // Prod\r\n return \"X\"; // 기본값은 Local로\r\n}\r\n"],"names":["isLocal","devHosts","prodHosts","getHostName","isDev","host","isProd","getEnvCode"],"mappings":"AAQO,MAAMA,KAAoB,MAAM;AACrC,MAAI;AAIF,QAAK,YAAA,IAAA;AACH,aAAO;AAAA,EAEX,QAAY;AAAA,EAEZ;AACA,SAAO;AACT,GAAA;AAEA,IAAIC,IAAqB,CAAA,GACrBC,IAAsB,CAAA;AAU1B,SAASC,IAAkC;AACzC,MAAI,OAAO,SAAW,OAAe,OAAO;AAC1C,WAAO,OAAO,SAAS;AAG3B;AAEO,MAAMC,KAAkB,MAAM;AACnC,QAAMC,IAAOF,EAAA;AACb,SAAO,CAAC,EAAEE,KAAQJ,EAAS,SAASI,CAAI;AAC1C,GAAA,GAEaC,KAAmB,MAAM;AACpC,QAAMD,IAAOF,EAAA;AACb,SAAO,CAAC,EAAEE,KAAQH,EAAU,SAASG,CAAI;AAC3C,GAAA;AAGO,SAASE,IAA8B;AAC5C,SAAIP,IAAgB,MAChBI,IAAc,MACdE,IAAe,MACZ;AACT;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"envUtils-CduTHoHu.cjs","sources":["../../src/utils/envUtils.ts"],"sourcesContent":["/**\n * 현재 코드가 실행되는 최종 애플리케이션의 환경이 개발 환경인지 여부를 반환합니다.\n * 이 라이브러리를 사용하는 프로젝트의 빌드 도구(Vite 등)가 이 값을 결정합니다.\n *\n * @example\n * // 최종 앱이 `npm run dev`로 실행될 때: isLocal === true\n * // 최종 앱이 `npm run build`로 빌드될 때: isLocal === false\n */\nexport const isLocal: boolean = (() => {\n try {\n // `import.meta.env.DEV`는 Vite와 같은 모던 빌드 도구에서 제공하는 표준적인 방식입니다.\n // 라이브러리 빌드 시점에는 이 코드가 그대로 유지되며,\n // 최종 사용되는 프로젝트에서 빌드될 때 해당 프로젝트의 환경에 맞게 `true` 또는 `false`로 대체됩니다.\n if ((import.meta as any).env.DEV) {\n return true;\n }\n } catch (e) {\n // `import.meta`를 지원하지 않는 환경(예: CommonJS, 일부 테스트 환경)을 위한 폴백입니다.\n }\n return false;\n})();\n\nlet devHosts: string[] = [];\nlet prodHosts: string[] = [];\n\nexport function configureEnvUtils(opts: {\n devHosts?: string[];\n prodHosts?: string[];\n}) {\n if (opts.devHosts) devHosts = opts.devHosts;\n if (opts.prodHosts) prodHosts = opts.prodHosts;\n}\n\nfunction getHostName(): string | undefined {\n if (typeof window !== \"undefined\" && window.location) {\n return window.location.hostname;\n }\n return undefined;\n}\n\nexport const isDev: boolean = (() => {\n const host = getHostName();\n return !!(host && devHosts.includes(host));\n})();\n\nexport const isProd: boolean = (() => {\n const host = getHostName();\n return !!(host && prodHosts.includes(host));\n})();\n\n// ✅ 환경코드 반환 유틸\nexport function getEnvCode(): \"X\" | \"D\" | \"P\" {\n if (isLocal) return \"X\"; // Local\n if (isDev) return \"D\"; // Dev\n if (isProd) return \"P\"; // Prod\n return \"X\"; // 기본값은 Local로\n}\n"],"names":["isLocal","devHosts","prodHosts","getHostName","isDev","host","isProd","getEnvCode"],"mappings":"aAQO,MAAMA,GAAoB,IAAM,CACrC,GAAI,CAIF,GAAK,SAAA,IACH,MAAO,EAEX,MAAY,CAEZ,CACA,MAAO,EACT,GAAA,EAEA,IAAIC,EAAqB,CAAA,EACrBC,EAAsB,CAAA,EAU1B,SAASC,GAAkC,CACzC,GAAI,OAAO,OAAW,KAAe,OAAO,SAC1C,OAAO,OAAO,SAAS,QAG3B,CAEO,MAAMC,GAAkB,IAAM,CACnC,MAAMC,EAAOF,EAAA,EACb,MAAO,CAAC,EAAEE,GAAQJ,EAAS,SAASI,CAAI,EAC1C,GAAA,EAEaC,GAAmB,IAAM,CACpC,MAAMD,EAAOF,EAAA,EACb,MAAO,CAAC,EAAEE,GAAQH,EAAU,SAASG,CAAI,EAC3C,GAAA,EAGO,SAASE,GAA8B,CAC5C,OAAIP,EAAgB,IAChBI,EAAc,IACdE,EAAe,IACZ,GACT"}
|
|
1
|
+
{"version":3,"file":"envUtils-CduTHoHu.cjs","sources":["../../src/utils/envUtils.ts"],"sourcesContent":["/**\r\n * 현재 코드가 실행되는 최종 애플리케이션의 환경이 개발 환경인지 여부를 반환합니다.\r\n * 이 라이브러리를 사용하는 프로젝트의 빌드 도구(Vite 등)가 이 값을 결정합니다.\r\n *\r\n * @example\r\n * // 최종 앱이 `npm run dev`로 실행될 때: isLocal === true\r\n * // 최종 앱이 `npm run build`로 빌드될 때: isLocal === false\r\n */\r\nexport const isLocal: boolean = (() => {\r\n try {\r\n // `import.meta.env.DEV`는 Vite와 같은 모던 빌드 도구에서 제공하는 표준적인 방식입니다.\r\n // 라이브러리 빌드 시점에는 이 코드가 그대로 유지되며,\r\n // 최종 사용되는 프로젝트에서 빌드될 때 해당 프로젝트의 환경에 맞게 `true` 또는 `false`로 대체됩니다.\r\n if ((import.meta as any).env.DEV) {\r\n return true;\r\n }\r\n } catch (e) {\r\n // `import.meta`를 지원하지 않는 환경(예: CommonJS, 일부 테스트 환경)을 위한 폴백입니다.\r\n }\r\n return false;\r\n})();\r\n\r\nlet devHosts: string[] = [];\r\nlet prodHosts: string[] = [];\r\n\r\nexport function configureEnvUtils(opts: {\r\n devHosts?: string[];\r\n prodHosts?: string[];\r\n}) {\r\n if (opts.devHosts) devHosts = opts.devHosts;\r\n if (opts.prodHosts) prodHosts = opts.prodHosts;\r\n}\r\n\r\nfunction getHostName(): string | undefined {\r\n if (typeof window !== \"undefined\" && window.location) {\r\n return window.location.hostname;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport const isDev: boolean = (() => {\r\n const host = getHostName();\r\n return !!(host && devHosts.includes(host));\r\n})();\r\n\r\nexport const isProd: boolean = (() => {\r\n const host = getHostName();\r\n return !!(host && prodHosts.includes(host));\r\n})();\r\n\r\n// ✅ 환경코드 반환 유틸\r\nexport function getEnvCode(): \"X\" | \"D\" | \"P\" {\r\n if (isLocal) return \"X\"; // Local\r\n if (isDev) return \"D\"; // Dev\r\n if (isProd) return \"P\"; // Prod\r\n return \"X\"; // 기본값은 Local로\r\n}\r\n"],"names":["isLocal","devHosts","prodHosts","getHostName","isDev","host","isProd","getEnvCode"],"mappings":"aAQO,MAAMA,GAAoB,IAAM,CACrC,GAAI,CAIF,GAAK,SAAA,IACH,MAAO,EAEX,MAAY,CAEZ,CACA,MAAO,EACT,GAAA,EAEA,IAAIC,EAAqB,CAAA,EACrBC,EAAsB,CAAA,EAU1B,SAASC,GAAkC,CACzC,GAAI,OAAO,OAAW,KAAe,OAAO,SAC1C,OAAO,OAAO,SAAS,QAG3B,CAEO,MAAMC,GAAkB,IAAM,CACnC,MAAMC,EAAOF,EAAA,EACb,MAAO,CAAC,EAAEE,GAAQJ,EAAS,SAASI,CAAI,EAC1C,GAAA,EAEaC,GAAmB,IAAM,CACpC,MAAMD,EAAOF,EAAA,EACb,MAAO,CAAC,EAAEE,GAAQH,EAAU,SAASG,CAAI,EAC3C,GAAA,EAGO,SAASE,GAA8B,CAC5C,OAAIP,EAAgB,IAChBI,EAAc,IACdE,EAAe,IACZ,GACT"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const c=require("zustand"),n=require("./apiUtils-Cbg6NQLv.cjs"),l=require("./envUtils-CduTHoHu.cjs"),d=c.create((t,s)=>({favorites:[],isLoading:!1,error:null,fetchFavorites:async({crprCd:e,userId:a})=>{console.log("즐겨찾기 메뉴 요청:",{crprCd:e,userId:a}),t({isLoading:!0,error:null});try{const o=await n.callService(n.getServiceCode("AUTH_BMRK"),{crprCd:e,userId:a});let r=[];if(o?.favorites&&Array.isArray(o.favorites)?r=o.favorites:Array.isArray(o)?r=o:(console.warn("즐겨찾기 데이터가 비어있거나 예상과 다른 구조입니다."),r=[]),console.log("즐겨찾기 메뉴 로드 완료:",r),l.isLocal&&r.length===0){const i=[{crprCd:"100",menuGbCd:"CMPRGRP",menuPrntId:"FAV001",menuId:"FAV_TEST001",menuNm:"API 테스트",scrnId:"TEST001",menuNo:1,scrnPath:"/dev/ApiTest",rootMenu:"FAV001",addedAt:new Date().toISOString(),userId:a},{crprCd:"100",menuGbCd:"CMPRGRP",menuPrntId:"FAV001",menuId:"FAV_TEST002",menuNm:"프로젝트 개요",scrnId:"DOCS001",menuNo:2,scrnPath:"/docs/ProjectOverview",rootMenu:"FAV001",addedAt:new Date().toISOString(),userId:a}];t({favorites:i,isLoading:!1,error:null}),console.log("개발 모드: 테스트용 즐겨찾기 데이터 추가")}else t({favorites:r,isLoading:!1,error:null})}catch(o){console.error("즐겨찾기 메뉴 로드 실패:",o),t({error:o instanceof Error?o.message:"즐겨찾기 로드 실패",isLoading:!1})}},addFavorite:async(e,a)=>{const{favorites:o}=s();if(o.some(r=>r.menuId===e.menuId)){console.log("이미 즐겨찾기에 추가된 메뉴입니다:",e.menuNm);return}try{await n.callService(n.getServiceCode("AUTH_BMRK"),{action:"add",crprCd:e.crprCd,userId:a,menuId:e.menuId,menuNm:e.menuNm,scrnPath:e.scrnPath});const r={...e,addedAt:new Date().toISOString(),userId:a};t({favorites:[...o,r]}),console.log("즐겨찾기 추가 완료:",e.menuNm)}catch(r){throw console.error("즐겨찾기 추가 실패:",r),r}},removeFavorite:async(e,a)=>{const{favorites:o}=s();try{await n.callService(n.getServiceCode("AUTH_BMRK"),{action:"remove",crprCd:"100",userId:a,menuId:e});const r=o.filter(i=>i.menuId!==e);t({favorites:r}),console.log("즐겨찾기 제거 완료:",e)}catch(r){throw console.error("즐겨찾기 제거 실패:",r),r}},isFavorite:e=>{const{favorites:a}=s();return a.some(o=>o.menuId===e)},clearFavorites:()=>{t({favorites:[],isLoading:!1,error:null})}}));exports.useFavoriteStore=d;
|
|
2
|
+
//# sourceMappingURL=favoriteStore-3YceyayF.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"favoriteStore-3YceyayF.cjs","sources":["../../src/stores/favoriteStore.ts"],"sourcesContent":["import { create } from \"zustand\";\r\nimport { callService } from \"../utils/apiUtils\";\r\nimport { getServiceCode } from \"../utils/serviceConfig\";\r\nimport type { MenuItem } from \"./menuModelStore\";\r\nimport { isLocal } from \"@/utils\";\r\n\r\n// 즐겨찾기 메뉴 타입 정의\r\nexport interface FavoriteMenuItem extends MenuItem {\r\n addedAt: string; // 즐겨찾기 추가 시간\r\n userId: string; // 사용자 ID\r\n}\r\n\r\n// 즐겨찾기 스토어 타입 정의\r\nexport interface FavoriteStore {\r\n favorites: FavoriteMenuItem[];\r\n isLoading: boolean;\r\n error: string | null;\r\n\r\n // 즐겨찾기 메뉴 가져오기\r\n fetchFavorites: (params: { crprCd: string; userId: string }) => Promise<void>;\r\n\r\n // 즐겨찾기 추가\r\n addFavorite: (menuItem: MenuItem, userId: string) => Promise<void>;\r\n\r\n // 즐겨찾기 제거\r\n removeFavorite: (menuId: string, userId: string) => Promise<void>;\r\n\r\n // 즐겨찾기 여부 확인\r\n isFavorite: (menuId: string) => boolean;\r\n\r\n // 즐겨찾기 초기화\r\n clearFavorites: () => void;\r\n}\r\n\r\n// 즐겨찾기 스토어 생성\r\nexport const useFavoriteStore = create<FavoriteStore>((set, get) => ({\r\n favorites: [],\r\n isLoading: false,\r\n error: null,\r\n\r\n // 즐겨찾기 메뉴 가져오기\r\n fetchFavorites: async ({ crprCd, userId }) => {\r\n console.log(\"즐겨찾기 메뉴 요청:\", { crprCd, userId });\r\n set({ isLoading: true, error: null });\r\n\r\n try {\r\n // 서버에서 즐겨찾기 메뉴 가져오기\r\n const data = await callService(getServiceCode(\"AUTH_BMRK\"), {\r\n crprCd,\r\n userId,\r\n });\r\n\r\n let favoritesList: FavoriteMenuItem[] = [];\r\n\r\n if (data?.favorites && Array.isArray(data.favorites)) {\r\n favoritesList = data.favorites;\r\n } else if (Array.isArray(data)) {\r\n favoritesList = data;\r\n } else {\r\n console.warn(\"즐겨찾기 데이터가 비어있거나 예상과 다른 구조입니다.\");\r\n favoritesList = [];\r\n }\r\n\r\n console.log(\"즐겨찾기 메뉴 로드 완료:\", favoritesList);\r\n\r\n // 개발 모드에서 테스트용 즐겨찾기 데이터 추가\r\n if (isLocal && favoritesList.length === 0) {\r\n const testFavorites: FavoriteMenuItem[] = [\r\n {\r\n crprCd: \"100\",\r\n menuGbCd: \"CMPRGRP\",\r\n menuPrntId: \"FAV001\",\r\n menuId: \"FAV_TEST001\",\r\n menuNm: \"API 테스트\",\r\n scrnId: \"TEST001\",\r\n menuNo: 1,\r\n scrnPath: \"/dev/ApiTest\",\r\n rootMenu: \"FAV001\",\r\n addedAt: new Date().toISOString(),\r\n userId,\r\n },\r\n {\r\n crprCd: \"100\",\r\n menuGbCd: \"CMPRGRP\",\r\n menuPrntId: \"FAV001\",\r\n menuId: \"FAV_TEST002\",\r\n menuNm: \"프로젝트 개요\",\r\n scrnId: \"DOCS001\",\r\n menuNo: 2,\r\n scrnPath: \"/docs/ProjectOverview\",\r\n rootMenu: \"FAV001\",\r\n addedAt: new Date().toISOString(),\r\n userId,\r\n },\r\n ];\r\n set({ favorites: testFavorites, isLoading: false, error: null });\r\n console.log(\"개발 모드: 테스트용 즐겨찾기 데이터 추가\");\r\n } else {\r\n set({ favorites: favoritesList, isLoading: false, error: null });\r\n }\r\n } catch (error) {\r\n console.error(\"즐겨찾기 메뉴 로드 실패:\", error);\r\n set({\r\n error: error instanceof Error ? error.message : \"즐겨찾기 로드 실패\",\r\n isLoading: false,\r\n });\r\n }\r\n },\r\n\r\n // 즐겨찾기 추가\r\n addFavorite: async (menuItem: MenuItem, userId: string) => {\r\n const { favorites } = get();\r\n\r\n // 이미 즐겨찾기에 있는지 확인\r\n if (favorites.some((fav) => fav.menuId === menuItem.menuId)) {\r\n console.log(\"이미 즐겨찾기에 추가된 메뉴입니다:\", menuItem.menuNm);\r\n return;\r\n }\r\n\r\n try {\r\n // 서버에 즐겨찾기 추가 요청\r\n await callService(getServiceCode(\"AUTH_BMRK\"), {\r\n action: \"add\",\r\n crprCd: menuItem.crprCd,\r\n userId,\r\n menuId: menuItem.menuId,\r\n menuNm: menuItem.menuNm,\r\n scrnPath: menuItem.scrnPath,\r\n });\r\n\r\n // 로컬 상태 업데이트\r\n const newFavorite: FavoriteMenuItem = {\r\n ...menuItem,\r\n addedAt: new Date().toISOString(),\r\n userId,\r\n };\r\n\r\n set({ favorites: [...favorites, newFavorite] });\r\n console.log(\"즐겨찾기 추가 완료:\", menuItem.menuNm);\r\n } catch (error) {\r\n console.error(\"즐겨찾기 추가 실패:\", error);\r\n throw error;\r\n }\r\n },\r\n\r\n // 즐겨찾기 제거\r\n removeFavorite: async (menuId: string, userId: string) => {\r\n const { favorites } = get();\r\n\r\n try {\r\n // 서버에 즐겨찾기 제거 요청\r\n await callService(getServiceCode(\"AUTH_BMRK\"), {\r\n action: \"remove\",\r\n crprCd: \"100\", // 기본값\r\n userId,\r\n menuId,\r\n });\r\n\r\n // 로컬 상태 업데이트\r\n const updatedFavorites = favorites.filter((fav) => fav.menuId !== menuId);\r\n set({ favorites: updatedFavorites });\r\n console.log(\"즐겨찾기 제거 완료:\", menuId);\r\n } catch (error) {\r\n console.error(\"즐겨찾기 제거 실패:\", error);\r\n throw error;\r\n }\r\n },\r\n\r\n // 즐겨찾기 여부 확인\r\n isFavorite: (menuId: string) => {\r\n const { favorites } = get();\r\n return favorites.some((fav) => fav.menuId === menuId);\r\n },\r\n\r\n // 즐겨찾기 초기화\r\n clearFavorites: () => {\r\n set({ favorites: [], isLoading: false, error: null });\r\n },\r\n}));\r\n"],"names":["useFavoriteStore","create","set","get","crprCd","userId","data","callService","getServiceCode","favoritesList","isLocal","testFavorites","error","menuItem","favorites","fav","newFavorite","menuId","updatedFavorites"],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { create as l } from "zustand";
|
|
2
|
+
import { V as i, am as c } from "./apiUtils-C45AWfu-.js";
|
|
3
|
+
import { i as d } from "./envUtils-C9Gf5aek.js";
|
|
4
|
+
const u = l((t, n) => ({
|
|
5
|
+
favorites: [],
|
|
6
|
+
isLoading: !1,
|
|
7
|
+
error: null,
|
|
8
|
+
// 즐겨찾기 메뉴 가져오기
|
|
9
|
+
fetchFavorites: async ({ crprCd: o, userId: a }) => {
|
|
10
|
+
console.log("즐겨찾기 메뉴 요청:", { crprCd: o, userId: a }), t({ isLoading: !0, error: null });
|
|
11
|
+
try {
|
|
12
|
+
const e = await i(c("AUTH_BMRK"), {
|
|
13
|
+
crprCd: o,
|
|
14
|
+
userId: a
|
|
15
|
+
});
|
|
16
|
+
let r = [];
|
|
17
|
+
if (e?.favorites && Array.isArray(e.favorites) ? r = e.favorites : Array.isArray(e) ? r = e : (console.warn("즐겨찾기 데이터가 비어있거나 예상과 다른 구조입니다."), r = []), console.log("즐겨찾기 메뉴 로드 완료:", r), d && r.length === 0) {
|
|
18
|
+
const s = [
|
|
19
|
+
{
|
|
20
|
+
crprCd: "100",
|
|
21
|
+
menuGbCd: "CMPRGRP",
|
|
22
|
+
menuPrntId: "FAV001",
|
|
23
|
+
menuId: "FAV_TEST001",
|
|
24
|
+
menuNm: "API 테스트",
|
|
25
|
+
scrnId: "TEST001",
|
|
26
|
+
menuNo: 1,
|
|
27
|
+
scrnPath: "/dev/ApiTest",
|
|
28
|
+
rootMenu: "FAV001",
|
|
29
|
+
addedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
30
|
+
userId: a
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
crprCd: "100",
|
|
34
|
+
menuGbCd: "CMPRGRP",
|
|
35
|
+
menuPrntId: "FAV001",
|
|
36
|
+
menuId: "FAV_TEST002",
|
|
37
|
+
menuNm: "프로젝트 개요",
|
|
38
|
+
scrnId: "DOCS001",
|
|
39
|
+
menuNo: 2,
|
|
40
|
+
scrnPath: "/docs/ProjectOverview",
|
|
41
|
+
rootMenu: "FAV001",
|
|
42
|
+
addedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
43
|
+
userId: a
|
|
44
|
+
}
|
|
45
|
+
];
|
|
46
|
+
t({ favorites: s, isLoading: !1, error: null }), console.log("개발 모드: 테스트용 즐겨찾기 데이터 추가");
|
|
47
|
+
} else
|
|
48
|
+
t({ favorites: r, isLoading: !1, error: null });
|
|
49
|
+
} catch (e) {
|
|
50
|
+
console.error("즐겨찾기 메뉴 로드 실패:", e), t({
|
|
51
|
+
error: e instanceof Error ? e.message : "즐겨찾기 로드 실패",
|
|
52
|
+
isLoading: !1
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
// 즐겨찾기 추가
|
|
57
|
+
addFavorite: async (o, a) => {
|
|
58
|
+
const { favorites: e } = n();
|
|
59
|
+
if (e.some((r) => r.menuId === o.menuId)) {
|
|
60
|
+
console.log("이미 즐겨찾기에 추가된 메뉴입니다:", o.menuNm);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
await i(c("AUTH_BMRK"), {
|
|
65
|
+
action: "add",
|
|
66
|
+
crprCd: o.crprCd,
|
|
67
|
+
userId: a,
|
|
68
|
+
menuId: o.menuId,
|
|
69
|
+
menuNm: o.menuNm,
|
|
70
|
+
scrnPath: o.scrnPath
|
|
71
|
+
});
|
|
72
|
+
const r = {
|
|
73
|
+
...o,
|
|
74
|
+
addedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
75
|
+
userId: a
|
|
76
|
+
};
|
|
77
|
+
t({ favorites: [...e, r] }), console.log("즐겨찾기 추가 완료:", o.menuNm);
|
|
78
|
+
} catch (r) {
|
|
79
|
+
throw console.error("즐겨찾기 추가 실패:", r), r;
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
// 즐겨찾기 제거
|
|
83
|
+
removeFavorite: async (o, a) => {
|
|
84
|
+
const { favorites: e } = n();
|
|
85
|
+
try {
|
|
86
|
+
await i(c("AUTH_BMRK"), {
|
|
87
|
+
action: "remove",
|
|
88
|
+
crprCd: "100",
|
|
89
|
+
// 기본값
|
|
90
|
+
userId: a,
|
|
91
|
+
menuId: o
|
|
92
|
+
});
|
|
93
|
+
const r = e.filter((s) => s.menuId !== o);
|
|
94
|
+
t({ favorites: r }), console.log("즐겨찾기 제거 완료:", o);
|
|
95
|
+
} catch (r) {
|
|
96
|
+
throw console.error("즐겨찾기 제거 실패:", r), r;
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
// 즐겨찾기 여부 확인
|
|
100
|
+
isFavorite: (o) => {
|
|
101
|
+
const { favorites: a } = n();
|
|
102
|
+
return a.some((e) => e.menuId === o);
|
|
103
|
+
},
|
|
104
|
+
// 즐겨찾기 초기화
|
|
105
|
+
clearFavorites: () => {
|
|
106
|
+
t({ favorites: [], isLoading: !1, error: null });
|
|
107
|
+
}
|
|
108
|
+
}));
|
|
109
|
+
export {
|
|
110
|
+
u
|
|
111
|
+
};
|
|
112
|
+
//# sourceMappingURL=favoriteStore-C9utQ6sm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"favoriteStore-C9utQ6sm.js","sources":["../../src/stores/favoriteStore.ts"],"sourcesContent":["import { create } from \"zustand\";\r\nimport { callService } from \"../utils/apiUtils\";\r\nimport { getServiceCode } from \"../utils/serviceConfig\";\r\nimport type { MenuItem } from \"./menuModelStore\";\r\nimport { isLocal } from \"@/utils\";\r\n\r\n// 즐겨찾기 메뉴 타입 정의\r\nexport interface FavoriteMenuItem extends MenuItem {\r\n addedAt: string; // 즐겨찾기 추가 시간\r\n userId: string; // 사용자 ID\r\n}\r\n\r\n// 즐겨찾기 스토어 타입 정의\r\nexport interface FavoriteStore {\r\n favorites: FavoriteMenuItem[];\r\n isLoading: boolean;\r\n error: string | null;\r\n\r\n // 즐겨찾기 메뉴 가져오기\r\n fetchFavorites: (params: { crprCd: string; userId: string }) => Promise<void>;\r\n\r\n // 즐겨찾기 추가\r\n addFavorite: (menuItem: MenuItem, userId: string) => Promise<void>;\r\n\r\n // 즐겨찾기 제거\r\n removeFavorite: (menuId: string, userId: string) => Promise<void>;\r\n\r\n // 즐겨찾기 여부 확인\r\n isFavorite: (menuId: string) => boolean;\r\n\r\n // 즐겨찾기 초기화\r\n clearFavorites: () => void;\r\n}\r\n\r\n// 즐겨찾기 스토어 생성\r\nexport const useFavoriteStore = create<FavoriteStore>((set, get) => ({\r\n favorites: [],\r\n isLoading: false,\r\n error: null,\r\n\r\n // 즐겨찾기 메뉴 가져오기\r\n fetchFavorites: async ({ crprCd, userId }) => {\r\n console.log(\"즐겨찾기 메뉴 요청:\", { crprCd, userId });\r\n set({ isLoading: true, error: null });\r\n\r\n try {\r\n // 서버에서 즐겨찾기 메뉴 가져오기\r\n const data = await callService(getServiceCode(\"AUTH_BMRK\"), {\r\n crprCd,\r\n userId,\r\n });\r\n\r\n let favoritesList: FavoriteMenuItem[] = [];\r\n\r\n if (data?.favorites && Array.isArray(data.favorites)) {\r\n favoritesList = data.favorites;\r\n } else if (Array.isArray(data)) {\r\n favoritesList = data;\r\n } else {\r\n console.warn(\"즐겨찾기 데이터가 비어있거나 예상과 다른 구조입니다.\");\r\n favoritesList = [];\r\n }\r\n\r\n console.log(\"즐겨찾기 메뉴 로드 완료:\", favoritesList);\r\n\r\n // 개발 모드에서 테스트용 즐겨찾기 데이터 추가\r\n if (isLocal && favoritesList.length === 0) {\r\n const testFavorites: FavoriteMenuItem[] = [\r\n {\r\n crprCd: \"100\",\r\n menuGbCd: \"CMPRGRP\",\r\n menuPrntId: \"FAV001\",\r\n menuId: \"FAV_TEST001\",\r\n menuNm: \"API 테스트\",\r\n scrnId: \"TEST001\",\r\n menuNo: 1,\r\n scrnPath: \"/dev/ApiTest\",\r\n rootMenu: \"FAV001\",\r\n addedAt: new Date().toISOString(),\r\n userId,\r\n },\r\n {\r\n crprCd: \"100\",\r\n menuGbCd: \"CMPRGRP\",\r\n menuPrntId: \"FAV001\",\r\n menuId: \"FAV_TEST002\",\r\n menuNm: \"프로젝트 개요\",\r\n scrnId: \"DOCS001\",\r\n menuNo: 2,\r\n scrnPath: \"/docs/ProjectOverview\",\r\n rootMenu: \"FAV001\",\r\n addedAt: new Date().toISOString(),\r\n userId,\r\n },\r\n ];\r\n set({ favorites: testFavorites, isLoading: false, error: null });\r\n console.log(\"개발 모드: 테스트용 즐겨찾기 데이터 추가\");\r\n } else {\r\n set({ favorites: favoritesList, isLoading: false, error: null });\r\n }\r\n } catch (error) {\r\n console.error(\"즐겨찾기 메뉴 로드 실패:\", error);\r\n set({\r\n error: error instanceof Error ? error.message : \"즐겨찾기 로드 실패\",\r\n isLoading: false,\r\n });\r\n }\r\n },\r\n\r\n // 즐겨찾기 추가\r\n addFavorite: async (menuItem: MenuItem, userId: string) => {\r\n const { favorites } = get();\r\n\r\n // 이미 즐겨찾기에 있는지 확인\r\n if (favorites.some((fav) => fav.menuId === menuItem.menuId)) {\r\n console.log(\"이미 즐겨찾기에 추가된 메뉴입니다:\", menuItem.menuNm);\r\n return;\r\n }\r\n\r\n try {\r\n // 서버에 즐겨찾기 추가 요청\r\n await callService(getServiceCode(\"AUTH_BMRK\"), {\r\n action: \"add\",\r\n crprCd: menuItem.crprCd,\r\n userId,\r\n menuId: menuItem.menuId,\r\n menuNm: menuItem.menuNm,\r\n scrnPath: menuItem.scrnPath,\r\n });\r\n\r\n // 로컬 상태 업데이트\r\n const newFavorite: FavoriteMenuItem = {\r\n ...menuItem,\r\n addedAt: new Date().toISOString(),\r\n userId,\r\n };\r\n\r\n set({ favorites: [...favorites, newFavorite] });\r\n console.log(\"즐겨찾기 추가 완료:\", menuItem.menuNm);\r\n } catch (error) {\r\n console.error(\"즐겨찾기 추가 실패:\", error);\r\n throw error;\r\n }\r\n },\r\n\r\n // 즐겨찾기 제거\r\n removeFavorite: async (menuId: string, userId: string) => {\r\n const { favorites } = get();\r\n\r\n try {\r\n // 서버에 즐겨찾기 제거 요청\r\n await callService(getServiceCode(\"AUTH_BMRK\"), {\r\n action: \"remove\",\r\n crprCd: \"100\", // 기본값\r\n userId,\r\n menuId,\r\n });\r\n\r\n // 로컬 상태 업데이트\r\n const updatedFavorites = favorites.filter((fav) => fav.menuId !== menuId);\r\n set({ favorites: updatedFavorites });\r\n console.log(\"즐겨찾기 제거 완료:\", menuId);\r\n } catch (error) {\r\n console.error(\"즐겨찾기 제거 실패:\", error);\r\n throw error;\r\n }\r\n },\r\n\r\n // 즐겨찾기 여부 확인\r\n isFavorite: (menuId: string) => {\r\n const { favorites } = get();\r\n return favorites.some((fav) => fav.menuId === menuId);\r\n },\r\n\r\n // 즐겨찾기 초기화\r\n clearFavorites: () => {\r\n set({ favorites: [], isLoading: false, error: null });\r\n },\r\n}));\r\n"],"names":["useFavoriteStore","create","set","get","crprCd","userId","data","callService","getServiceCode","favoritesList","isLocal","testFavorites","error","menuItem","favorites","fav","newFavorite","menuId","updatedFavorites"],"mappings":";;;AAmCO,MAAMA,IAAmBC,EAAsB,CAACC,GAAKC,OAAS;AAAA,EACnE,WAAW,CAAA;AAAA,EACX,WAAW;AAAA,EACX,OAAO;AAAA;AAAA,EAGP,gBAAgB,OAAO,EAAE,QAAAC,GAAQ,QAAAC,QAAa;AAC5C,YAAQ,IAAI,eAAe,EAAE,QAAAD,GAAQ,QAAAC,GAAQ,GAC7CH,EAAI,EAAE,WAAW,IAAM,OAAO,MAAM;AAEpC,QAAI;AAEF,YAAMI,IAAO,MAAMC,EAAYC,EAAe,WAAW,GAAG;AAAA,QAC1D,QAAAJ;AAAA,QACA,QAAAC;AAAA,MAAA,CACD;AAED,UAAII,IAAoC,CAAA;AAcxC,UAZIH,GAAM,aAAa,MAAM,QAAQA,EAAK,SAAS,IACjDG,IAAgBH,EAAK,YACZ,MAAM,QAAQA,CAAI,IAC3BG,IAAgBH,KAEhB,QAAQ,KAAK,+BAA+B,GAC5CG,IAAgB,CAAA,IAGlB,QAAQ,IAAI,kBAAkBA,CAAa,GAGvCC,KAAWD,EAAc,WAAW,GAAG;AACzC,cAAME,IAAoC;AAAA,UACxC;AAAA,YACE,QAAQ;AAAA,YACR,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,UAAU;AAAA,YACV,UAAU;AAAA,YACV,UAAS,oBAAI,KAAA,GAAO,YAAA;AAAA,YACpB,QAAAN;AAAA,UAAA;AAAA,UAEF;AAAA,YACE,QAAQ;AAAA,YACR,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,UAAU;AAAA,YACV,UAAU;AAAA,YACV,UAAS,oBAAI,KAAA,GAAO,YAAA;AAAA,YACpB,QAAAA;AAAA,UAAA;AAAA,QACF;AAEF,QAAAH,EAAI,EAAE,WAAWS,GAAe,WAAW,IAAO,OAAO,MAAM,GAC/D,QAAQ,IAAI,yBAAyB;AAAA,MACvC;AACE,QAAAT,EAAI,EAAE,WAAWO,GAAe,WAAW,IAAO,OAAO,MAAM;AAAA,IAEnE,SAASG,GAAO;AACd,cAAQ,MAAM,kBAAkBA,CAAK,GACrCV,EAAI;AAAA,QACF,OAAOU,aAAiB,QAAQA,EAAM,UAAU;AAAA,QAChD,WAAW;AAAA,MAAA,CACZ;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,aAAa,OAAOC,GAAoBR,MAAmB;AACzD,UAAM,EAAE,WAAAS,EAAA,IAAcX,EAAA;AAGtB,QAAIW,EAAU,KAAK,CAACC,MAAQA,EAAI,WAAWF,EAAS,MAAM,GAAG;AAC3D,cAAQ,IAAI,uBAAuBA,EAAS,MAAM;AAClD;AAAA,IACF;AAEA,QAAI;AAEF,YAAMN,EAAYC,EAAe,WAAW,GAAG;AAAA,QAC7C,QAAQ;AAAA,QACR,QAAQK,EAAS;AAAA,QACjB,QAAAR;AAAA,QACA,QAAQQ,EAAS;AAAA,QACjB,QAAQA,EAAS;AAAA,QACjB,UAAUA,EAAS;AAAA,MAAA,CACpB;AAGD,YAAMG,IAAgC;AAAA,QACpC,GAAGH;AAAA,QACH,UAAS,oBAAI,KAAA,GAAO,YAAA;AAAA,QACpB,QAAAR;AAAA,MAAA;AAGF,MAAAH,EAAI,EAAE,WAAW,CAAC,GAAGY,GAAWE,CAAW,GAAG,GAC9C,QAAQ,IAAI,eAAeH,EAAS,MAAM;AAAA,IAC5C,SAASD,GAAO;AACd,oBAAQ,MAAM,eAAeA,CAAK,GAC5BA;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,gBAAgB,OAAOK,GAAgBZ,MAAmB;AACxD,UAAM,EAAE,WAAAS,EAAA,IAAcX,EAAA;AAEtB,QAAI;AAEF,YAAMI,EAAYC,EAAe,WAAW,GAAG;AAAA,QAC7C,QAAQ;AAAA,QACR,QAAQ;AAAA;AAAA,QACR,QAAAH;AAAA,QACA,QAAAY;AAAA,MAAA,CACD;AAGD,YAAMC,IAAmBJ,EAAU,OAAO,CAACC,MAAQA,EAAI,WAAWE,CAAM;AACxE,MAAAf,EAAI,EAAE,WAAWgB,GAAkB,GACnC,QAAQ,IAAI,eAAeD,CAAM;AAAA,IACnC,SAASL,GAAO;AACd,oBAAQ,MAAM,eAAeA,CAAK,GAC5BA;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,YAAY,CAACK,MAAmB;AAC9B,UAAM,EAAE,WAAAH,EAAA,IAAcX,EAAA;AACtB,WAAOW,EAAU,KAAK,CAACC,MAAQA,EAAI,WAAWE,CAAM;AAAA,EACtD;AAAA;AAAA,EAGA,gBAAgB,MAAM;AACpB,IAAAf,EAAI,EAAE,WAAW,CAAA,GAAI,WAAW,IAAO,OAAO,MAAM;AAAA,EACtD;AACF,EAAE;"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { create as d } from "zustand";
|
|
2
|
-
import { V as g, am as P, a7 as I } from "./
|
|
3
|
-
const h = d((
|
|
2
|
+
import { V as g, am as P, a7 as I } from "./apiUtils-C45AWfu-.js";
|
|
3
|
+
const h = d((s, i) => ({
|
|
4
4
|
popups: [],
|
|
5
5
|
activePopupId: null,
|
|
6
6
|
isLoading: !1,
|
|
7
7
|
error: null,
|
|
8
8
|
// 팝업 열기
|
|
9
|
-
openPopup: async (p, u,
|
|
10
|
-
console.log("팝업 열기 요청:", { popupCode: p, data: u, config:
|
|
9
|
+
openPopup: async (p, u, r) => {
|
|
10
|
+
console.log("팝업 열기 요청:", { popupCode: p, data: u, config: r }), s({ isLoading: !0, error: null });
|
|
11
11
|
try {
|
|
12
12
|
console.log("팝업 열기 시작:", p);
|
|
13
13
|
let o = null;
|
|
@@ -27,7 +27,8 @@ const h = d((r, i) => ({
|
|
|
27
27
|
const n = {
|
|
28
28
|
popupId: `popup_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
|
|
29
29
|
popupCode: p,
|
|
30
|
-
|
|
30
|
+
//config.title을 통해 팝업 제목 변경 가능
|
|
31
|
+
popupTitle: r?.title || o.popuNm || "팝업",
|
|
31
32
|
popupUrl: a,
|
|
32
33
|
popupParams: u,
|
|
33
34
|
width: o.popuWdth || 800,
|
|
@@ -36,27 +37,27 @@ const h = d((r, i) => ({
|
|
|
36
37
|
draggable: !0,
|
|
37
38
|
buttonList: t,
|
|
38
39
|
// 버튼 목록 추가
|
|
39
|
-
config:
|
|
40
|
+
config: r
|
|
40
41
|
};
|
|
41
42
|
console.log("생성된 팝업 아이템:", n);
|
|
42
43
|
const c = i().popups.find((e) => e.popupCode === p);
|
|
43
44
|
if (c) {
|
|
44
|
-
console.log("기존 팝업 업데이트:", c.popupId),
|
|
45
|
+
console.log("기존 팝업 업데이트:", c.popupId), s({
|
|
45
46
|
activePopupId: c.popupId,
|
|
46
47
|
popups: i().popups.map(
|
|
47
|
-
(e) => e.popupId === c.popupId ? { ...e, config:
|
|
48
|
+
(e) => e.popupId === c.popupId ? { ...e, config: r } : e
|
|
48
49
|
),
|
|
49
50
|
isLoading: !1
|
|
50
51
|
});
|
|
51
52
|
return;
|
|
52
53
|
}
|
|
53
|
-
console.log("새 팝업 추가:", n.popupId),
|
|
54
|
+
console.log("새 팝업 추가:", n.popupId), s((e) => ({
|
|
54
55
|
popups: [...e.popups, n],
|
|
55
56
|
activePopupId: n.popupId,
|
|
56
57
|
isLoading: !1
|
|
57
58
|
})), console.log("팝업 열기 완료:", n);
|
|
58
59
|
} catch (o) {
|
|
59
|
-
console.error("팝업 열기 실패:", o),
|
|
60
|
+
console.error("팝업 열기 실패:", o), s({
|
|
60
61
|
error: o instanceof Error ? o.message : "팝업 열기 실패",
|
|
61
62
|
isLoading: !1
|
|
62
63
|
});
|
|
@@ -64,28 +65,28 @@ const h = d((r, i) => ({
|
|
|
64
65
|
},
|
|
65
66
|
// 팝업 닫기
|
|
66
67
|
closePopup: (p) => {
|
|
67
|
-
const { popups: u, activePopupId:
|
|
68
|
-
let l =
|
|
69
|
-
|
|
68
|
+
const { popups: u, activePopupId: r } = i(), o = u.filter((t) => t.popupId !== p);
|
|
69
|
+
let l = r;
|
|
70
|
+
r === p && (l = o.length > 0 ? o[o.length - 1].popupId : null), s({
|
|
70
71
|
popups: o,
|
|
71
72
|
activePopupId: l
|
|
72
73
|
});
|
|
73
74
|
},
|
|
74
75
|
// 모든 팝업 닫기
|
|
75
76
|
closeAllPopups: () => {
|
|
76
|
-
|
|
77
|
+
s({
|
|
77
78
|
popups: [],
|
|
78
79
|
activePopupId: null
|
|
79
80
|
});
|
|
80
81
|
},
|
|
81
82
|
// 활성 팝업 설정
|
|
82
83
|
setActivePopup: (p) => {
|
|
83
|
-
|
|
84
|
+
s({ activePopupId: p });
|
|
84
85
|
},
|
|
85
86
|
// 팝업 설정 업데이트
|
|
86
87
|
updatePopupConfig: (p, u) => {
|
|
87
|
-
|
|
88
|
-
popups:
|
|
88
|
+
s((r) => ({
|
|
89
|
+
popups: r.popups.map(
|
|
89
90
|
(o) => o.popupId === p ? { ...o, config: { ...o.config, ...u } } : o
|
|
90
91
|
)
|
|
91
92
|
}));
|
|
@@ -94,4 +95,4 @@ const h = d((r, i) => ({
|
|
|
94
95
|
export {
|
|
95
96
|
h as u
|
|
96
97
|
};
|
|
97
|
-
//# sourceMappingURL=popupStore-
|
|
98
|
+
//# sourceMappingURL=popupStore-DmFbkkjd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"popupStore-DmFbkkjd.js","sources":["../../src/stores/popupStore.ts"],"sourcesContent":["import { create } from \"zustand\";\r\nimport { callService } from \"../utils/apiUtils\";\r\nimport { getServiceCode } from \"../utils/serviceConfig\";\r\nimport { getUserInfo } from \"@/utils\";\r\n\r\n// 팝업 아이템 타입 정의\r\nexport interface PopupItem {\r\n popupId: string; // 팝업 ID\r\n popupCode: string; // 팝업 코드\r\n popupTitle: string; // 팝업 제목\r\n popupUrl: string; // 팝업 프로그램 URL\r\n popupParams?: any; // 팝업 파라미터\r\n buttonList?: any[]; // 버튼 목록\r\n width?: number; // 팝업 너비\r\n height?: number; // 팝업 높이\r\n resizable?: boolean; // 크기 조절 가능 여부\r\n draggable?: boolean; // 드래그 가능 여부\r\n config?: PopupConfig; // 팝업 설정\r\n close?: () => void; // 팝업 닫기 함수\r\n}\r\n\r\n// 팝업 스토어 타입 정의\r\nexport interface PopupStore {\r\n popups: PopupItem[]; // 열린 팝업 목록\r\n activePopupId: string | null; // 현재 활성 팝업 ID\r\n isLoading: boolean; // 로딩 상태\r\n error: string | null; // 에러 상태\r\n\r\n // 팝업 관련 액션들\r\n openPopup: (\r\n popupCode: string,\r\n data?: any,\r\n config?: PopupConfig\r\n ) => Promise<void>;\r\n closePopup: (popupId: string) => void;\r\n closeAllPopups: () => void;\r\n setActivePopup: (popupId: string) => void;\r\n\r\n updatePopupConfig: (popupId: string, config: Partial<PopupConfig>) => void;\r\n}\r\n\r\nexport interface PopupButton {\r\n key: string; // 버튼 고유 키\r\n text: string; // 버튼 텍스트\r\n type?: \"primary\" | \"default\" | \"dashed\" | \"link\" | \"text\"; // 버튼 타입\r\n danger?: boolean; // 위험 버튼 여부\r\n disabled?: boolean; // 비활성화 여부\r\n icon?: string; // 아이콘 (Ant Design 아이콘명)\r\n onClick?: (popupData?: any) => void | Promise<void>; // 클릭 이벤트\r\n}\r\n\r\n/**\r\n * 팝업 설정 타입 정의\r\n */\r\nexport interface PopupConfig {\r\n width?: number; // 팝업 너비\r\n height?: number; // 팝업 높이\r\n title?: string; // 팝업 제목\r\n buttons?: PopupButton[]; // 팝업 버튼들\r\n resizable?: boolean; // 크기 조절 가능 여부\r\n draggable?: boolean; // 드래그 가능 여부\r\n closable?: boolean; // 닫기 버튼 표시 여부\r\n maskClosable?: boolean; // 마스크 클릭 시 닫기 여부\r\n destroyOnClose?: boolean; // 닫을 때 컴포넌트 파괴 여부\r\n searchBox?: {\r\n reqArea: any;\r\n subArea?: any;\r\n style?: any;\r\n };\r\n /**\r\n * 팝업 콜백\r\n * 팝업 콜백은 팝업이 닫힐 때 호출되는 함수입니다.\r\n */\r\n callback?: (callbackParams?: any) => void;\r\n}\r\n\r\n/**\r\n * 팝업 내부 뷰 컴포넌트 타입\r\n */\r\nexport interface PopupViewProps {\r\n /**\r\n * 팝업정보\r\n */\r\n popup?: PopupItem;\r\n /** 팝업 이벤트 전달 프로퍼티 */\r\n popupEvent?: any;\r\n /** 팝업 닫기 이벤트 전달 프로퍼티 */\r\n onClose?: () => void;\r\n}\r\n\r\n// 팝업 스토어 생성\r\nexport const usePopupStore = create<PopupStore>((set, get) => ({\r\n popups: [],\r\n activePopupId: null,\r\n isLoading: false,\r\n error: null,\r\n\r\n // 팝업 열기\r\n openPopup: async (popupCode: string, data?: any, config?: PopupConfig) => {\r\n console.log(\"팝업 열기 요청:\", { popupCode, data, config });\r\n set({ isLoading: true, error: null });\r\n\r\n try {\r\n console.log(\"팝업 열기 시작:\", popupCode);\r\n\r\n // 개발 환경에서는 모의 데이터 사용\r\n let popupInfo: any = null;\r\n\r\n const response = await callService(getServiceCode(\"SRCH_POPU\"), {\r\n crprCd: getUserInfo()?.crprCd,\r\n popuCd: popupCode,\r\n });\r\n console.log(\"팝업 정보 조회 결과:\", response);\r\n\r\n // 응답 구조 파싱: { mstr: {...}, dtls: [...] }\r\n popupInfo = response?.mstr;\r\n const buttonList = response?.dtls || [];\r\n\r\n console.info(\"popupInfo:\", popupInfo);\r\n\r\n if (!popupInfo || !popupInfo.popuUrl) {\r\n const errorMsg = `팝업 정보를 찾을 수 없습니다: ${popupCode}`;\r\n console.error(errorMsg);\r\n throw new Error(errorMsg);\r\n }\r\n\r\n console.log(\"파싱된 팝업 정보:\", popupInfo);\r\n console.log(\"버튼 목록:\", buttonList);\r\n\r\n // 팝업 URL 경로 변환: 서버 경로 -> 클라이언트 경로\r\n const convertPopupUrl = (serverUrl: string): string => {\r\n // 서버에서 받은 경로: \"cm/CMAuthMstrP01\"\r\n // 클라이언트에서 사용할 경로: \"/src/pages/views/popup/cm/CMAuthMstrP01\"\r\n return `/src/pages/views/popup/${serverUrl}`;\r\n };\r\n\r\n const convertedPopupUrl = convertPopupUrl(popupInfo.popuUrl);\r\n console.log(\"변환된 팝업 URL:\", convertedPopupUrl);\r\n\r\n // 팝업 아이템 생성\r\n const popupItem: PopupItem = {\r\n popupId: `popup_${Date.now()}_${Math.random()\r\n .toString(36)\r\n .substr(2, 9)}`,\r\n popupCode: popupCode,\r\n //config.title을 통해 팝업 제목 변경 가능\r\n popupTitle: config?.title || popupInfo.popuNm || \"팝업\",\r\n popupUrl: convertedPopupUrl,\r\n popupParams: data,\r\n width: popupInfo.popuWdth || 800,\r\n height: popupInfo.popuHght || 600,\r\n resizable: true,\r\n draggable: true,\r\n buttonList: buttonList, // 버튼 목록 추가\r\n config: config,\r\n };\r\n\r\n console.log(\"생성된 팝업 아이템:\", popupItem);\r\n\r\n // 이미 같은 팝업이 열려있는지 확인\r\n const existingPopup = get().popups.find((p) => p.popupCode === popupCode);\r\n if (existingPopup) {\r\n console.log(\"기존 팝업 업데이트:\", existingPopup.popupId);\r\n // 기존 팝업을 활성화하고 데이터 업데이트\r\n set({\r\n activePopupId: existingPopup.popupId,\r\n popups: get().popups.map((p) =>\r\n p.popupId === existingPopup.popupId ? { ...p, config: config } : p\r\n ),\r\n isLoading: false,\r\n });\r\n return;\r\n }\r\n\r\n // 새 팝업 추가\r\n console.log(\"새 팝업 추가:\", popupItem.popupId);\r\n set((state) => ({\r\n popups: [...state.popups, popupItem],\r\n activePopupId: popupItem.popupId,\r\n isLoading: false,\r\n }));\r\n\r\n console.log(\"팝업 열기 완료:\", popupItem);\r\n } catch (error) {\r\n console.error(\"팝업 열기 실패:\", error);\r\n set({\r\n error: error instanceof Error ? error.message : \"팝업 열기 실패\",\r\n isLoading: false,\r\n });\r\n }\r\n },\r\n\r\n // 팝업 닫기\r\n closePopup: (popupId: string) => {\r\n const { popups, activePopupId } = get();\r\n const newPopups = popups.filter((p) => p.popupId !== popupId);\r\n\r\n // 닫힌 팝업이 현재 활성 팝업이었다면 다른 팝업을 활성화\r\n let newActivePopupId = activePopupId;\r\n if (activePopupId === popupId) {\r\n newActivePopupId =\r\n newPopups.length > 0 ? newPopups[newPopups.length - 1].popupId : null;\r\n }\r\n\r\n set({\r\n popups: newPopups,\r\n activePopupId: newActivePopupId,\r\n });\r\n },\r\n\r\n // 모든 팝업 닫기\r\n closeAllPopups: () => {\r\n set({\r\n popups: [],\r\n activePopupId: null,\r\n });\r\n },\r\n\r\n // 활성 팝업 설정\r\n setActivePopup: (popupId: string) => {\r\n set({ activePopupId: popupId });\r\n },\r\n\r\n // 팝업 설정 업데이트\r\n updatePopupConfig: (popupId: string, config: Partial<PopupConfig>) => {\r\n set((state) => ({\r\n popups: state.popups.map((p) =>\r\n p.popupId === popupId ? { ...p, config: { ...p.config, ...config } } : p\r\n ),\r\n }));\r\n },\r\n}));\r\n"],"names":["usePopupStore","create","set","get","popupCode","data","config","popupInfo","response","callService","getServiceCode","getUserInfo","buttonList","errorMsg","convertedPopupUrl","serverUrl","popupItem","existingPopup","p","state","error","popupId","popups","activePopupId","newPopups","newActivePopupId"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const g=require("zustand"),a=require("./apiUtils-Cbg6NQLv.cjs"),P=g.create((u,i)=>({popups:[],activePopupId:null,isLoading:!1,error:null,openPopup:async(p,s,r)=>{console.log("팝업 열기 요청:",{popupCode:p,data:s,config:r}),u({isLoading:!0,error:null});try{console.log("팝업 열기 시작:",p);let o=null;const l=await a.callService(a.getServiceCode("SRCH_POPU"),{crprCd:a.getUserInfo()?.crprCd,popuCd:p});console.log("팝업 정보 조회 결과:",l),o=l?.mstr;const t=l?.dtls||[];if(console.info("popupInfo:",o),!o||!o.popuUrl){const e=`팝업 정보를 찾을 수 없습니다: ${p}`;throw console.error(e),new Error(e)}console.log("파싱된 팝업 정보:",o),console.log("버튼 목록:",t);const d=(e=>`/src/pages/views/popup/${e}`)(o.popuUrl);console.log("변환된 팝업 URL:",d);const n={popupId:`popup_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,popupCode:p,popupTitle:r?.title||o.popuNm||"팝업",popupUrl:d,popupParams:s,width:o.popuWdth||800,height:o.popuHght||600,resizable:!0,draggable:!0,buttonList:t,config:r};console.log("생성된 팝업 아이템:",n);const c=i().popups.find(e=>e.popupCode===p);if(c){console.log("기존 팝업 업데이트:",c.popupId),u({activePopupId:c.popupId,popups:i().popups.map(e=>e.popupId===c.popupId?{...e,config:r}:e),isLoading:!1});return}console.log("새 팝업 추가:",n.popupId),u(e=>({popups:[...e.popups,n],activePopupId:n.popupId,isLoading:!1})),console.log("팝업 열기 완료:",n)}catch(o){console.error("팝업 열기 실패:",o),u({error:o instanceof Error?o.message:"팝업 열기 실패",isLoading:!1})}},closePopup:p=>{const{popups:s,activePopupId:r}=i(),o=s.filter(t=>t.popupId!==p);let l=r;r===p&&(l=o.length>0?o[o.length-1].popupId:null),u({popups:o,activePopupId:l})},closeAllPopups:()=>{u({popups:[],activePopupId:null})},setActivePopup:p=>{u({activePopupId:p})},updatePopupConfig:(p,s)=>{u(r=>({popups:r.popups.map(o=>o.popupId===p?{...o,config:{...o.config,...s}}:o)}))}}));exports.usePopupStore=P;
|
|
2
|
+
//# sourceMappingURL=popupStore-DnWLaQ70.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"popupStore-DnWLaQ70.cjs","sources":["../../src/stores/popupStore.ts"],"sourcesContent":["import { create } from \"zustand\";\r\nimport { callService } from \"../utils/apiUtils\";\r\nimport { getServiceCode } from \"../utils/serviceConfig\";\r\nimport { getUserInfo } from \"@/utils\";\r\n\r\n// 팝업 아이템 타입 정의\r\nexport interface PopupItem {\r\n popupId: string; // 팝업 ID\r\n popupCode: string; // 팝업 코드\r\n popupTitle: string; // 팝업 제목\r\n popupUrl: string; // 팝업 프로그램 URL\r\n popupParams?: any; // 팝업 파라미터\r\n buttonList?: any[]; // 버튼 목록\r\n width?: number; // 팝업 너비\r\n height?: number; // 팝업 높이\r\n resizable?: boolean; // 크기 조절 가능 여부\r\n draggable?: boolean; // 드래그 가능 여부\r\n config?: PopupConfig; // 팝업 설정\r\n close?: () => void; // 팝업 닫기 함수\r\n}\r\n\r\n// 팝업 스토어 타입 정의\r\nexport interface PopupStore {\r\n popups: PopupItem[]; // 열린 팝업 목록\r\n activePopupId: string | null; // 현재 활성 팝업 ID\r\n isLoading: boolean; // 로딩 상태\r\n error: string | null; // 에러 상태\r\n\r\n // 팝업 관련 액션들\r\n openPopup: (\r\n popupCode: string,\r\n data?: any,\r\n config?: PopupConfig\r\n ) => Promise<void>;\r\n closePopup: (popupId: string) => void;\r\n closeAllPopups: () => void;\r\n setActivePopup: (popupId: string) => void;\r\n\r\n updatePopupConfig: (popupId: string, config: Partial<PopupConfig>) => void;\r\n}\r\n\r\nexport interface PopupButton {\r\n key: string; // 버튼 고유 키\r\n text: string; // 버튼 텍스트\r\n type?: \"primary\" | \"default\" | \"dashed\" | \"link\" | \"text\"; // 버튼 타입\r\n danger?: boolean; // 위험 버튼 여부\r\n disabled?: boolean; // 비활성화 여부\r\n icon?: string; // 아이콘 (Ant Design 아이콘명)\r\n onClick?: (popupData?: any) => void | Promise<void>; // 클릭 이벤트\r\n}\r\n\r\n/**\r\n * 팝업 설정 타입 정의\r\n */\r\nexport interface PopupConfig {\r\n width?: number; // 팝업 너비\r\n height?: number; // 팝업 높이\r\n title?: string; // 팝업 제목\r\n buttons?: PopupButton[]; // 팝업 버튼들\r\n resizable?: boolean; // 크기 조절 가능 여부\r\n draggable?: boolean; // 드래그 가능 여부\r\n closable?: boolean; // 닫기 버튼 표시 여부\r\n maskClosable?: boolean; // 마스크 클릭 시 닫기 여부\r\n destroyOnClose?: boolean; // 닫을 때 컴포넌트 파괴 여부\r\n searchBox?: {\r\n reqArea: any;\r\n subArea?: any;\r\n style?: any;\r\n };\r\n /**\r\n * 팝업 콜백\r\n * 팝업 콜백은 팝업이 닫힐 때 호출되는 함수입니다.\r\n */\r\n callback?: (callbackParams?: any) => void;\r\n}\r\n\r\n/**\r\n * 팝업 내부 뷰 컴포넌트 타입\r\n */\r\nexport interface PopupViewProps {\r\n /**\r\n * 팝업정보\r\n */\r\n popup?: PopupItem;\r\n /** 팝업 이벤트 전달 프로퍼티 */\r\n popupEvent?: any;\r\n /** 팝업 닫기 이벤트 전달 프로퍼티 */\r\n onClose?: () => void;\r\n}\r\n\r\n// 팝업 스토어 생성\r\nexport const usePopupStore = create<PopupStore>((set, get) => ({\r\n popups: [],\r\n activePopupId: null,\r\n isLoading: false,\r\n error: null,\r\n\r\n // 팝업 열기\r\n openPopup: async (popupCode: string, data?: any, config?: PopupConfig) => {\r\n console.log(\"팝업 열기 요청:\", { popupCode, data, config });\r\n set({ isLoading: true, error: null });\r\n\r\n try {\r\n console.log(\"팝업 열기 시작:\", popupCode);\r\n\r\n // 개발 환경에서는 모의 데이터 사용\r\n let popupInfo: any = null;\r\n\r\n const response = await callService(getServiceCode(\"SRCH_POPU\"), {\r\n crprCd: getUserInfo()?.crprCd,\r\n popuCd: popupCode,\r\n });\r\n console.log(\"팝업 정보 조회 결과:\", response);\r\n\r\n // 응답 구조 파싱: { mstr: {...}, dtls: [...] }\r\n popupInfo = response?.mstr;\r\n const buttonList = response?.dtls || [];\r\n\r\n console.info(\"popupInfo:\", popupInfo);\r\n\r\n if (!popupInfo || !popupInfo.popuUrl) {\r\n const errorMsg = `팝업 정보를 찾을 수 없습니다: ${popupCode}`;\r\n console.error(errorMsg);\r\n throw new Error(errorMsg);\r\n }\r\n\r\n console.log(\"파싱된 팝업 정보:\", popupInfo);\r\n console.log(\"버튼 목록:\", buttonList);\r\n\r\n // 팝업 URL 경로 변환: 서버 경로 -> 클라이언트 경로\r\n const convertPopupUrl = (serverUrl: string): string => {\r\n // 서버에서 받은 경로: \"cm/CMAuthMstrP01\"\r\n // 클라이언트에서 사용할 경로: \"/src/pages/views/popup/cm/CMAuthMstrP01\"\r\n return `/src/pages/views/popup/${serverUrl}`;\r\n };\r\n\r\n const convertedPopupUrl = convertPopupUrl(popupInfo.popuUrl);\r\n console.log(\"변환된 팝업 URL:\", convertedPopupUrl);\r\n\r\n // 팝업 아이템 생성\r\n const popupItem: PopupItem = {\r\n popupId: `popup_${Date.now()}_${Math.random()\r\n .toString(36)\r\n .substr(2, 9)}`,\r\n popupCode: popupCode,\r\n //config.title을 통해 팝업 제목 변경 가능\r\n popupTitle: config?.title || popupInfo.popuNm || \"팝업\",\r\n popupUrl: convertedPopupUrl,\r\n popupParams: data,\r\n width: popupInfo.popuWdth || 800,\r\n height: popupInfo.popuHght || 600,\r\n resizable: true,\r\n draggable: true,\r\n buttonList: buttonList, // 버튼 목록 추가\r\n config: config,\r\n };\r\n\r\n console.log(\"생성된 팝업 아이템:\", popupItem);\r\n\r\n // 이미 같은 팝업이 열려있는지 확인\r\n const existingPopup = get().popups.find((p) => p.popupCode === popupCode);\r\n if (existingPopup) {\r\n console.log(\"기존 팝업 업데이트:\", existingPopup.popupId);\r\n // 기존 팝업을 활성화하고 데이터 업데이트\r\n set({\r\n activePopupId: existingPopup.popupId,\r\n popups: get().popups.map((p) =>\r\n p.popupId === existingPopup.popupId ? { ...p, config: config } : p\r\n ),\r\n isLoading: false,\r\n });\r\n return;\r\n }\r\n\r\n // 새 팝업 추가\r\n console.log(\"새 팝업 추가:\", popupItem.popupId);\r\n set((state) => ({\r\n popups: [...state.popups, popupItem],\r\n activePopupId: popupItem.popupId,\r\n isLoading: false,\r\n }));\r\n\r\n console.log(\"팝업 열기 완료:\", popupItem);\r\n } catch (error) {\r\n console.error(\"팝업 열기 실패:\", error);\r\n set({\r\n error: error instanceof Error ? error.message : \"팝업 열기 실패\",\r\n isLoading: false,\r\n });\r\n }\r\n },\r\n\r\n // 팝업 닫기\r\n closePopup: (popupId: string) => {\r\n const { popups, activePopupId } = get();\r\n const newPopups = popups.filter((p) => p.popupId !== popupId);\r\n\r\n // 닫힌 팝업이 현재 활성 팝업이었다면 다른 팝업을 활성화\r\n let newActivePopupId = activePopupId;\r\n if (activePopupId === popupId) {\r\n newActivePopupId =\r\n newPopups.length > 0 ? newPopups[newPopups.length - 1].popupId : null;\r\n }\r\n\r\n set({\r\n popups: newPopups,\r\n activePopupId: newActivePopupId,\r\n });\r\n },\r\n\r\n // 모든 팝업 닫기\r\n closeAllPopups: () => {\r\n set({\r\n popups: [],\r\n activePopupId: null,\r\n });\r\n },\r\n\r\n // 활성 팝업 설정\r\n setActivePopup: (popupId: string) => {\r\n set({ activePopupId: popupId });\r\n },\r\n\r\n // 팝업 설정 업데이트\r\n updatePopupConfig: (popupId: string, config: Partial<PopupConfig>) => {\r\n set((state) => ({\r\n popups: state.popups.map((p) =>\r\n p.popupId === popupId ? { ...p, config: { ...p.config, ...config } } : p\r\n ),\r\n }));\r\n },\r\n}));\r\n"],"names":["usePopupStore","create","set","get","popupCode","data","config","popupInfo","response","callService","getServiceCode","getUserInfo","buttonList","errorMsg","convertedPopupUrl","serverUrl","popupItem","existingPopup","p","state","error","popupId","popups","activePopupId","newPopups","newActivePopupId"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const y=require("./jsx-runtime-CeSfJrVB.cjs"),v=require("./codeStore-BGLhSpAM.cjs"),u=require("react"),o=require("./commonUtils-BH6QwGUb.cjs"),i=require("./apiUtils-Cbg6NQLv.cjs"),L=require("./popupStore-DnWLaQ70.cjs"),D=u.createContext(void 0),x=({children:e})=>{const{codeData:r,isLoading:s,error:m,lastUpdated:c,getCodeList:l,getCodeListByOption:d,getCodeName:g,getCodeColor:C,getCodeByOption:p,getAvailableGroupCodes:U,getGridLookup:f,fetchCommonCodes:P}=v.useCodeStore(),b={codeData:r,isLoading:s,error:m,lastUpdated:c,getCodeList:l,getCodeListByOption:d,getCodeName:g,getCodeColor:C,getCodeByOption:p,getAvailableGroupCodes:U,getGridLookup:f,refreshCodes:P};return y.jsxRuntimeExports.jsx(D.Provider,{value:b,children:e})},a=()=>{const e=u.useContext(D);if(e===void 0)throw new Error("useCommonCode must be used within a CommonCodeProvider");return e},E=()=>{const{getCodeList:e,isLoading:r,error:s}=a();return{getCodeList:e,isLoading:r,error:s}},S=()=>{const{getCodeName:e,isLoading:r,error:s}=a();return{getCodeName:e,isLoading:r,error:s}},A=()=>{const{getCodeColor:e,isLoading:r,error:s}=a();return{getCodeColor:e,isLoading:r,error:s}},I=()=>{const{getCodeListByOption:e,isLoading:r,error:s}=a();return{getCodeListByOption:e,isLoading:r,error:s}},N=()=>{const{getGridLookup:e,isLoading:r,error:s}=a();return{getGridLookup:e,isLoading:r,error:s}},T={...o.dateUtils,...i.stringUtils,isEmptyArray:o.isEmptyArray,isNotEmptyArray:o.isNotEmptyArray,unique:o.unique,shuffle:o.shuffle,sortBy:o.sortBy,max:o.max,min:o.min,average:o.average,sum:o.sum,randomFromArray:o.randomFromArray,flattenArray:o.flattenArray,...o.objectUtils,debounce:o.debounce,throttle:o.throttle,setLocalStorage:o.setLocalStorage,getLocalStorage:o.getLocalStorage,formatNumber:o.formatNumber,formatCurrency:o.formatCurrency,copyToClipboard:o.copyToClipboard,isMobile:o.isMobile,isDesktop:o.isDesktop,callService:i.callService,apiGet:i.apiGet,apiPost:i.apiPost,apiPut:i.apiPut,apiDelete:i.apiDelete,apiPatch:i.apiPatch},h=u.createContext(void 0),G=({children:e})=>y.jsxRuntimeExports.jsx(h.Provider,{value:{utils:T},children:e}),n=()=>{const e=u.useContext(h);if(e===void 0)throw new Error("useUtils must be used within a UtilsProvider");return e.utils},t=(e,r,s)=>e&&typeof e[r]=="function"?e[r]:s||(()=>{}),k=()=>{const e=n();return{formatDate:t(e,"formatDate"),formatDateKorean:t(e,"formatDateKorean"),getCurrentDate:t(e,"getCurrentDate"),getCurrentDateString:t(e,"getCurrentDateString"),getRelativeTime:t(e,"getRelativeTime"),isToday:t(e,"isToday"),isThisWeek:t(e,"isThisWeek"),isThisMonth:t(e,"isThisMonth"),getDateDiff:t(e,"getDateDiff"),calculateAge:t(e,"calculateAge")}},q=()=>{const e=n();return{isEmpty:t(e,"isEmpty"),isNotEmpty:t(e,"isNotEmpty"),truncate:t(e,"truncate"),capitalize:t(e,"capitalize"),formatPhoneNumber:t(e,"formatPhoneNumber"),isValidEmail:t(e,"isValidEmail"),removeHtmlTags:t(e,"removeHtmlTags"),generateUID:t(e,"generateUID"),generateShortUID:t(e,"generateShortUID"),generateLongUID:t(e,"generateLongUID"),generateNumericUID:t(e,"generateNumericUID"),generateAlphanumericUID:t(e,"generateAlphanumericUID"),generateGUID:t(e,"generateGUID"),generateGUIDWithoutHyphens:t(e,"generateGUIDWithoutHyphens"),generateTimestampUID:t(e,"generateTimestampUID"),generateCustomUID:t(e,"generateCustomUID"),encryptSha256:t(e,"encryptSha256"),bxmEncrypt:t(e,"bxmEncrypt"),bxmDecrypt:t(e,"bxmDecrypt"),simpleEncrypt:t(e,"simpleEncrypt"),simpleDecrypt:t(e,"simpleDecrypt"),md5Hash:t(e,"md5Hash"),sha256Hash:t(e,"sha256Hash"),base64Encode:t(e,"base64Encode"),base64Decode:t(e,"base64Decode")}},w=()=>{const e=n();return{isEmptyArray:t(e,"isEmptyArray"),isNotEmptyArray:t(e,"isNotEmptyArray"),unique:t(e,"unique"),shuffle:t(e,"shuffle"),sortBy:t(e,"sortBy"),max:t(e,"max"),min:t(e,"min"),average:t(e,"average"),sum:t(e,"sum")}},B=()=>{const e=n();return{debounce:t(e,"debounce"),throttle:t(e,"throttle"),setLocalStorage:t(e,"setLocalStorage"),getLocalStorage:t(e,"getLocalStorage"),formatNumber:t(e,"formatNumber"),formatCurrency:t(e,"formatCurrency"),copyToClipboard:t(e,"copyToClipboard"),isMobile:t(e,"isMobile"),isDesktop:t(e,"isDesktop")}},H=()=>{const e=n();return{callService:t(e,"callService"),apiGet:t(e,"apiGet"),apiPost:t(e,"apiPost"),apiPut:t(e,"apiPut"),apiDelete:t(e,"apiDelete"),apiPatch:t(e,"apiPatch")}},M=()=>!1,R=()=>{const{popups:e,activePopupId:r,setActivePopup:s,closePopup:m,openPopup:c}=L.usePopupStore(),l=u.useCallback(async(d,g,C)=>{try{await c(d,g,C)}catch(p){throw console.error("팝업 열기 실패:",p),p}},[c]);return{popups:e,activePopupId:r,setActivePopup:s,closePopup:m,showPopup:l,isPopup:e.length>0}};exports.CommonCodeProvider=x;exports.UtilsProvider=G;exports.useApiUtils=H;exports.useArrayUtils=w;exports.useCodeColor=A;exports.useCodeList=E;exports.useCodeListByOption=I;exports.useCodeName=S;exports.useCommonCode=a;exports.useCommonUtils=B;exports.useDateUtils=k;exports.useGridLookup=N;exports.usePopup=R;exports.usePopupContext=M;exports.useStringUtils=q;exports.useUtils=n;
|
|
2
|
+
//# sourceMappingURL=usePopup-C8FrbrDD.cjs.map
|