@kodiak-finance/orderly-ui-notification 2.8.19-rc.0 → 2.8.20
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/index.js +16 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +16 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +8 -8
package/dist/index.js
CHANGED
|
@@ -145,6 +145,14 @@ var AnnouncementItem = (props) => {
|
|
|
145
145
|
return t("notification.general");
|
|
146
146
|
}
|
|
147
147
|
}, [props.type, t]);
|
|
148
|
+
const isExternalLink = (url) => {
|
|
149
|
+
try {
|
|
150
|
+
const urlObj = new URL(url, window.location.origin);
|
|
151
|
+
return urlObj.origin !== window.location.origin;
|
|
152
|
+
} catch {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
};
|
|
148
156
|
const action = react.useMemo(() => {
|
|
149
157
|
if (props.type === orderlyTypes.AnnouncementType.Campaign && typeof props.url === "string" && props.url !== "" && typeof props.onItemClick === "function") {
|
|
150
158
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -155,7 +163,13 @@ var AnnouncementItem = (props) => {
|
|
|
155
163
|
className: "oui-cursor-pointer",
|
|
156
164
|
onClick: (event) => {
|
|
157
165
|
event.stopPropagation();
|
|
158
|
-
props.
|
|
166
|
+
const url = props.url;
|
|
167
|
+
const isExternal = isExternalLink(url);
|
|
168
|
+
if (isExternal) {
|
|
169
|
+
window.open(url, "_blank", "noopener,noreferrer");
|
|
170
|
+
} else {
|
|
171
|
+
props.onItemClick(url);
|
|
172
|
+
}
|
|
159
173
|
},
|
|
160
174
|
children: [
|
|
161
175
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -848,8 +862,7 @@ var AnnouncementCenterPage = (props) => {
|
|
|
848
862
|
return;
|
|
849
863
|
props.routerAdapter?.onRouteChange({
|
|
850
864
|
href: url,
|
|
851
|
-
name: url
|
|
852
|
-
target: "_blank"
|
|
865
|
+
name: url
|
|
853
866
|
});
|
|
854
867
|
}
|
|
855
868
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/announcementCenter/announcementCenter.ui.tsx","../src/components/announcementCenter/announcementItem.tsx","../src/components/announcementCenter/icons.tsx","../src/components/notification/notification.ui.tsx","../src/components/notification/contentCard.tsx","../src/pages/announcementCenter.widget.tsx","../src/pages/announcementCenter.script.tsx","../src/hooks/useAnnouncement.ts","../src/pages/announcementCenter.ui.tsx","../src/pages/announcementCenter.page.tsx"],"names":["useTranslation","Text","cn","jsx","jsxs","Icon","useMemo","useState","AnnouncementType","ChevronDownIcon","Flex","Fragment","format","brokerName","AnnouncementCenterUI"],"mappings":";AAAA,SAAa,gBAAgB;AAC7B,SAAS,kBAAAA,uBAAsB;AAE/B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAAC;AAAA,OACK;AACP,SAAS,MAAAC,WAAU;;;ACTnB,SAAa,eAAe;AAC5B,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AACjC,SAAS,MAAM,MAAM,iBAAiB,UAAU;;;ACDhD,SAAS,YAAY;AAMb,SAQE,KARF;AAJD,IAAM,aAAgC,CAAC,UAAU;AACtD,SACE,qBAAC,QAAK,MAAM,IAAI,SAAQ,aAAa,GAAG,OACtC;AAAA,wBAAC,UACC;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,eAAc;AAAA,QAEd;AAAA,8BAAC,UAAK,WAAU,sCAAqC;AAAA,UACrD,oBAAC,UAAK,QAAO,KAAI,WAAU,wCAAuC;AAAA;AAAA;AAAA,IACpE,GACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,aAAa;AAAA,QACb,GAAE;AAAA;AAAA,IACJ;AAAA,KACF;AAEJ;AAEO,IAAM,eAAkC,CAAC,UAAU;AACxD,SACE,oBAAC,QAAK,MAAM,IAAI,SAAQ,aAAa,GAAG,OACtC;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAa;AAAA,MACb,GAAE;AAAA;AAAA,EACJ,GACF;AAEJ;AAEO,IAAM,sBAAyC,CAAC,UAAU;AAC/D,SACE,qBAAC,QAAK,MAAM,IAAI,SAAQ,aAAa,GAAG,OACtC;AAAA,wBAAC,UACC;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,eAAc;AAAA,QAEd;AAAA,8BAAC,UAAK,WAAU,sCAAqC;AAAA,UACrD,oBAAC,UAAK,QAAO,KAAI,WAAU,wCAAuC;AAAA;AAAA;AAAA,IACpE,GACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,aAAa;AAAA,QACb,GAAE;AAAA;AAAA,IACJ;AAAA,KACF;AAEJ;AAEO,IAAM,WAA8B,CAAC,UAAU;AACpD,SACE,oBAAC,QAAK,MAAM,IAAI,SAAQ,aAAa,GAAG,OACtC;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAa;AAAA,MACb,GAAE;AAAA;AAAA,EACJ,GACF;AAEJ;AAEO,IAAM,mBAAsC,CAAC,UAAU;AAC5D,SACE,oBAAC,QAAK,MAAM,IAAI,SAAQ,aAAa,GAAG,OACtC;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAa;AAAA,MACb,GAAE;AAAA;AAAA,EACJ,GACF;AAEJ;AAEO,IAAM,eAAkC,CAAC,UAAU;AACxD,SACE,qBAAC,QAAK,MAAM,IAAI,SAAQ,aAAa,GAAG,OACtC;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,MAAK;AAAA,QACL,aAAY;AAAA;AAAA,IACd;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,MAAK;AAAA,QACL,aAAY;AAAA;AAAA,IACd;AAAA,KACF;AAEJ;;;AD1CQ,SASE,OAAAC,MATF,QAAAC,aAAA;AAnDD,IAAM,mBAWR,CAAC,UAAU;AACd,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAMC,QAAO,QAAQ,MAAM;AACzB,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK,iBAAiB;AACpB,eAAO;AAAA,MAET,KAAK,iBAAiB;AACpB,eAAO;AAAA,MACT,KAAK,iBAAiB;AACpB,eAAO;AAAA,MACT,KAAK,iBAAiB;AAAA,MACtB;AACE,eAAO;AAAA,IACX;AAAA,EACF,GAAG,CAAC,MAAM,IAAI,CAAC;AAEf,QAAM,QAAQ,QAAQ,MAAM;AAC1B,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK,iBAAiB;AACpB,eAAO,EAAE,uBAAuB;AAAA,MAClC,KAAK,iBAAiB;AACpB,eAAO,EAAE,wBAAwB;AAAA,MACnC,KAAK,iBAAiB;AACpB,eAAO,EAAE,sBAAsB;AAAA,MACjC,KAAK,iBAAiB;AACpB,eAAO,EAAE,0BAA0B;AAAA,MACrC;AACE,eAAO,EAAE,sBAAsB;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;AAElB,QAAM,SAAS,QAAQ,MAAM;AAC3B,QACE,MAAM,SAAS,iBAAiB,YAChC,OAAO,MAAM,QAAQ,YACrB,MAAM,QAAQ,MACd,OAAO,MAAM,gBAAgB,YAC7B;AACA,aACE,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,WAAU;AAAA,UACV,WAAU;AAAA,UACV,SAAS,CAAC,UAAU;AAClB,kBAAM,gBAAgB;AACtB,kBAAM,YAAY,MAAM,GAAI;AAAA,UAC9B;AAAA,UAEA;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAM;AAAA,gBACN,WAAU;AAAA,gBAET,YAAE,sBAAsB;AAAA;AAAA,YAC3B;AAAA,YACA,gBAAAA,KAAC,uBAAoB,MAAM,IAAI;AAAA;AAAA;AAAA,MACjC;AAAA,IAEJ;AACA,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,MAAM,MAAM,KAAK,CAAC,CAAC;AAE7B,QAAM,aAAa,QAAQ,MAAM;AAC/B,QAAI,MAAM,SAAS,iBAAiB,aAAa;AAC/C,aACE,gBAAAA,KAAC,QAAK,MAAK,OAAM,WAAW,IACzB,YAAE,8BAA8B,GACnC;AAAA,IAEJ;AACA,WACE,gBAAAA;AAAA,MAAC,KAAK;AAAA,MAAL;AAAA,QACC,MAAK;AAAA,QACL,WAAW;AAAA,QACX,MAAK;AAAA,QACL,cAAa;AAAA,QAEZ,gBAAM;AAAA;AAAA,IACT;AAAA,EAEJ,GAAG,CAAC,MAAM,aAAa,MAAM,MAAM,CAAC,CAAC;AAErC,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA,CAAC,MAAM,eAAe;AAAA,QACtB,CAAC,MAAM,eAAe,MAAM,YAAY;AAAA,QACxC,MAAM;AAAA,MACR;AAAA,MACA,SAAS,MAAM;AACb,cAAM,iBAAiB;AAAA,MACzB;AAAA,MAEA;AAAA,wBAAAD,KAACE,OAAA,EAAK,OAAM,SAAQ,WAAU,yBAAwB;AAAA,QAEtD,gBAAAD,MAAC,QAAK,WAAU,UAAS,WAAU,SAAQ,MAAI,MAC7C;AAAA,0BAAAD,KAAC,QAAK,MAAK,MAAK,WAAW,IAAI,QAAO,QACnC,iBACH;AAAA,UACC;AAAA,UAED,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,kBAAkB,MAAM,WAAW,QAAQ;AAAA,cAC7C;AAAA,cAEA,0BAAAC,MAAC,SAAI,WAAU,uDACb;AAAA,gCAAAD,KAAC,QAAK,MAAK,OAAM,WAAW,IAAI,IAAG,OAAM,WAAU,YAChD,gBAAM,SACT;AAAA,gBACC;AAAA,iBACH;AAAA;AAAA,UACF;AAAA,WACF;AAAA,QACA,gBAAAA,KAAC,SAAI,WAAU,YAEb,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,MAAM;AAAA,YACN,WAAW,6DACT,MAAM,WAAW,mBAAmB,cACtC;AAAA;AAAA,QACF,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;ADjIQ,SA+CJ,UA/CI,OAAAA,MA+CJ,QAAAC,aA/CI;AAbD,IAAM,sBAMR,CAAC,UAAU;AACd,QAAM,EAAE,YAAY,SAAS,gBAAgB,YAAY,IAAI;AAC7D,QAAM,EAAE,EAAE,IAAIJ,gBAAe;AAE7B,MAAI,CAAC,MAAM,QAAQ,UAAU,KAAK,WAAW,WAAW,GAAG;AACzD,WACE,gBAAAG,KAAC,SAAI,WAAU,8DACb,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,UAAU,sBAAsB;AAAA,QAChC,OAAO,EAAE,oBAAoB;AAAA;AAAA,IAC/B,GACF;AAAA,EAEJ;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAWD;AAAA,QACT;AAAA,QACA,MAAM,eACJ;AAAA,MACJ;AAAA,MAEC,qBAAW,IAAI,CAAC,SACf,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,KAAK,KAAK;AAAA,UACV;AAAA,UAEA,SAAS,KAAK;AAAA,UACd,aAAa,KAAK,gBAAgB;AAAA,UAClC,UAAU,YAAY,KAAK;AAAA,UAC3B,MAAM,KAAK;AAAA,UACX,aAAa,MAAM;AAAA,UACnB,gBAAgB,MAAM;AACpB,gBAAI,YAAY,KAAK,iBAAiB;AACpC,6BAAe,IAAI;AAAA,YACrB,OAAO;AACL,6BAAe,KAAK,eAAe;AAAA,YACrC;AAAA,UACF;AAAA;AAAA,QAZK,KAAK;AAAA,MAaZ,CACD;AAAA;AAAA,EACH;AAEJ;AAEO,IAAM,uBAGR,CAAC,UAAU;AACd,QAAM,EAAE,EAAE,IAAIH,gBAAe;AAC7B,QAAM,CAAC,UAAU,WAAW,IAAI,SAAiC,IAAI;AAErE,SACE,gBAAAI,MAAA,YACE;AAAA,oBAAAD,KAAC,SAAI,WAAU,qBACb,0BAAAA,KAACF,OAAA,EAAK,WAAW,IAAI,QAAO,QACzB,YAAE,oBAAoB,GACzB,GACF;AAAA,IAEA,gBAAAE,KAAC,cAAW,WAAU,6DACpB,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,YAAY,MAAM;AAAA,QAClB,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,aAAa,MAAM;AAAA;AAAA,IACrB,GACF;AAAA,KACF;AAEJ;;;AGzFA,SAAa,WAAAG,UAAS,YAAAC,iBAAgB;AACtC,SAAS,kBAAAP,uBAAsB;AAC/B,SAAS,oBAAAQ,yBAAkC;AAC3C;AAAA,EACE,mBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAAC;AAAA,EACA,QAAAT;AAAA,OACK;;;ACVP,SAAa,WAAAK,gBAAe;AAC5B,SAAS,eAAe;AACxB,SAAS,QAAQ,mBAAmB,2BAA2B;AAC/D,SAAS,kBAAAN,uBAAsB;AAC/B,SAAS,QAAAU,OAAM,QAAAT,aAAY;AAarB,gBAAAE,MAaI,QAAAC,aAbJ;AAVC,IAAM,sBAMR,CAAC,EAAE,SAAS,YAAY,KAAK,YAAY,MAAM;AAClD,QAAM,EAAE,EAAE,IAAIJ,gBAAe;AAC7B,SACE,gBAAAI,MAAC,SAAI,WAAU,mCACb;AAAA,oBAAAD,KAACF,OAAA,EAAK,MAAK,MAAK,QAAO,QACpB,mBACH;AAAA,IACA,gBAAAE;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,iBAAiB,OAAO,UAAU;AAAA,UAClC,QAAQ;AAAA,QACV;AAAA;AAAA,IACD;AAAA,IACA,OAAO,QAAQ,YACd,QAAQ,MACR,OAAO,gBAAgB,cACrB,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAS,MAAM,YAAY,GAAG;AAAA,QAE9B;AAAA,0BAAAD;AAAA,YAACF;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAM;AAAA,cACN,WAAU;AAAA,cAET,YAAE,sBAAsB;AAAA;AAAA,UAC3B;AAAA,UACA,gBAAAE,KAAC,uBAAoB,MAAM,IAAI,OAAM,WAAU;AAAA;AAAA;AAAA,IACjD;AAAA,KAEN;AAEJ;AAEO,IAAM,yBAIR,CAAC,EAAE,SAAS,WAAW,QAAQ,MAAM;AACxC,QAAM,EAAE,EAAE,IAAIH,gBAAe;AAC7B,QAAM,mBAAmBM,SAAQ,MAAM;AAErC,UAAM,QAAQ,kBAAkB,SAAS,SAAS;AAElD,UAAM,UAAU,oBAAoB,SAAS,SAAS,IAAI,QAAQ;AAGlE,UAAM,WAAW,IAAI,QAAQ,SAAS;AACtC,UAAM,SAAS,IAAI,QAAQ,OAAO;AAGlC,UAAM,qBAAqB,OAAO,UAAU,OAAO;AAGnD,UAAM,mBAAmB,OAAO,QAAQ,SAAS;AAEjD,QAAI,QAAQ,GAAG;AACb,aAAO,EAAE,0CAA0C;AAAA,QACjD,OAAO,UAAU,KAAK,QAAQ,UAAU,IAAI,QAAQ,CAAC,IAAI;AAAA,QACzD;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO,EAAE,4CAA4C;AAAA,MACnD;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,WAAW,SAAS,CAAC,CAAC;AAE1B,SACE,gBAAAF,MAAC,SAAI,WAAU,mCACb;AAAA,oBAAAD,KAACF,OAAA,EAAK,MAAK,MAAK,WAAW,IACxB,YAAE,8BAA8B,GACnC;AAAA,IACA,gBAAAE,KAACO,OAAA,EAAK,WAAW,UACf,0BAAAP,KAACF,OAAA,EAAK,MAAK,MAAK,QAAO,QACpB,4BACH,GACF;AAAA,IACC,WACC,gBAAAE,KAACF,OAAA,EAAK,MAAK,OAAM,WAAW,IAAI,IAAG,OAAM,WAAU,YAChD,mBACH;AAAA,KAEJ;AAEJ;AAEO,IAAM,uBAGR,CAAC,EAAE,SAAS,WAAW,MAAM;AAChC,SACE,gBAAAG,MAAC,SAAI,WAAU,mCACb;AAAA,oBAAAD;AAAA,MAACF,MAAK;AAAA,MAAL;AAAA,QACC,MAAK;AAAA,QACL,WAAW;AAAA,QACX,cAAa;AAAA,QACb,MAAK;AAAA,QAEJ;AAAA;AAAA,IACH;AAAA,IACA,gBAAAE,KAACF,OAAA,EAAK,MAAK,MAAK,QAAO,QACpB,mBACH;AAAA,KACF;AAEJ;AAEO,IAAM,qBAGR,CAAC,EAAE,SAAS,WAAW,MAAM;AAChC,SACE,gBAAAG,MAAC,SAAI,WAAU,mCACb;AAAA,oBAAAD;AAAA,MAACF,MAAK;AAAA,MAAL;AAAA,QACC,MAAK;AAAA,QACL,WAAW;AAAA,QACX,cAAa;AAAA,QACb,MAAK;AAAA,QAEJ;AAAA;AAAA,IACH;AAAA,IACA,gBAAAE,KAACF,OAAA,EAAK,MAAK,MAAK,QAAO,QACpB,mBACH;AAAA,KACF;AAEJ;;;ADnFU,SAwJD,YAAAU,WAxJC,OAAAR,MA6CJ,QAAAC,aA7CI;AAhBV,IAAM,qBAOD,CAAC,UAAU;AACd,QAAM,EAAE,EAAE,IAAIJ,gBAAe;AAC7B,QAAM,EAAE,SAAS,IAAI;AACrB,QAAM,EAAE,KAAK,IAAI,MAAM,WAAW,MAAM,OAAO;AAE/C,QAAM,QAAQM,SAAQ,MAAM;AAC1B,YAAQ,MAAM;AAAA,MACZ,KAAKE,kBAAiB;AACpB,eACE,gBAAAL;AAAA,UAACF;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YAET,YAAE,uBAAuB;AAAA;AAAA,QAC5B;AAAA,MAEJ,KAAKO,kBAAiB;AACpB,eAAO,gBAAAL,KAACF,OAAA,EAAK,MAAK,MAAM,YAAE,6BAA6B,GAAE;AAAA,MAC3D,KAAKO,kBAAiB;AACpB,eACE,gBAAAL,KAACF,OAAA,EAAK,MAAK,MAAK,OAAM,OACnB,YAAE,sBAAsB,GAC3B;AAAA,MAEJ,KAAKO,kBAAiB;AACpB,eACE,gBAAAL,KAACF,OAAA,EAAK,MAAK,MAAK,OAAM,WACnB,YAAE,+BAA+B,GACpC;AAAA,MAEJ;AACE,eACE,gBAAAE,KAACF,OAAA,EAAK,MAAK,MAAK,OAAM,WACnB,YAAE,2BAA2B,GAChC;AAAA,IAEN;AAAA,EACF,GAAG,CAAC,MAAM,CAAC,CAAC;AACZ,QAAM,OAAOK,SAAQ,MAAM;AACzB,YAAQ,MAAM;AAAA,MACZ,KAAKE,kBAAiB;AACpB,eAAO,gBAAAL,KAAC,cAAW,OAAM,SAAQ;AAAA,MAEnC,KAAKK,kBAAiB;AACpB,eAAO,gBAAAL,KAAC,YAAS,OAAM,WAAU;AAAA,MACnC,KAAKK,kBAAiB;AACpB,eAAO,gBAAAL,KAAC,gBAAa,OAAM,WAAU;AAAA,MACvC,KAAKK,kBAAiB;AAAA,MACtB;AACE,eAAO,gBAAAL,KAAC,oBAAiB,OAAM,SAAQ;AAAA,IAC3C;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AACT,SACE,gBAAAC,MAACM,OAAA,EAAK,WAAU,UAAS,SAAQ,WAAU,WAAU,qBACnD;AAAA,oBAAAN,MAAC,SAAI,WAAU,mEACZ;AAAA;AAAA,MACA;AAAA,OACH;AAAA,IACA,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,MAAM;AAAA,QACf,WAAU;AAAA,QACV,OAAO;AAAA,UACL,WAAW,CAAC,WAAW,mBAAmB;AAAA,QAC5C;AAAA,QAEA,0BAAAA,KAACM,kBAAA,EAAgB,MAAM,IAAI,OAAM,SAAQ;AAAA;AAAA,IAC3C;AAAA,KACF;AAEJ;AAEA,IAAM,qBAMD,CAAC,UAAU;AACd,QAAM,EAAE,OAAO,SAAS,YAAY,QAAQ,OAAO,IAAI;AACvD,QAAM,EAAE,EAAE,IAAIT,gBAAe;AAC7B,SACE,gBAAAI;AAAA,IAACM;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,WAAU;AAAA,MACV,SAAQ;AAAA,MAER;AAAA,wBAAAN,MAACM,OAAA,EAAK,KAAK,GACT;AAAA,0BAAAP;AAAA,YAAC;AAAA;AAAA,cACC,UAAU,UAAU,IAAI;AAAA,cACxB,SAAS;AAAA,cACT,WAAU;AAAA,cAEV,0BAAAA,KAAC,mBAAgB,MAAM,IAAI,OAAM,SAAQ;AAAA;AAAA,UAC3C;AAAA,UACA,gBAAAC,MAACH,OAAA,EAAK,WAAW,IAAI,MAAK,MACvB;AAAA,sBAAU;AAAA,YAAE;AAAA,YAAE;AAAA,aACjB;AAAA,UACA,gBAAAE;AAAA,YAAC;AAAA;AAAA,cACC,UAAU,UAAU,KAAK;AAAA,cACzB,SAAS;AAAA,cACT,WAAU;AAAA,cAEV,0BAAAA,KAAC,oBAAiB,MAAM,IAAI,OAAM,SAAQ;AAAA;AAAA,UAC5C;AAAA,WACF;AAAA,QACA,gBAAAA,KAAC,YAAO,SAAS,YACf,0BAAAA,KAACF,OAAA,EAAK,MAAK,MAAK,OAAM,WACnB,YAAE,yBAAyB,EAAE,MAAM,CAAC,GACvC,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAM,sBAOD,CAAC,UAAU;AACd,QAAM,WAAWK,SAAQ,MAAM;AAC7B,WAAO,MAAM,WAAW,IAAI,CAAC,YAAY;AACvC,YAAM,EAAE,KAAK,IAAI;AACjB,cAAQ,MAAM;AAAA,QACZ,KAAKE,kBAAiB;AACpB,iBACE,gBAAAL;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,QAAQ;AAAA,cACjB,YAAY,QAAQ,cAAc;AAAA,cAClC,YAAY,QAAQ,gBAAgB;AAAA,cACpC,KAAK,QAAQ,OAAO;AAAA,cACpB,aAAa,MAAM;AAAA;AAAA,UACrB;AAAA,QAEJ,KAAKK,kBAAiB;AACpB,iBACE,gBAAAL;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,QAAQ;AAAA,cACjB,WAAW,QAAQ,aAAa;AAAA,cAChC,SAAS,QAAQ,WAAW;AAAA;AAAA,UAC9B;AAAA,QAEJ,KAAKK,kBAAiB;AACpB,iBACE,gBAAAL;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,QAAQ;AAAA,cACjB,YAAY,QAAQ,gBAAgB;AAAA;AAAA,UACtC;AAAA,QAEJ;AACE,iBACE,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,QAAQ;AAAA,cACjB,YAAY,QAAQ,gBAAgB;AAAA;AAAA,UACtC;AAAA,MAEN;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,MAAM,UAAU,CAAC;AACrB,SAAO,gBAAAA,KAAAQ,WAAA,EAAG,mBAAS,MAAM,OAAO,GAAE;AACpC;AAEO,IAAM,iBAKT,CAAC,UAAU;AACb,QAAM,CAAC,UAAU,WAAW,IAAIJ,UAAS,IAAI;AAE7C,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,CAAC;AACxC,QAAM,MAAMD,SAAQ,MAAM,MAAM,YAAY,UAAU,GAAG,CAAC,MAAM,UAAU,CAAC;AAE3E,MAAI,QAAQ,GAAG;AACb,WAAO;AAAA,EACT;AAEA,SACE,gBAAAF,MAAC,SAAI,WAAU,oCACb;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,YAAY,MAAM,cAAc,CAAC;AAAA,QACjC;AAAA,QACA;AAAA,QACA,gBAAgB,MAAM;AACpB,sBAAY,CAAC,QAAQ;AAAA,QACvB;AAAA;AAAA,IACF;AAAA,IACA,gBAAAA,KAAC,WAAQ,WAAU,YAAW;AAAA,IAC9B,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,kBAAkB,WAAW,QAAQ;AAAA,QACvC;AAAA,QAGA,0BAAAA,KAAC,SAAI,WAAU,oCACb,0BAAAA,KAAC,SAAI,WAAU,qBACb,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,YAAY,MAAM,cAAc,CAAC;AAAA,YACjC;AAAA,YACA,aAAa,MAAM;AAAA;AAAA,QACrB,GACF,GACF;AAAA;AAAA,IACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP;AAAA,QACA,YAAY,MAAM,YAAY,MAAM;AAAA,QAAC;AAAA,QACrC,QAAQ,MAAM;AACZ,cAAI,UAAU,IAAI,GAAG;AACnB;AAAA,UACF;AACA,qBAAW,UAAU,CAAC;AAAA,QACxB;AAAA,QACA,QAAQ,MAAM;AACZ,cAAI,UAAU,KAAK,KAAK;AACtB;AAAA,UACF;AACA,qBAAW,UAAU,CAAC;AAAA,QACxB;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;AEvRA,SAAa,mBAAmB;;;ACAhC,SAAS,YAAAI,iBAAgB;;;ACAzB,SAAS,WAAW,WAAAD,UAAS,YAAAC,iBAAgB;AAC7C,SAAS,mBAAmB;AAC5B,SAAS,UAAAK,eAAc;AACvB,SAAS,eAAe;AACxB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAAZ,uBAAsB;AAC/B,SAAS,qBAAqB;AAC9B;AAAA,EACE,oBAAAQ;AAAA,EAEA;AAAA,OAEK;AAGP,IAAM,SAAS,MAAO,KAAK,KAAK;AAEhC,IAAM,iBAAiB;AAWvB,IAAM,2BAA2B;AAEjC,IAAM,gBAAgB,CAAC,cAAsB;AAC3C,QAAM,OAAOI,QAAO,IAAI,YAAY,SAAS,GAAG,QAAQ;AACxD,QAAM,OAAOA,QAAO,IAAI,YAAY,SAAS,GAAG,SAAS;AACzD,SAAO,GAAG,IAAI,aAAa,IAAI;AACjC;AAEA,IAAM,wBAAwB,CAAC,QAA0B;AACvD,SAAO,QAA0B,KAAK,CAAC,UAAU;AAC/C,QAAI,MAAM,QAAQ,MAAM,IAAI,GAAG;AAC7B,YAAM,KAAK,KAAK,CAAC,GAAG,MAAM;AACxB,YAAI,EAAE,gBAAgB,EAAE,cAAc;AACpC,iBAAO,EAAE,eAAe,EAAE;AAAA,QAC5B;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEA,IAAM,sBAAsB,MAAM;AAChC,QAAM,KAAK,MAAM;AAEjB,QAAM,CAAC,mBAAmB,QAAQ,IAAI;AAAA,IACpC;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,CAAC,MAAM,OAAO,IAAIL,UAA2B,CAAC,CAAC;AAErD,QAAM,CAAC,uBAAuB,wBAAwB,IAAIA,UAAiB;AAE3E,QAAM,EAAE,WAAW,SAAS,QAAQ,WAAW,IAAI,qBAAqB;AAExE,QAAM,EAAE,EAAE,IAAIP,gBAAe;AAE7B,QAAM,EAAE,MAAM,cAAc,IAAI;AAAA,IAC9B;AAAA,IACA;AAAA,MACE,mBAAmB;AAAA,MACnB,iBAAiB,KAAK,KAAK;AAAA;AAAA,MAC3B,WAAW,CAAC,SAAS;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,yBAAyB,CAC7Ba,aACA,WACA,YACG,EAAE,gCAAgC,EAAE,YAAAA,aAAY,WAAW,QAAQ,CAAC;AAEzE,QAAM,2BAA2B,CAACA,aAAoB,YACpD,EAAE,kCAAkC,EAAE,YAAAA,aAAY,QAAQ,CAAC;AAE7D,YAAU,MAAM;AACd,UAAM,cAAc,GAAG,UAAU,gBAAgB;AAAA,MAC/C,UAAU,SAAiC;AACzC,YAAI,SAAS;AACX,kBAAQ,CAAC,SAAS;AAChB,mBAAO,QAAQ,MAAM,CAAC,UAAU;AAE9B,kBAAI,CAAC,MAAM,QAAQ,MAAM,IAAI,GAAG;AAC9B,sBAAM,OAAO,CAAC;AAAA,cAChB;AACA,oBAAM,MAAM,MAAM,KAAK;AAAA,gBACrB,CAAC,QAAQ,IAAI,oBAAoB,QAAQ;AAAA,cAC3C;AAEA,kBAAI,QAAQ,IAAI;AACd,sBAAM,KAAK,OAAO,KAAK,CAAC;AAAA,cAC1B;AAEA,oBAAM,KAAK,KAAK;AAAA,gBACd,iBAAiB,QAAQ;AAAA,gBACzB,SAAS,QAAQ;AAAA,gBACjB,KAAK,QAAQ;AAAA,gBACb,MAAM,QAAQ;AAAA,gBACd,MAAM,QAAQ;AAAA,gBACd,cAAc,QAAQ;AAAA,cACxB,CAAC;AAAA,YACH,CAAC;AAAA,UACH,CAAC;AAED,mBAAS,CAAC,UAAU,EAAE,GAAG,MAAM,MAAM,KAAK,EAAE;AAAA,QAC9C;AAAA,MACF;AAAA,MACA,QAAQ,KAAK;AACX,YAAI,eAAe,OAAO;AAAA,QAE1B;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO,MAAM;AACX,oBAAc;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,EAAE,CAAC;AAEP,YAAU,MAAM;AACd,QAAI,CAAC,eAAe,MAAM;AACxB;AAAA,IACF;AACA,UAAM,UAAU,cAAc,qBAAqB;AACnD,UAAM,aAAa,kBAAkB,kBAAkB;AACvD,QAAI,aAAa,SAAS;AACxB,cAAQ,CAAC,UAAU,EAAE,GAAG,MAAM,MAAM,eAAe,KAAK,EAAE;AAC1D,eAAS,EAAE,MAAM,MAAM,gBAAgB,QAAQ,CAAC;AAAA,IAClD,OAAO;AACL,cAAQ,CAAC,SAAS;AAChB,eAAO,QAA0B,MAAM,CAAC,UAAU;AAChD,cAAI,eAAe,MAAM,QAAQ;AAE/B,kBAAM,cAAc,IAAI;AAAA,cACtB,KAAK,MAAM,IAAI,CAAC,QAAQ,IAAI,eAAe;AAAA,YAC7C;AAEA,kBAAM,iBAAiB,KAAK,MAAM;AAAA,cAChC,CAAC,QAAQ,IAAI,oBAAoB;AAAA,YACnC;AAEA,kBAAM,OAAO,CAAC;AACd,0BAAc,KAAK,QAAQ,CAAC,SAAS;AACnC,kBAAI,CAAC,YAAY,IAAI,KAAK,eAAe,GAAG;AAE1C,sBAAM,MAAM,KAAK,IAAI;AAAA,cACvB;AAAA,YACF,CAAC;AACD,gBAAI,gBAAgB;AAElB,oBAAM,KAAK,QAAQ,cAAc;AAAA,YACnC;AAAA,UACF,OAAO;AAEL,kBAAM,MAAM,MAAM,MAAM;AAAA,cACtB,CAAC,QAAQ,IAAI,oBAAoB;AAAA,YACnC;AACA,gBAAI,QAAQ,UAAa,QAAQ,IAAI;AAEnC,oBAAM,MAAM,OAAO,KAAK,CAAC;AAAA,YAC3B;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,YAAU,MAAM;AACd,UAAM,YAAY,YAAY,cAAc,SAAS,IAAI;AACzD,UAAM,UAAU,UAAU,cAAc,OAAO,IAAI;AACnD,QAAI,WAAW,kBAAkB,aAAa;AAC5C,+BAAyB,yBAAyB,YAAY,OAAO,CAAC;AACtE;AAAA,IACF;AACA,6BAAyB,MAAS;AAElC,QAAI,aAAa,SAAS;AAExB;AAAA,QAAQ,CAAC,SACP,QAA0B,MAAM,CAAC,UAAU;AAEzC,cAAI,CAAC,MAAM,QAAQ,MAAM,IAAI,GAAG;AAC9B,kBAAM,OAAO,CAAC;AAAA,UAChB;AAEA,gBAAM,OAAO;AAAA,YACX;AAAA,cACE,iBAAiB;AAAA,cACjB,MAAML,kBAAiB;AAAA;AAAA,cAEvB;AAAA;AAAA,cAEA;AAAA,cACA,SAAS,uBAAuB,YAAY,WAAW,OAAO;AAAA,YAChE;AAAA,YACA,GAAG,MAAM,KAAK;AAAA,cACZ,CAAC,QAAQ,IAAI,SAASA,kBAAiB;AAAA,YACzC;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AACL,cAAQ,CAAC,SAAS;AAChB,eAAO,QAA0B,MAAM,CAAC,UAAU;AAChD,gBAAM,QAAQ,MAAM,MAAM;AAAA,YACxB,CAAC,QAAQ,IAAI,oBAAoB;AAAA,UACnC;AACA,cAAI,UAAU,UAAa,UAAU,IAAI;AACvC,kBAAM,MAAM,OAAO,OAAO,CAAC;AAAA,UAC7B;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,WAAW,SAAS,QAAQ,YAAY,CAAC,CAAC;AAE9C,QAAM,EAAE,oBAAoB,IAAI,cAAc;AAG9C,QAAM,aAAaF,SAAQ,MAAM;AAC/B,UAAM,WAAW,EAAE,GAAG,KAAK;AAC3B,QAAI,uBAAuB,oBAAoB,SAAS,GAAG;AAEzD,eAAS,OAAO,CAAC,GAAG,qBAAqB,GAAI,KAAK,QAAQ,CAAC,CAAE;AAAA,IAC/D;AACA,WAAO,sBAAsB,QAAQ;AAAA,EACvC,GAAG,CAAC,MAAM,mBAAmB,CAAC;AAE9B,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,EACF;AACF;AAIO,IAAM,kBAAkB,CAAC,YAAkC;AAChE,QAAM,EAAE,kBAAkB,oBAAoB,IAAI,cAAc;AAChE,QAAM,EAAE,YAAY,IAAI,kBAAkB;AAE1C,QAAM,EAAE,MAAM,YAAY,sBAAsB,IAAI,oBAAoB;AAExE,QAAM,eAAeA,SAA+B,MAAM;AACxD,QAAI,OAAO,aAAa,qBAAqB,YAAY;AACvD,aAAO,YAAY;AAAA,QACjB,YAAY,QAAS;AAAA,MACvB;AAAA,IACF;AACA,WAAO,YAAY,QAAS;AAAA,EAC9B,GAAG,CAAC,aAAa,kBAAkB,YAAY,IAAI,CAAC;AAEpD,QAAM,CAAC,mBAAmB,QAAQ,IAAI;AAAA,IACpC;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,YAAY,MAAM;AAEtB,aAAS,CAAC,UAAU,EAAE,GAAG,MAAM,MAAM,MAAM,EAAE;AAAA,EAC/C;AAEA,YAAU,MAAM;AACd,UAAM,MAAM,aAAa;AACzB;AAAA,MACE,QAAQ,GAAG,KAAK,kBAAkB,QAAQ,CAAC,SAAS;AAAA,IACtD;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA,kBAAkB;AAAA,IAClB,SAAS;AAAA,IACT;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACF;;;ADjSO,IAAM,8BAA8B,MAAM;AAC/C,QAAM,EAAE,KAAK,IAAI,gBAAgB;AACjC,QAAM,CAAC,SAAS,UAAU,IAAIC,UAAiC,IAAI;AAEnE,SAAO;AAAA,IACL,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AACF;;;AECM,gBAAAJ,YAAA;AATC,IAAMW,wBAKR,CAAC,UAAU;AACd,QAAM,EAAE,YAAY,SAAS,YAAY,YAAY,IAAI;AACzD,SACE,gBAAAX,KAAC,SAAI,WAAU,gDACb,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,MAChB;AAAA,MACA,aAAW;AAAA;AAAA,EACb,GACF;AAEJ;;;AHNI,gBAAAA,YAAA;AAZG,IAAM,2BAER,CAAC,UAAU;AACd,QAAM,EAAE,YAAY,SAAS,WAAW,IAAI,4BAA4B;AACxE,QAAM,cAAc;AAAA,IAClB,CAAC,QAAgB;AACf,UAAI,CAAC;AAAK;AACV,YAAM,cAAc,GAAG;AAAA,IACzB;AAAA,IACA,CAAC,MAAM,aAAa;AAAA,EACtB;AACA,SACE,gBAAAA;AAAA,IAACW;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;;;AIfI,gBAAAX,YAAA;AAJG,IAAM,yBAAgE,CAC3E,UACG;AACH,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAe,CAAC,QAAgB;AAC9B,YAAI,CAAC;AAAK;AACV,cAAM,eAAe,cAAc;AAAA,UACjC,MAAM;AAAA,UACN,MAAM;AAAA,UACN,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA;AAAA,EACF;AAEJ","sourcesContent":["import { FC, useState } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { type API } from \"@kodiak-finance/orderly-types\";\nimport {\n ExtensionPositionEnum,\n ExtensionSlot,\n ScrollArea,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\nimport { AnnouncementItem } from \"./announcementItem\";\n\nexport const AnnouncementContent: FC<{\n dataSource: API.AnnouncementRow[];\n current: string | number | null;\n onExpandToggle: (id: string | number | null) => void;\n onItemClick: (url: string) => void;\n showDivider?: boolean;\n}> = (props) => {\n const { dataSource, current, onExpandToggle, onItemClick } = props;\n const { t } = useTranslation();\n\n if (!Array.isArray(dataSource) || dataSource.length === 0) {\n return (\n <div className=\"oui-flex oui-h-[160px] oui-items-center oui-justify-center\">\n <ExtensionSlot\n position={ExtensionPositionEnum.EmptyDataIdentifier}\n title={t(\"notification.empty\")}\n />\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"oui-flex oui-flex-col oui-space-y-1\",\n props.showDivider &&\n \"[&>*:not(:first-child)]:oui-border-t [&>*:not(:first-child)]:oui-border-line-12 [&>*:not(:first-child)]:oui-pt-1\",\n )}\n >\n {dataSource.map((item) => (\n <AnnouncementItem\n url={item.url}\n onItemClick={onItemClick}\n key={item.announcement_id}\n message={item.message}\n updatedTime={item.updated_time ?? 0}\n expanded={current === item.announcement_id}\n type={item.type}\n showDivider={props.showDivider}\n onExpandToggle={() => {\n if (current === item.announcement_id) {\n onExpandToggle(null);\n } else {\n onExpandToggle(item.announcement_id);\n }\n }}\n />\n ))}\n </div>\n );\n};\n\nexport const AnnouncementCenterUI: FC<{\n dataSource: API.AnnouncementRow[];\n onItemClick: (url: string) => void;\n}> = (props) => {\n const { t } = useTranslation();\n const [expanded, setExpanded] = useState<string | number | null>(null);\n\n return (\n <>\n <div className=\"oui-px-5 oui-pt-4\">\n <Text intensity={80} weight=\"bold\">\n {t(\"notification.title\")}\n </Text>\n </div>\n\n <ScrollArea className=\"oui-flex oui-h-[300px] oui-flex-col oui-space-y-1 oui-p-3\">\n <AnnouncementContent\n dataSource={props.dataSource}\n current={expanded}\n onExpandToggle={setExpanded}\n onItemClick={props.onItemClick}\n />\n </ScrollArea>\n </>\n );\n};\n","import { FC, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { AnnouncementType } from \"@kodiak-finance/orderly-types\";\nimport { Flex, Text, ChevronDownIcon, cn } from \"@kodiak-finance/orderly-ui\";\nimport {\n AnnouncementIcon,\n ArrowRightShortIcon,\n CampaignIcon,\n FundIcon,\n SecurityIcon,\n} from \"./icons\";\n\nexport const AnnouncementItem: FC<{\n // title: string;\n expanded: boolean;\n url?: string | null;\n onItemClick: (url: string) => void;\n onExpandToggle?: () => void;\n type: AnnouncementType | undefined | null;\n message: string;\n updatedTime: number;\n className?: string;\n showDivider?: boolean;\n}> = (props) => {\n const { t } = useTranslation();\n const Icon = useMemo(() => {\n switch (props.type) {\n case AnnouncementType.Campaign:\n return CampaignIcon;\n\n case AnnouncementType.Listing:\n return FundIcon;\n case AnnouncementType.Maintenance:\n return SecurityIcon;\n case AnnouncementType.Delisting:\n default:\n return AnnouncementIcon;\n }\n }, [props.type]);\n\n const title = useMemo(() => {\n switch (props.type) {\n case AnnouncementType.Campaign:\n return t(\"notification.campaign\");\n case AnnouncementType.Delisting:\n return t(\"notification.delisting\");\n case AnnouncementType.Listing:\n return t(\"notification.listing\");\n case AnnouncementType.Maintenance:\n return t(\"notification.maintenance\");\n default:\n return t(\"notification.general\");\n }\n }, [props.type, t]);\n\n const action = useMemo(() => {\n if (\n props.type === AnnouncementType.Campaign &&\n typeof props.url === \"string\" &&\n props.url !== \"\" &&\n typeof props.onItemClick === \"function\"\n ) {\n return (\n <Flex\n gap={1}\n itemAlign=\"center\"\n className=\"oui-cursor-pointer\"\n onClick={(event) => {\n event.stopPropagation();\n props.onItemClick(props.url!);\n }}\n >\n <Text\n size=\"xs\"\n color=\"buy\"\n className=\"oui-bg-clip-text oui-text-transparent oui-gradient-brand\"\n >\n {t(\"notification.joinNow\")}\n </Text>\n <ArrowRightShortIcon size={18} />\n </Flex>\n );\n }\n return null;\n }, [props.type, props.url, t]);\n\n const updateTime = useMemo(() => {\n if (props.type === AnnouncementType.Maintenance) {\n return (\n <Text size=\"2xs\" intensity={36}>\n {t(\"notification.recentlyUpdated\")}\n </Text>\n );\n }\n return (\n <Text.formatted\n size=\"2xs\"\n intensity={36}\n rule=\"date\"\n formatString=\"yyyy-MM-dd HH:mm:ss\"\n >\n {props.updatedTime}\n </Text.formatted>\n );\n }, [props.updatedTime, props.type, t]);\n\n return (\n <Flex\n gap={2}\n itemAlign=\"start\"\n className={cn(\n \"oui-px-2 oui-py-[6px] oui-text-base-contrast-80\",\n !props.showDivider && \"oui-rounded-md hover:oui-bg-base-6\",\n !props.showDivider && props.expanded && \"oui-bg-base-6\",\n props.className,\n )}\n onClick={() => {\n props.onExpandToggle?.();\n }}\n >\n <Icon color=\"white\" className=\"oui-mt-3 oui-shrink-0\" />\n\n <Flex direction=\"column\" itemAlign=\"start\" grow>\n <Text size=\"xs\" intensity={80} weight=\"bold\">\n {title}\n </Text>\n {updateTime}\n {/* Expandable content with animation */}\n <div\n className=\"oui-grid oui-transition-all oui-duration-300 oui-ease-in-out\"\n style={{\n gridTemplateRows: props.expanded ? \"1fr\" : \"0fr\",\n }}\n >\n <div className=\"oui-flex oui-flex-col oui-gap-2 oui-overflow-hidden\">\n <Text size=\"2xs\" intensity={80} as=\"div\" className=\"oui-pt-2\">\n {props.message}\n </Text>\n {action}\n </div>\n </div>\n </Flex>\n <div className=\"oui-pt-3\">\n {/* Chevron icon with rotation animation */}\n <ChevronDownIcon\n color=\"white\"\n size={18}\n className={`oui-transition-transform oui-duration-300 oui-ease-in-out ${\n props.expanded ? \"oui-rotate-180\" : \"oui-rotate-0\"\n }`}\n />\n </div>\n </Flex>\n );\n};\n","import { FC } from \"react\";\nimport type { BaseIconProps } from \"@kodiak-finance/orderly-ui\";\nimport { Icon } from \"@kodiak-finance/orderly-ui\";\n\nexport const BattleIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <defs>\n <linearGradient\n id=\"paint0_linear_555_7374\"\n x1=\"17.0157\"\n y1=\"9.26513\"\n x2=\"0.969849\"\n y2=\"9.26513\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"rgb(var(--oui-gradient-brand-end))\" />\n <stop offset=\"1\" stopColor=\"rgb(var(--oui-gradient-brand-start))\" />\n </linearGradient>\n </defs>\n <path\n fill=\"url(#paint0_linear_555_7374)\"\n fillOpacity={1}\n d=\"m1.5 1.5.75 3 4.843 4.56-1.808 1.919-.63-.633-1.06 1.06.665.665-1.88 1.996-.35-.346-1.06 1.06 2.25 2.25 1.06-1.06-.348-.349 1.998-1.878.665.662 1.06-1.06-.63-.63L9 10.852l1.969 1.854-.639.639 1.06 1.06.672-.67 1.998 1.877-.358.358 1.064 1.06 2.25-2.25-1.06-1.06-.34.34-1.881-1.998.656-.657-1.06-1.06-.625.624-1.799-1.91.003-.003L9 7.03 4.5 2.25zm15 0-3 .75-3.636 3.861 2.022 2.025L15.75 4.5z\"\n />\n </Icon>\n );\n};\n\nexport const CampaignIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <path\n fill=\"currentcolor\"\n fillOpacity={1}\n d=\"m1.5 1.5.75 3 4.843 4.56-1.808 1.919-.63-.633-1.06 1.06.665.665-1.88 1.996-.35-.346-1.06 1.06 2.25 2.25 1.06-1.06-.348-.349 1.998-1.878.665.662 1.06-1.06-.63-.63L9 10.852l1.969 1.854-.639.639 1.06 1.06.672-.67 1.998 1.877-.358.358 1.064 1.06 2.25-2.25-1.06-1.06-.34.34-1.881-1.998.656-.657-1.06-1.06-.625.624-1.799-1.91.003-.003L9 7.03 4.5 2.25zm15 0-3 .75-3.636 3.861 2.022 2.025L15.75 4.5z\"\n />\n </Icon>\n );\n};\n\nexport const ArrowRightShortIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <defs>\n <linearGradient\n id=\"paint0_linear_555_7374\"\n x1=\"17.0157\"\n y1=\"9.26513\"\n x2=\"0.969849\"\n y2=\"9.26513\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"rgb(var(--oui-gradient-brand-end))\" />\n <stop offset=\"1\" stopColor=\"rgb(var(--oui-gradient-brand-start))\" />\n </linearGradient>\n </defs>\n <path\n fill=\"url(#paint0_linear_555_7374)\"\n fillOpacity={1}\n d=\"M4.509 8.995a.75.75 0 0 1 .75-.75h5.666L8.7 5.998l1.054-1.054 3.535 3.512c.147.146.22.343.22.54a.76.76 0 0 1-.22.537l-3.535 3.512L8.7 11.992l2.225-2.248H5.258a.75.75 0 0 1-.749-.75\"\n />\n </Icon>\n );\n};\n\nexport const FundIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <path\n fill=\"currentcolor\"\n fillOpacity={0.8}\n d=\"M15.694 7.087c-.788-.393-1.857-.618-2.925-.618-1.125 0-2.138.225-2.925.618-.056 0-.113.057-.113.057V3.769c0-.9-.731-1.575-1.462-1.913-.788-.394-1.857-.619-2.925-.619-1.069 0-2.25.225-3.038.62C1.575 2.193.844 2.868.844 3.768v10.519c0 .9.731 1.575 1.462 1.912.788.394 1.856.619 2.925.619s2.138-.225 2.925-.619c.281-.169.563-.337.788-.562.225.225.506.393.787.562.788.394 1.857.619 2.925.619 1.125 0 2.138-.225 2.925-.619.732-.394 1.463-1.012 1.463-1.912V9c.112-.9-.619-1.519-1.35-1.913m-7.369 7.144c0 .113-.112.45-.731.732-.563.28-1.407.506-2.363.506s-1.8-.169-2.362-.506c-.619-.282-.731-.62-.731-.732V13.5c.056 0 .112 0 .168.056.788.394 1.856.619 2.925.619s2.138-.225 2.925-.619c.056 0 .113-.056.113-.056v.731zm0-2.587c0 .112-.112.45-.731.731-.563.281-1.407.506-2.363.506s-1.8-.168-2.362-.506c-.619-.281-.731-.619-.731-.731v-.788c.056 0 .112.056.112.056.788.394 1.856.62 2.925.62s2.138-.226 2.925-.62c.056 0 .113-.056.113-.056v.788zm0-2.644c0 .112-.112.45-.731.731-.563.281-1.407.507-2.363.507s-1.8-.17-2.362-.507C2.25 9.45 2.138 9.112 2.138 9v-.788c.056 0 .112.057.112.057.788.393 1.856.618 2.925.618S7.313 8.662 8.1 8.27c.056 0 .113-.057.113-.057V9zm0-2.644c0 .113-.112.45-.731.731-.563.282-1.407.507-2.363.507s-1.8-.169-2.362-.507c-.619-.28-.731-.618-.731-.73v-.732c.056 0 .112 0 .168.056.788.394 1.856.619 2.925.619s2.138-.225 2.925-.619c.056 0 .113-.056.113-.056v.731zM7.594 4.5c-.563.281-1.407.506-2.363.506S3.488 4.781 2.925 4.5c-.619-.338-.731-.619-.731-.731 0-.113.112-.45.731-.732.563-.28 1.406-.506 2.363-.506.956 0 1.8.169 2.362.506.619.282.731.62.731.732-.056.112-.168.393-.787.731m8.212 9.731c0 .113-.112.45-.731.732-.562.28-1.406.506-2.362.506s-1.8-.169-2.363-.506c-.619-.282-.731-.62-.731-.732V13.5c.056 0 .112.056.112.056.788.394 1.857.619 2.925.619 1.125 0 2.138-.225 2.925-.619.056 0 .113-.056.113-.056v.731zm0-2.587c0 .112-.112.45-.731.731-.562.281-1.406.506-2.362.506s-1.8-.168-2.363-.506c-.619-.281-.731-.619-.731-.731v-.788c.056 0 .112.056.112.056.788.394 1.857.62 2.925.62 1.125 0 2.138-.226 2.925-.62.056 0 .113-.056.113-.056v.788zm-.675-1.913c-.562.281-1.406.507-2.362.507s-1.8-.17-2.363-.507c-.619-.281-.731-.619-.731-.731 0-.113.112-.45.731-.731.563-.282 1.406-.507 2.363-.507.956 0 1.8.17 2.362.507.619.281.732.618.732.731-.057.112-.17.45-.732.731\"\n />\n </Icon>\n );\n};\n\nexport const AnnouncementIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <path\n fill=\"currentcolor\"\n fillOpacity={0.8}\n d=\"M11.53 2.255a.745.745 0 0 0-.82.165c-.525.524-1.188.959-1.947 1.284-.77.33-2.353.757-3.508.75-2.248-.015-3.756 1.259-3.756 3.726 0 2.163 1.228 3.42 2.994 3.703l.006 1.565a2.25 2.25 0 0 0 2.25 2.247c1.142 0 2.083-.883 2.228-1.988.007-.053.022-.26.022-1.01.674.315 1.232.812 1.711 1.29.473.472 1.29.13 1.29-.538 0-.678-.004-1.906-.004-3.13.884-.327 1.503-1.165 1.503-2.115s-.585-1.81-1.496-2.129c0-1.225-.004-2.439-.004-3.117a.76.76 0 0 0-.469-.703m1.805 1.335a.73.73 0 0 0-.445.351.75.75 0 0 0 .258 1.03 3.74 3.74 0 0 1 1.851 3.233 3.74 3.74 0 0 1-1.851 3.231.76.76 0 0 0-.282 1.03.754.754 0 0 0 1.032.258 5.24 5.24 0 0 0 2.601-4.52 5.24 5.24 0 0 0-2.601-4.519.74.74 0 0 0-.563-.094m-2.832.884c0 .694-.004 1.417-.004 2.231v2.997c0 .815.003 1.508.003 2.202-1.52-.896-3.085-1.294-4.501-1.421 0-1.144-.004-3.406-.004-4.584.147-.007.318-.026.565-.06a11.2 11.2 0 0 0 2.812-.773c.43-.184.75-.35 1.129-.592m-6.005 1.55-.001 4.34c-.976-.27-1.498-.959-1.498-2.184 0-1.21.47-1.928 1.499-2.155M6 11.998c.238.008 1.098.161 1.493.261l.007 1.19a.75.75 0 0 1-1.5 0z\"\n />\n </Icon>\n );\n};\n\nexport const SecurityIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <path\n d=\"M6.563 7.678V6.603c0-1.153 1.09-2.088 2.437-2.088s2.438.935 2.438 2.088v1.075c.448 0 .812.311.812.696v3.479c0 .384-.364.696-.812.696H6.563c-.449 0-.813-.312-.813-.696v-3.48c0-.384.364-.695.813-.695m1.187-.006 1.431.006h1.07V6.564c0-.64-.504-1.104-1.25-1.104-.748 0-1.25.465-1.25 1.104zm1.956 2.14c0-.335-.317-.605-.706-.605-.39 0-.706.27-.706.604v.77c0 .335.316.605.706.605s.706-.27.706-.604z\"\n fill=\"currentcolor\"\n fillOpacity=\".8\"\n />\n <path\n d=\"M2 3.607c.003 5.606.146 11.651 6.879 13.378.078.02.164.02.242 0C15.854 15.258 15.997 9.213 16 3.607c0-.217-.14-.41-.345-.477L9.31 1.05a1 1 0 0 0-.62 0L2.345 3.13A.5.5 0 0 0 2 3.607m2.326 7.63c-.707-1.954-.81-4.33-.824-6.902L9 2.532l5.498 1.803c-.014 2.573-.117 4.948-.824 6.901-.697 1.93-1.987 3.463-4.674 4.222-2.687-.759-3.977-2.293-4.674-4.222\"\n fill=\"currentcolor\"\n fillOpacity=\".8\"\n />\n </Icon>\n );\n};\n","import { FC, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { AnnouncementType, type API } from \"@kodiak-finance/orderly-types\";\nimport {\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n Divider,\n Flex,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport {\n AnnouncementIcon,\n BattleIcon,\n FundIcon,\n SecurityIcon,\n} from \"../announcementCenter/icons\";\nimport {\n CampaignContentCard,\n DelistingContentCard,\n ListingContentCard,\n MaintenanceContentCard,\n} from \"./contentCard\";\n\nexport interface NotificationProps {\n // Define your notification props here\n className?: string;\n // children?: React.ReactNode;\n dataSource: API.AnnouncementRow[];\n onClose?: () => void;\n}\n\nexport interface NotificationItemProps {\n id: string;\n type?: \"success\" | \"error\" | \"warning\" | \"info\";\n title?: string;\n message: string;\n onClose?: () => void;\n}\n\nexport interface NotificationListProps {\n notifications: NotificationItemProps[];\n onRemove?: (id: string) => void;\n}\n\nconst NotificationHeader: FC<{\n // type: AnnouncementType;\n dataSource: API.AnnouncementRow[];\n current: number;\n expanded?: boolean;\n onExpandToggle?: () => void;\n // onClose?: () => void;\n}> = (props) => {\n const { t } = useTranslation();\n const { expanded } = props;\n const { type } = props.dataSource[props.current];\n\n const title = useMemo(() => {\n switch (type) {\n case AnnouncementType.Campaign:\n return (\n <Text\n size=\"sm\"\n className=\"oui-text-transparent oui-bg-clip-text oui-gradient-brand\"\n >\n {t(\"notification.campaign\")}\n </Text>\n );\n case AnnouncementType.Delisting:\n return <Text size=\"sm\">{t(\"notification.delistingTitle\")}</Text>;\n case AnnouncementType.Listing:\n return (\n <Text size=\"sm\" color=\"buy\">\n {t(\"notification.listing\")}\n </Text>\n );\n case AnnouncementType.Maintenance:\n return (\n <Text size=\"sm\" color=\"warning\">\n {t(\"notification.maintenanceTitle\")}\n </Text>\n );\n default:\n return (\n <Text size=\"sm\" color=\"inherit\">\n {t(\"notification.generalTitle\")}\n </Text>\n );\n }\n }, [type, t]);\n const icon = useMemo(() => {\n switch (type) {\n case AnnouncementType.Campaign:\n return <BattleIcon color=\"white\" />;\n\n case AnnouncementType.Listing:\n return <FundIcon color=\"success\" />;\n case AnnouncementType.Maintenance:\n return <SecurityIcon color=\"warning\" />;\n case AnnouncementType.Delisting:\n default:\n return <AnnouncementIcon color=\"white\" />;\n }\n }, [type]);\n return (\n <Flex itemAlign=\"center\" justify=\"between\" className=\"oui-px-4 oui-py-3\">\n <div className=\"orderly-notification-header oui-flex oui-items-center oui-gap-2\">\n {icon}\n {title}\n </div>\n <button\n onClick={props.onExpandToggle}\n className=\"oui-transition-transform oui-duration-300\"\n style={{\n transform: !expanded ? \"rotate(180deg)\" : \"rotate(0deg)\",\n }}\n >\n <ChevronDownIcon size={18} color=\"white\" />\n </button>\n </Flex>\n );\n};\n\nconst NotificationFooter: FC<{\n total: number;\n current: number;\n onCloseAll: () => void;\n onPrev: () => void;\n onNext: () => void;\n}> = (props) => {\n const { total, current, onCloseAll, onPrev, onNext } = props;\n const { t } = useTranslation();\n return (\n <Flex\n className=\"orderly-notification-footer oui-px-4 oui-py-2\"\n itemAlign=\"center\"\n justify=\"between\"\n >\n <Flex gap={2}>\n <button\n disabled={current - 1 < 0}\n onClick={onPrev}\n className=\"oui-flex oui-size-[18px] oui-items-center oui-justify-center oui-rounded-full oui-bg-base-6 hover:oui-bg-base-5 disabled:oui-opacity-50\"\n >\n <ChevronLeftIcon size={14} color=\"white\" />\n </button>\n <Text intensity={54} size=\"sm\">\n {current + 1}/{total}\n </Text>\n <button\n disabled={current + 1 >= total}\n onClick={onNext}\n className=\"oui-flex oui-size-[18px] oui-items-center oui-justify-center oui-rounded-full oui-bg-base-6 hover:oui-bg-base-5 disabled:oui-opacity-50\"\n >\n <ChevronRightIcon size={14} color=\"white\" />\n </button>\n </Flex>\n <button onClick={onCloseAll}>\n <Text size=\"xs\" color=\"primary\">\n {t(\"notification.closeAll\", { total })}\n </Text>\n </button>\n </Flex>\n );\n};\n\nconst NotificationContent: FC<{\n dataSource: (API.AnnouncementRow & {\n startTime?: number;\n endTime?: number;\n })[];\n current: number;\n onItemClick: (url: string) => void;\n}> = (props) => {\n const elements = useMemo(() => {\n return props.dataSource.map((message) => {\n const { type } = message;\n switch (type) {\n case AnnouncementType.Campaign:\n return (\n <CampaignContentCard\n message={message.message}\n coverImage={message.coverImage ?? \"\"}\n updateTime={message.updated_time ?? 0}\n url={message.url ?? \"\"}\n onItemClick={props.onItemClick}\n />\n );\n case AnnouncementType.Maintenance:\n return (\n <MaintenanceContentCard\n message={message.message}\n startTime={message.startTime ?? 0}\n endTime={message.endTime ?? 0}\n />\n );\n case AnnouncementType.Delisting:\n return (\n <DelistingContentCard\n message={message.message}\n updateTime={message.updated_time ?? 0}\n />\n );\n default:\n return (\n <ListingContentCard\n message={message.message}\n updateTime={message.updated_time ?? 0}\n />\n );\n }\n });\n }, [props.dataSource]);\n return <>{elements[props.current]}</>;\n};\n\nexport const NotificationUI: FC<\n NotificationProps & {\n maintenanceMessage?: string;\n onItemClick: (url: string) => void;\n }\n> = (props) => {\n const [expanded, setExpanded] = useState(true);\n\n const [current, setCurrent] = useState(0);\n const len = useMemo(() => props.dataSource?.length ?? 0, [props.dataSource]);\n\n if (len === 0) {\n return null;\n }\n\n return (\n <div className=\"orderly-notification oui-w-full \">\n <NotificationHeader\n dataSource={props.dataSource ?? []}\n current={current}\n expanded={expanded}\n onExpandToggle={() => {\n setExpanded(!expanded);\n }}\n />\n <Divider className=\"oui-mx-4\" />\n <div\n className=\"oui-grid oui-transition-all oui-duration-300 oui-ease-in-out\"\n style={{\n gridTemplateRows: expanded ? \"1fr\" : \"0fr\",\n }}\n >\n {/* Inner div needs overflow-hidden and min-height-0 for grid animation to work */}\n <div className=\"oui-min-h-0 oui-overflow-hidden \">\n <div className=\"oui-px-4 oui-py-3\">\n <NotificationContent\n dataSource={props.dataSource ?? []}\n current={current}\n onItemClick={props.onItemClick}\n />\n </div>\n </div>\n </div>\n\n <NotificationFooter\n total={len}\n current={current}\n onCloseAll={props.onClose ?? (() => {})}\n onPrev={() => {\n if (current - 1 < 0) {\n return;\n }\n setCurrent(current - 1);\n }}\n onNext={() => {\n if (current + 1 >= len) {\n return;\n }\n setCurrent(current + 1);\n }}\n />\n </div>\n );\n};\n","import { FC, useMemo } from \"react\";\nimport { UTCDate } from \"@date-fns/utc\";\nimport { format, differenceInHours, differenceInMinutes } from \"date-fns\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { Flex, Text } from \"@kodiak-finance/orderly-ui\";\nimport { ArrowRightShortIcon } from \"../announcementCenter/icons\";\n\nexport const CampaignContentCard: FC<{\n message: string;\n coverImage: string;\n updateTime: number;\n url?: string | null;\n onItemClick: (url: string) => void;\n}> = ({ message, coverImage, url, onItemClick }) => {\n const { t } = useTranslation();\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-5\">\n <Text size=\"sm\" weight=\"bold\">\n {message}\n </Text>\n <div\n className=\"oui-rounded-xl oui-bg-base-9 oui-bg-cover oui-bg-center oui-bg-no-repeat\"\n style={{\n backgroundImage: `url(${coverImage})`,\n height: \"100px\",\n }}\n ></div>\n {typeof url === \"string\" &&\n url !== \"\" &&\n typeof onItemClick === \"function\" && (\n <button\n className=\"oui-flex oui-items-center oui-gap-1\"\n onClick={() => onItemClick(url)}\n >\n <Text\n size=\"xs\"\n color=\"buy\"\n className=\"oui-bg-clip-text oui-text-transparent oui-gradient-brand\"\n >\n {t(\"notification.joinNow\")}\n </Text>\n <ArrowRightShortIcon size={18} color=\"success\" />\n </button>\n )}\n </div>\n );\n};\n\nexport const MaintenanceContentCard: FC<{\n message: string;\n startTime: number;\n endTime: number;\n}> = ({ message, startTime, endTime }) => {\n const { t } = useTranslation();\n const formattedMessage = useMemo(() => {\n // Calculate duration in hours\n const hours = differenceInHours(endTime, startTime);\n\n const minutes = differenceInMinutes(endTime, startTime) - hours * 60;\n\n // Convert timestamps to UTC dates\n const startUtc = new UTCDate(startTime);\n const endUtc = new UTCDate(endTime);\n\n // Format start time as HH:mm (24-hour format) in UTC\n const startTimeFormatted = format(startUtc, \"HH:mm\");\n\n // Format end time as hh:mm a (12-hour format with AM/PM) in UTC\n const endTimeFormatted = format(endUtc, \"hh:mm a\");\n\n if (hours > 0) {\n return t(\"notification.maintenanceDuration.hours\", {\n hours: minutes > 0 ? (hours + minutes / 60).toFixed(1) : hours,\n startTimeFormatted,\n endTimeFormatted,\n });\n }\n\n return t(\"notification.maintenanceDuration.minutes\", {\n minutes,\n startTimeFormatted,\n endTimeFormatted,\n });\n }, [startTime, endTime, t]);\n\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-1\">\n <Text size=\"xs\" intensity={54}>\n {t(\"notification.recentlyUpdated\")}\n </Text>\n <Flex itemAlign={\"center\"}>\n <Text size=\"xs\" weight=\"bold\">\n {formattedMessage}\n </Text>\n </Flex>\n {message && (\n <Text size=\"2xs\" intensity={80} as=\"div\" className=\"oui-mt-2\">\n {message}\n </Text>\n )}\n </div>\n );\n};\n\nexport const DelistingContentCard: FC<{\n message: string;\n updateTime: number;\n}> = ({ message, updateTime }) => {\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-1\">\n <Text.formatted\n rule=\"date\"\n intensity={54}\n formatString=\"yyyy-MM-dd HH:mm:ss\"\n size=\"xs\"\n >\n {updateTime}\n </Text.formatted>\n <Text size=\"sm\" weight=\"bold\">\n {message}\n </Text>\n </div>\n );\n};\n\nexport const ListingContentCard: FC<{\n message: string;\n updateTime: number;\n}> = ({ message, updateTime }) => {\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-1\">\n <Text.formatted\n rule=\"date\"\n intensity={54}\n formatString=\"yyyy-MM-dd HH:mm:ss\"\n size=\"xs\"\n >\n {updateTime}\n </Text.formatted>\n <Text size=\"sm\" weight=\"bold\">\n {message}\n </Text>\n </div>\n );\n};\n","import { FC, useCallback } from \"react\";\nimport { useAnnouncementCenterScript } from \"./announcementCenter.script\";\nimport { AnnouncementCenterUI } from \"./announcementCenter.ui\";\n\nexport const AnnouncementCenterWidget: FC<{\n onRouteChange: (url: string) => void;\n}> = (props) => {\n const { dataSource, current, setCurrent } = useAnnouncementCenterScript();\n const onItemClick = useCallback(\n (url: string) => {\n if (!url) return;\n props.onRouteChange(url);\n },\n [props.onRouteChange],\n );\n return (\n <AnnouncementCenterUI\n dataSource={dataSource}\n current={current}\n setCurrent={setCurrent}\n onItemClick={onItemClick}\n />\n );\n};\n","import { useState } from \"react\";\nimport { useAnnouncement } from \"../hooks/useAnnouncement\";\n\nexport const useAnnouncementCenterScript = () => {\n const { tips } = useAnnouncement();\n const [current, setCurrent] = useState<string | number | null>(null);\n\n return {\n dataSource: tips,\n current,\n setCurrent,\n };\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport { UTCDateMini } from \"@date-fns/utc\";\nimport { format } from \"date-fns\";\nimport { produce } from \"immer\";\nimport {\n MaintenanceStatus,\n useLocalStorage,\n useMaintenanceStatus,\n useOrderlyContext,\n useQuery,\n useWS,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport {\n AnnouncementType,\n API,\n EMPTY_LIST,\n WSMessage,\n} from \"@kodiak-finance/orderly-types\";\nimport { getTimestamp } from \"@kodiak-finance/orderly-utils\";\n\nconst oneDay = 1000 * 60 * 60 * 24;\n\nconst maintentanceId = \"-1\";\n\nexport type AnnouncementOptions = {\n hideTips?: boolean;\n};\n\ninterface AnnouncementStore {\n show?: boolean;\n lastUpdateTime?: number | null;\n}\n\nconst ORDERLY_ANNOUNCEMENT_KEY = \"orderly_announcement\";\n\nconst getTimeString = (timestamp: number) => {\n const date = format(new UTCDateMini(timestamp), \"MMM dd\");\n const time = format(new UTCDateMini(timestamp), \"h:mm aa\");\n return `${time} (UTC) on ${date}`;\n};\n\nconst sortDataByUpdatedTime = (ori: API.Announcement) => {\n return produce<API.Announcement>(ori, (draft) => {\n if (Array.isArray(draft.rows)) {\n draft.rows.sort((a, b) => {\n if (a.updated_time && b.updated_time) {\n return b.updated_time - a.updated_time;\n }\n return 0;\n });\n }\n });\n};\n\nconst useAnnouncementData = () => {\n const ws = useWS();\n\n const [announcementStore, setStore] = useLocalStorage<AnnouncementStore>(\n ORDERLY_ANNOUNCEMENT_KEY,\n {},\n );\n\n const [tips, setTips] = useState<API.Announcement>({});\n\n const [maintenanceDialogInfo, setMaintenanceDialogInfo] = useState<string>();\n\n const { startTime, endTime, status, brokerName } = useMaintenanceStatus();\n\n const { t } = useTranslation();\n\n const { data: announcements } = useQuery<API.Announcement>(\n `/v2/public/announcement`,\n {\n revalidateOnFocus: false,\n refreshInterval: 60 * 60 * 1000, // refresh every 1 hour\n formatter: (data) => data,\n },\n );\n\n const getMaintentTipsContent = (\n brokerName: string,\n startDate: string,\n endDate: string,\n ) => t(\"maintenance.tips.description\", { brokerName, startDate, endDate });\n\n const getMaintentDialogContent = (brokerName: string, endDate: string) =>\n t(\"maintenance.dialog.description\", { brokerName, endDate });\n\n useEffect(() => {\n const unsubscribe = ws.subscribe(\"announcement\", {\n onMessage(message: WSMessage.Announcement) {\n if (message) {\n setTips((prev) => {\n return produce(prev, (draft) => {\n // Make sure draft.rows is an array\n if (!Array.isArray(draft.rows)) {\n draft.rows = [];\n }\n const idx = draft.rows.findIndex(\n (tip) => tip.announcement_id === message.announcement_id,\n );\n // Filter out old tips with the same id\n if (idx !== -1) {\n draft.rows.splice(idx, 1);\n }\n // Add the latest tip\n draft.rows.push({\n announcement_id: message.announcement_id,\n message: message.message,\n url: message.url,\n i18n: message.i18n,\n type: message.type,\n updated_time: message.updated_time,\n });\n });\n });\n // @ts-ignore\n setStore((prev) => ({ ...prev, show: true }));\n }\n },\n onError(err) {\n if (err instanceof Error) {\n console.error(\"Error receiving announcement:\", err.message);\n }\n },\n });\n return () => {\n unsubscribe?.();\n };\n }, [ws]);\n\n useEffect(() => {\n if (!announcements?.rows) {\n return;\n }\n const apiTime = announcements.last_updated_time ?? 0;\n const cachedTime = announcementStore.lastUpdateTime ?? 0;\n if (cachedTime < apiTime) {\n setTips((prev) => ({ ...prev, rows: announcements?.rows }));\n setStore({ show: true, lastUpdateTime: apiTime });\n } else {\n setTips((prev) => {\n return produce<API.Announcement>(prev, (draft) => {\n if (announcements?.rows?.length) {\n // If there are announcement rows available, create a Set to store IDs of existing tips\n const existingIds = new Set<string | number>(\n prev.rows?.map((tip) => tip.announcement_id),\n );\n // Find the maintenance tip in previous tips (if any)\n const maintenanceTip = prev.rows?.find(\n (tip) => tip.announcement_id === maintentanceId,\n );\n // Clear the draft’s rows array to refill it\n draft.rows = [];\n announcements.rows.forEach((item) => {\n if (!existingIds.has(item.announcement_id)) {\n // If the item’s ID is not in existingIds, push it into the draft\n draft.rows?.push(item);\n }\n });\n if (maintenanceTip) {\n // If a maintenance tip existed before, unshift it to the front\n draft.rows.unshift(maintenanceTip);\n }\n } else {\n // Find the index of the maintenance tip in draft rows\n const idx = draft.rows?.findIndex(\n (tip) => tip.announcement_id === maintentanceId,\n );\n if (idx !== undefined && idx !== -1) {\n // Remove the maintenance tip from draft rows\n draft.rows?.splice(idx, 1);\n }\n }\n });\n });\n }\n }, [announcements]);\n\n useEffect(() => {\n const startDate = startTime ? getTimeString(startTime) : \"-\";\n const endDate = endTime ? getTimeString(endTime) : \"-\";\n if (status === MaintenanceStatus.Maintenance) {\n setMaintenanceDialogInfo(getMaintentDialogContent(brokerName, endDate));\n return;\n }\n setMaintenanceDialogInfo(undefined);\n\n if (startTime && endTime) {\n // if (startTime < getTimestamp() + oneDay) {\n setTips((prev) =>\n produce<API.Announcement>(prev, (draft) => {\n // Make sure draft.rows is an array\n if (!Array.isArray(draft.rows)) {\n draft.rows = [];\n }\n // Rebuild rows: insert the latest maintenance tip first, then put the old non-maintenance ones at the end\n draft.rows = [\n {\n announcement_id: maintentanceId,\n type: AnnouncementType.Maintenance,\n /** @ts-ignore */\n startTime: startTime,\n /** @ts-ignore */\n endTime: endTime,\n message: getMaintentTipsContent(brokerName, startDate, endDate),\n },\n ...draft.rows.filter(\n (tip) => tip.type !== AnnouncementType.Maintenance,\n ),\n ];\n }),\n );\n } else {\n setTips((prev) => {\n return produce<API.Announcement>(prev, (draft) => {\n const index = draft.rows?.findIndex(\n (tip) => tip.announcement_id === maintentanceId,\n );\n if (index !== undefined && index !== -1) {\n draft.rows?.splice(index, 1);\n }\n });\n });\n }\n }, [startTime, endTime, status, brokerName, t]);\n\n const { customAnnouncements } = useAppContext();\n\n // Merge custom announcements with API announcements\n const mergedTips = useMemo(() => {\n const tipsCopy = { ...tips };\n if (customAnnouncements && customAnnouncements.length > 0) {\n // Custom announcements appear first (higher priority)\n tipsCopy.rows = [...customAnnouncements, ...(tips.rows || [])];\n }\n return sortDataByUpdatedTime(tipsCopy);\n }, [tips, customAnnouncements]);\n\n return {\n tips: mergedTips,\n maintenanceDialogInfo: maintenanceDialogInfo,\n };\n};\n\nexport type AnnouncementReturn = ReturnType<typeof useAnnouncement>;\n\nexport const useAnnouncement = (options?: AnnouncementOptions) => {\n const { showAnnouncement, setShowAnnouncement } = useAppContext();\n const { dataAdapter } = useOrderlyContext();\n\n const { tips: mergedTips, maintenanceDialogInfo } = useAnnouncementData();\n\n const memoizedTips = useMemo<API.AnnouncementRow[]>(() => {\n if (typeof dataAdapter?.announcementList === \"function\") {\n return dataAdapter.announcementList(\n mergedTips?.rows ?? (EMPTY_LIST as API.AnnouncementRow[]),\n );\n }\n return mergedTips?.rows ?? (EMPTY_LIST as API.AnnouncementRow[]);\n }, [dataAdapter?.announcementList, mergedTips?.rows]);\n\n const [announcementStore, setStore] = useLocalStorage<AnnouncementStore>(\n ORDERLY_ANNOUNCEMENT_KEY,\n {},\n );\n\n const closeTips = () => {\n // @ts-ignore\n setStore((prev) => ({ ...prev, show: false }));\n };\n\n useEffect(() => {\n const len = memoizedTips.length;\n setShowAnnouncement(\n Boolean(len) && announcementStore.show && !options?.hideTips,\n );\n }, [\n memoizedTips,\n announcementStore.show,\n options?.hideTips,\n setShowAnnouncement,\n ]);\n\n return {\n maintenanceDialogInfo,\n tips: memoizedTips,\n closeTips: closeTips,\n showAnnouncement: showAnnouncement,\n };\n};\n","import { FC } from \"react\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { AnnouncementContent } from \"../components/announcementCenter/announcementCenter.ui\";\n\nexport const AnnouncementCenterUI: FC<{\n dataSource: API.AnnouncementRow[];\n current: string | number | null;\n setCurrent: (current: string | number | null) => void;\n onItemClick: (url: string) => void;\n}> = (props) => {\n const { dataSource, current, setCurrent, onItemClick } = props;\n return (\n <div className=\"oui-m-1 oui-rounded-xl oui-bg-base-9 oui-p-2\">\n <AnnouncementContent\n dataSource={dataSource}\n current={current}\n onExpandToggle={setCurrent}\n onItemClick={onItemClick}\n showDivider\n />\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { RouterAdapter } from \"@kodiak-finance/orderly-types\";\nimport { AnnouncementCenterWidget } from \"./announcementCenter.widget\";\n\nexport const AnnouncementCenterPage: FC<{ routerAdapter?: RouterAdapter }> = (\n props,\n) => {\n return (\n <AnnouncementCenterWidget\n onRouteChange={(url: string) => {\n if (!url) return;\n props.routerAdapter?.onRouteChange({\n href: url,\n name: url,\n target: \"_blank\",\n });\n }}\n />\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/announcementCenter/announcementCenter.ui.tsx","../src/components/announcementCenter/announcementItem.tsx","../src/components/announcementCenter/icons.tsx","../src/components/notification/notification.ui.tsx","../src/components/notification/contentCard.tsx","../src/pages/announcementCenter.widget.tsx","../src/pages/announcementCenter.script.tsx","../src/hooks/useAnnouncement.ts","../src/pages/announcementCenter.ui.tsx","../src/pages/announcementCenter.page.tsx"],"names":["useTranslation","Text","cn","jsx","jsxs","Icon","useMemo","useState","AnnouncementType","ChevronDownIcon","Flex","Fragment","format","brokerName","AnnouncementCenterUI"],"mappings":"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","sourcesContent":["import { FC, useState } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { type API } from \"@kodiak-finance/orderly-types\";\nimport {\n ExtensionPositionEnum,\n ExtensionSlot,\n ScrollArea,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\nimport { AnnouncementItem } from \"./announcementItem\";\n\nexport const AnnouncementContent: FC<{\n dataSource: API.AnnouncementRow[];\n current: string | number | null;\n onExpandToggle: (id: string | number | null) => void;\n onItemClick: (url: string) => void;\n showDivider?: boolean;\n}> = (props) => {\n const { dataSource, current, onExpandToggle, onItemClick } = props;\n const { t } = useTranslation();\n\n if (!Array.isArray(dataSource) || dataSource.length === 0) {\n return (\n <div className=\"oui-flex oui-h-[160px] oui-items-center oui-justify-center\">\n <ExtensionSlot\n position={ExtensionPositionEnum.EmptyDataIdentifier}\n title={t(\"notification.empty\")}\n />\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"oui-flex oui-flex-col oui-space-y-1\",\n props.showDivider &&\n \"[&>*:not(:first-child)]:oui-border-t [&>*:not(:first-child)]:oui-border-line-12 [&>*:not(:first-child)]:oui-pt-1\",\n )}\n >\n {dataSource.map((item) => (\n <AnnouncementItem\n url={item.url}\n onItemClick={onItemClick}\n key={item.announcement_id}\n message={item.message}\n updatedTime={item.updated_time ?? 0}\n expanded={current === item.announcement_id}\n type={item.type}\n showDivider={props.showDivider}\n onExpandToggle={() => {\n if (current === item.announcement_id) {\n onExpandToggle(null);\n } else {\n onExpandToggle(item.announcement_id);\n }\n }}\n />\n ))}\n </div>\n );\n};\n\nexport const AnnouncementCenterUI: FC<{\n dataSource: API.AnnouncementRow[];\n onItemClick: (url: string) => void;\n}> = (props) => {\n const { t } = useTranslation();\n const [expanded, setExpanded] = useState<string | number | null>(null);\n\n return (\n <>\n <div className=\"oui-px-5 oui-pt-4\">\n <Text intensity={80} weight=\"bold\">\n {t(\"notification.title\")}\n </Text>\n </div>\n\n <ScrollArea className=\"oui-flex oui-h-[300px] oui-flex-col oui-space-y-1 oui-p-3\">\n <AnnouncementContent\n dataSource={props.dataSource}\n current={expanded}\n onExpandToggle={setExpanded}\n onItemClick={props.onItemClick}\n />\n </ScrollArea>\n </>\n );\n};\n","import { FC, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { AnnouncementType } from \"@kodiak-finance/orderly-types\";\nimport { Flex, Text, ChevronDownIcon, cn } from \"@kodiak-finance/orderly-ui\";\nimport {\n AnnouncementIcon,\n ArrowRightShortIcon,\n CampaignIcon,\n FundIcon,\n SecurityIcon,\n} from \"./icons\";\n\nexport const AnnouncementItem: FC<{\n // title: string;\n expanded: boolean;\n url?: string | null;\n onItemClick: (url: string) => void;\n onExpandToggle?: () => void;\n type: AnnouncementType | undefined | null;\n message: string;\n updatedTime: number;\n className?: string;\n showDivider?: boolean;\n}> = (props) => {\n const { t } = useTranslation();\n const Icon = useMemo(() => {\n switch (props.type) {\n case AnnouncementType.Campaign:\n return CampaignIcon;\n\n case AnnouncementType.Listing:\n return FundIcon;\n case AnnouncementType.Maintenance:\n return SecurityIcon;\n case AnnouncementType.Delisting:\n default:\n return AnnouncementIcon;\n }\n }, [props.type]);\n\n const title = useMemo(() => {\n switch (props.type) {\n case AnnouncementType.Campaign:\n return t(\"notification.campaign\");\n case AnnouncementType.Delisting:\n return t(\"notification.delisting\");\n case AnnouncementType.Listing:\n return t(\"notification.listing\");\n case AnnouncementType.Maintenance:\n return t(\"notification.maintenance\");\n default:\n return t(\"notification.general\");\n }\n }, [props.type, t]);\n\n const isExternalLink = (url: string): boolean => {\n try {\n const urlObj = new URL(url, window.location.origin);\n return urlObj.origin !== window.location.origin;\n } catch {\n // If URL parsing fails, treat as internal link (relative path)\n return false;\n }\n };\n\n const action = useMemo(() => {\n if (\n props.type === AnnouncementType.Campaign &&\n typeof props.url === \"string\" &&\n props.url !== \"\" &&\n typeof props.onItemClick === \"function\"\n ) {\n return (\n <Flex\n gap={1}\n itemAlign=\"center\"\n className=\"oui-cursor-pointer\"\n onClick={(event) => {\n event.stopPropagation();\n\n const url = props.url!;\n const isExternal = isExternalLink(url);\n\n if (isExternal) {\n // Open external links in a new tab\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n } else {\n // Open internal links in the same tab via the handler\n props.onItemClick(url);\n }\n }}\n >\n <Text\n size=\"xs\"\n color=\"buy\"\n className=\"oui-bg-clip-text oui-text-transparent oui-gradient-brand\"\n >\n {t(\"notification.joinNow\")}\n </Text>\n <ArrowRightShortIcon size={18} />\n </Flex>\n );\n }\n return null;\n }, [props.type, props.url, t]);\n\n const updateTime = useMemo(() => {\n if (props.type === AnnouncementType.Maintenance) {\n return (\n <Text size=\"2xs\" intensity={36}>\n {t(\"notification.recentlyUpdated\")}\n </Text>\n );\n }\n return (\n <Text.formatted\n size=\"2xs\"\n intensity={36}\n rule=\"date\"\n formatString=\"yyyy-MM-dd HH:mm:ss\"\n >\n {props.updatedTime}\n </Text.formatted>\n );\n }, [props.updatedTime, props.type, t]);\n\n return (\n <Flex\n gap={2}\n itemAlign=\"start\"\n className={cn(\n \"oui-px-2 oui-py-[6px] oui-text-base-contrast-80\",\n !props.showDivider && \"oui-rounded-md hover:oui-bg-base-6\",\n !props.showDivider && props.expanded && \"oui-bg-base-6\",\n props.className,\n )}\n onClick={() => {\n props.onExpandToggle?.();\n }}\n >\n <Icon color=\"white\" className=\"oui-mt-3 oui-shrink-0\" />\n\n <Flex direction=\"column\" itemAlign=\"start\" grow>\n <Text size=\"xs\" intensity={80} weight=\"bold\">\n {title}\n </Text>\n {updateTime}\n {/* Expandable content with animation */}\n <div\n className=\"oui-grid oui-transition-all oui-duration-300 oui-ease-in-out\"\n style={{\n gridTemplateRows: props.expanded ? \"1fr\" : \"0fr\",\n }}\n >\n <div className=\"oui-flex oui-flex-col oui-gap-2 oui-overflow-hidden\">\n <Text size=\"2xs\" intensity={80} as=\"div\" className=\"oui-pt-2\">\n {props.message}\n </Text>\n {action}\n </div>\n </div>\n </Flex>\n <div className=\"oui-pt-3\">\n {/* Chevron icon with rotation animation */}\n <ChevronDownIcon\n color=\"white\"\n size={18}\n className={`oui-transition-transform oui-duration-300 oui-ease-in-out ${\n props.expanded ? \"oui-rotate-180\" : \"oui-rotate-0\"\n }`}\n />\n </div>\n </Flex>\n );\n};\n","import { FC } from \"react\";\nimport type { BaseIconProps } from \"@kodiak-finance/orderly-ui\";\nimport { Icon } from \"@kodiak-finance/orderly-ui\";\n\nexport const BattleIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <defs>\n <linearGradient\n id=\"paint0_linear_555_7374\"\n x1=\"17.0157\"\n y1=\"9.26513\"\n x2=\"0.969849\"\n y2=\"9.26513\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"rgb(var(--oui-gradient-brand-end))\" />\n <stop offset=\"1\" stopColor=\"rgb(var(--oui-gradient-brand-start))\" />\n </linearGradient>\n </defs>\n <path\n fill=\"url(#paint0_linear_555_7374)\"\n fillOpacity={1}\n d=\"m1.5 1.5.75 3 4.843 4.56-1.808 1.919-.63-.633-1.06 1.06.665.665-1.88 1.996-.35-.346-1.06 1.06 2.25 2.25 1.06-1.06-.348-.349 1.998-1.878.665.662 1.06-1.06-.63-.63L9 10.852l1.969 1.854-.639.639 1.06 1.06.672-.67 1.998 1.877-.358.358 1.064 1.06 2.25-2.25-1.06-1.06-.34.34-1.881-1.998.656-.657-1.06-1.06-.625.624-1.799-1.91.003-.003L9 7.03 4.5 2.25zm15 0-3 .75-3.636 3.861 2.022 2.025L15.75 4.5z\"\n />\n </Icon>\n );\n};\n\nexport const CampaignIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <path\n fill=\"currentcolor\"\n fillOpacity={1}\n d=\"m1.5 1.5.75 3 4.843 4.56-1.808 1.919-.63-.633-1.06 1.06.665.665-1.88 1.996-.35-.346-1.06 1.06 2.25 2.25 1.06-1.06-.348-.349 1.998-1.878.665.662 1.06-1.06-.63-.63L9 10.852l1.969 1.854-.639.639 1.06 1.06.672-.67 1.998 1.877-.358.358 1.064 1.06 2.25-2.25-1.06-1.06-.34.34-1.881-1.998.656-.657-1.06-1.06-.625.624-1.799-1.91.003-.003L9 7.03 4.5 2.25zm15 0-3 .75-3.636 3.861 2.022 2.025L15.75 4.5z\"\n />\n </Icon>\n );\n};\n\nexport const ArrowRightShortIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <defs>\n <linearGradient\n id=\"paint0_linear_555_7374\"\n x1=\"17.0157\"\n y1=\"9.26513\"\n x2=\"0.969849\"\n y2=\"9.26513\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"rgb(var(--oui-gradient-brand-end))\" />\n <stop offset=\"1\" stopColor=\"rgb(var(--oui-gradient-brand-start))\" />\n </linearGradient>\n </defs>\n <path\n fill=\"url(#paint0_linear_555_7374)\"\n fillOpacity={1}\n d=\"M4.509 8.995a.75.75 0 0 1 .75-.75h5.666L8.7 5.998l1.054-1.054 3.535 3.512c.147.146.22.343.22.54a.76.76 0 0 1-.22.537l-3.535 3.512L8.7 11.992l2.225-2.248H5.258a.75.75 0 0 1-.749-.75\"\n />\n </Icon>\n );\n};\n\nexport const FundIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <path\n fill=\"currentcolor\"\n fillOpacity={0.8}\n d=\"M15.694 7.087c-.788-.393-1.857-.618-2.925-.618-1.125 0-2.138.225-2.925.618-.056 0-.113.057-.113.057V3.769c0-.9-.731-1.575-1.462-1.913-.788-.394-1.857-.619-2.925-.619-1.069 0-2.25.225-3.038.62C1.575 2.193.844 2.868.844 3.768v10.519c0 .9.731 1.575 1.462 1.912.788.394 1.856.619 2.925.619s2.138-.225 2.925-.619c.281-.169.563-.337.788-.562.225.225.506.393.787.562.788.394 1.857.619 2.925.619 1.125 0 2.138-.225 2.925-.619.732-.394 1.463-1.012 1.463-1.912V9c.112-.9-.619-1.519-1.35-1.913m-7.369 7.144c0 .113-.112.45-.731.732-.563.28-1.407.506-2.363.506s-1.8-.169-2.362-.506c-.619-.282-.731-.62-.731-.732V13.5c.056 0 .112 0 .168.056.788.394 1.856.619 2.925.619s2.138-.225 2.925-.619c.056 0 .113-.056.113-.056v.731zm0-2.587c0 .112-.112.45-.731.731-.563.281-1.407.506-2.363.506s-1.8-.168-2.362-.506c-.619-.281-.731-.619-.731-.731v-.788c.056 0 .112.056.112.056.788.394 1.856.62 2.925.62s2.138-.226 2.925-.62c.056 0 .113-.056.113-.056v.788zm0-2.644c0 .112-.112.45-.731.731-.563.281-1.407.507-2.363.507s-1.8-.17-2.362-.507C2.25 9.45 2.138 9.112 2.138 9v-.788c.056 0 .112.057.112.057.788.393 1.856.618 2.925.618S7.313 8.662 8.1 8.27c.056 0 .113-.057.113-.057V9zm0-2.644c0 .113-.112.45-.731.731-.563.282-1.407.507-2.363.507s-1.8-.169-2.362-.507c-.619-.28-.731-.618-.731-.73v-.732c.056 0 .112 0 .168.056.788.394 1.856.619 2.925.619s2.138-.225 2.925-.619c.056 0 .113-.056.113-.056v.731zM7.594 4.5c-.563.281-1.407.506-2.363.506S3.488 4.781 2.925 4.5c-.619-.338-.731-.619-.731-.731 0-.113.112-.45.731-.732.563-.28 1.406-.506 2.363-.506.956 0 1.8.169 2.362.506.619.282.731.62.731.732-.056.112-.168.393-.787.731m8.212 9.731c0 .113-.112.45-.731.732-.562.28-1.406.506-2.362.506s-1.8-.169-2.363-.506c-.619-.282-.731-.62-.731-.732V13.5c.056 0 .112.056.112.056.788.394 1.857.619 2.925.619 1.125 0 2.138-.225 2.925-.619.056 0 .113-.056.113-.056v.731zm0-2.587c0 .112-.112.45-.731.731-.562.281-1.406.506-2.362.506s-1.8-.168-2.363-.506c-.619-.281-.731-.619-.731-.731v-.788c.056 0 .112.056.112.056.788.394 1.857.62 2.925.62 1.125 0 2.138-.226 2.925-.62.056 0 .113-.056.113-.056v.788zm-.675-1.913c-.562.281-1.406.507-2.362.507s-1.8-.17-2.363-.507c-.619-.281-.731-.619-.731-.731 0-.113.112-.45.731-.731.563-.282 1.406-.507 2.363-.507.956 0 1.8.17 2.362.507.619.281.732.618.732.731-.057.112-.17.45-.732.731\"\n />\n </Icon>\n );\n};\n\nexport const AnnouncementIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <path\n fill=\"currentcolor\"\n fillOpacity={0.8}\n d=\"M11.53 2.255a.745.745 0 0 0-.82.165c-.525.524-1.188.959-1.947 1.284-.77.33-2.353.757-3.508.75-2.248-.015-3.756 1.259-3.756 3.726 0 2.163 1.228 3.42 2.994 3.703l.006 1.565a2.25 2.25 0 0 0 2.25 2.247c1.142 0 2.083-.883 2.228-1.988.007-.053.022-.26.022-1.01.674.315 1.232.812 1.711 1.29.473.472 1.29.13 1.29-.538 0-.678-.004-1.906-.004-3.13.884-.327 1.503-1.165 1.503-2.115s-.585-1.81-1.496-2.129c0-1.225-.004-2.439-.004-3.117a.76.76 0 0 0-.469-.703m1.805 1.335a.73.73 0 0 0-.445.351.75.75 0 0 0 .258 1.03 3.74 3.74 0 0 1 1.851 3.233 3.74 3.74 0 0 1-1.851 3.231.76.76 0 0 0-.282 1.03.754.754 0 0 0 1.032.258 5.24 5.24 0 0 0 2.601-4.52 5.24 5.24 0 0 0-2.601-4.519.74.74 0 0 0-.563-.094m-2.832.884c0 .694-.004 1.417-.004 2.231v2.997c0 .815.003 1.508.003 2.202-1.52-.896-3.085-1.294-4.501-1.421 0-1.144-.004-3.406-.004-4.584.147-.007.318-.026.565-.06a11.2 11.2 0 0 0 2.812-.773c.43-.184.75-.35 1.129-.592m-6.005 1.55-.001 4.34c-.976-.27-1.498-.959-1.498-2.184 0-1.21.47-1.928 1.499-2.155M6 11.998c.238.008 1.098.161 1.493.261l.007 1.19a.75.75 0 0 1-1.5 0z\"\n />\n </Icon>\n );\n};\n\nexport const SecurityIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <path\n d=\"M6.563 7.678V6.603c0-1.153 1.09-2.088 2.437-2.088s2.438.935 2.438 2.088v1.075c.448 0 .812.311.812.696v3.479c0 .384-.364.696-.812.696H6.563c-.449 0-.813-.312-.813-.696v-3.48c0-.384.364-.695.813-.695m1.187-.006 1.431.006h1.07V6.564c0-.64-.504-1.104-1.25-1.104-.748 0-1.25.465-1.25 1.104zm1.956 2.14c0-.335-.317-.605-.706-.605-.39 0-.706.27-.706.604v.77c0 .335.316.605.706.605s.706-.27.706-.604z\"\n fill=\"currentcolor\"\n fillOpacity=\".8\"\n />\n <path\n d=\"M2 3.607c.003 5.606.146 11.651 6.879 13.378.078.02.164.02.242 0C15.854 15.258 15.997 9.213 16 3.607c0-.217-.14-.41-.345-.477L9.31 1.05a1 1 0 0 0-.62 0L2.345 3.13A.5.5 0 0 0 2 3.607m2.326 7.63c-.707-1.954-.81-4.33-.824-6.902L9 2.532l5.498 1.803c-.014 2.573-.117 4.948-.824 6.901-.697 1.93-1.987 3.463-4.674 4.222-2.687-.759-3.977-2.293-4.674-4.222\"\n fill=\"currentcolor\"\n fillOpacity=\".8\"\n />\n </Icon>\n );\n};\n","import { FC, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { AnnouncementType, type API } from \"@kodiak-finance/orderly-types\";\nimport {\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n Divider,\n Flex,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport {\n AnnouncementIcon,\n BattleIcon,\n FundIcon,\n SecurityIcon,\n} from \"../announcementCenter/icons\";\nimport {\n CampaignContentCard,\n DelistingContentCard,\n ListingContentCard,\n MaintenanceContentCard,\n} from \"./contentCard\";\n\nexport interface NotificationProps {\n // Define your notification props here\n className?: string;\n // children?: React.ReactNode;\n dataSource: API.AnnouncementRow[];\n onClose?: () => void;\n}\n\nexport interface NotificationItemProps {\n id: string;\n type?: \"success\" | \"error\" | \"warning\" | \"info\";\n title?: string;\n message: string;\n onClose?: () => void;\n}\n\nexport interface NotificationListProps {\n notifications: NotificationItemProps[];\n onRemove?: (id: string) => void;\n}\n\nconst NotificationHeader: FC<{\n // type: AnnouncementType;\n dataSource: API.AnnouncementRow[];\n current: number;\n expanded?: boolean;\n onExpandToggle?: () => void;\n // onClose?: () => void;\n}> = (props) => {\n const { t } = useTranslation();\n const { expanded } = props;\n const { type } = props.dataSource[props.current];\n\n const title = useMemo(() => {\n switch (type) {\n case AnnouncementType.Campaign:\n return (\n <Text\n size=\"sm\"\n className=\"oui-text-transparent oui-bg-clip-text oui-gradient-brand\"\n >\n {t(\"notification.campaign\")}\n </Text>\n );\n case AnnouncementType.Delisting:\n return <Text size=\"sm\">{t(\"notification.delistingTitle\")}</Text>;\n case AnnouncementType.Listing:\n return (\n <Text size=\"sm\" color=\"buy\">\n {t(\"notification.listing\")}\n </Text>\n );\n case AnnouncementType.Maintenance:\n return (\n <Text size=\"sm\" color=\"warning\">\n {t(\"notification.maintenanceTitle\")}\n </Text>\n );\n default:\n return (\n <Text size=\"sm\" color=\"inherit\">\n {t(\"notification.generalTitle\")}\n </Text>\n );\n }\n }, [type, t]);\n const icon = useMemo(() => {\n switch (type) {\n case AnnouncementType.Campaign:\n return <BattleIcon color=\"white\" />;\n\n case AnnouncementType.Listing:\n return <FundIcon color=\"success\" />;\n case AnnouncementType.Maintenance:\n return <SecurityIcon color=\"warning\" />;\n case AnnouncementType.Delisting:\n default:\n return <AnnouncementIcon color=\"white\" />;\n }\n }, [type]);\n return (\n <Flex itemAlign=\"center\" justify=\"between\" className=\"oui-px-4 oui-py-3\">\n <div className=\"orderly-notification-header oui-flex oui-items-center oui-gap-2\">\n {icon}\n {title}\n </div>\n <button\n onClick={props.onExpandToggle}\n className=\"oui-transition-transform oui-duration-300\"\n style={{\n transform: !expanded ? \"rotate(180deg)\" : \"rotate(0deg)\",\n }}\n >\n <ChevronDownIcon size={18} color=\"white\" />\n </button>\n </Flex>\n );\n};\n\nconst NotificationFooter: FC<{\n total: number;\n current: number;\n onCloseAll: () => void;\n onPrev: () => void;\n onNext: () => void;\n}> = (props) => {\n const { total, current, onCloseAll, onPrev, onNext } = props;\n const { t } = useTranslation();\n return (\n <Flex\n className=\"orderly-notification-footer oui-px-4 oui-py-2\"\n itemAlign=\"center\"\n justify=\"between\"\n >\n <Flex gap={2}>\n <button\n disabled={current - 1 < 0}\n onClick={onPrev}\n className=\"oui-flex oui-size-[18px] oui-items-center oui-justify-center oui-rounded-full oui-bg-base-6 hover:oui-bg-base-5 disabled:oui-opacity-50\"\n >\n <ChevronLeftIcon size={14} color=\"white\" />\n </button>\n <Text intensity={54} size=\"sm\">\n {current + 1}/{total}\n </Text>\n <button\n disabled={current + 1 >= total}\n onClick={onNext}\n className=\"oui-flex oui-size-[18px] oui-items-center oui-justify-center oui-rounded-full oui-bg-base-6 hover:oui-bg-base-5 disabled:oui-opacity-50\"\n >\n <ChevronRightIcon size={14} color=\"white\" />\n </button>\n </Flex>\n <button onClick={onCloseAll}>\n <Text size=\"xs\" color=\"primary\">\n {t(\"notification.closeAll\", { total })}\n </Text>\n </button>\n </Flex>\n );\n};\n\nconst NotificationContent: FC<{\n dataSource: (API.AnnouncementRow & {\n startTime?: number;\n endTime?: number;\n })[];\n current: number;\n onItemClick: (url: string) => void;\n}> = (props) => {\n const elements = useMemo(() => {\n return props.dataSource.map((message) => {\n const { type } = message;\n switch (type) {\n case AnnouncementType.Campaign:\n return (\n <CampaignContentCard\n message={message.message}\n coverImage={message.coverImage ?? \"\"}\n updateTime={message.updated_time ?? 0}\n url={message.url ?? \"\"}\n onItemClick={props.onItemClick}\n />\n );\n case AnnouncementType.Maintenance:\n return (\n <MaintenanceContentCard\n message={message.message}\n startTime={message.startTime ?? 0}\n endTime={message.endTime ?? 0}\n />\n );\n case AnnouncementType.Delisting:\n return (\n <DelistingContentCard\n message={message.message}\n updateTime={message.updated_time ?? 0}\n />\n );\n default:\n return (\n <ListingContentCard\n message={message.message}\n updateTime={message.updated_time ?? 0}\n />\n );\n }\n });\n }, [props.dataSource]);\n return <>{elements[props.current]}</>;\n};\n\nexport const NotificationUI: FC<\n NotificationProps & {\n maintenanceMessage?: string;\n onItemClick: (url: string) => void;\n }\n> = (props) => {\n const [expanded, setExpanded] = useState(true);\n\n const [current, setCurrent] = useState(0);\n const len = useMemo(() => props.dataSource?.length ?? 0, [props.dataSource]);\n\n if (len === 0) {\n return null;\n }\n\n return (\n <div className=\"orderly-notification oui-w-full \">\n <NotificationHeader\n dataSource={props.dataSource ?? []}\n current={current}\n expanded={expanded}\n onExpandToggle={() => {\n setExpanded(!expanded);\n }}\n />\n <Divider className=\"oui-mx-4\" />\n <div\n className=\"oui-grid oui-transition-all oui-duration-300 oui-ease-in-out\"\n style={{\n gridTemplateRows: expanded ? \"1fr\" : \"0fr\",\n }}\n >\n {/* Inner div needs overflow-hidden and min-height-0 for grid animation to work */}\n <div className=\"oui-min-h-0 oui-overflow-hidden \">\n <div className=\"oui-px-4 oui-py-3\">\n <NotificationContent\n dataSource={props.dataSource ?? []}\n current={current}\n onItemClick={props.onItemClick}\n />\n </div>\n </div>\n </div>\n\n <NotificationFooter\n total={len}\n current={current}\n onCloseAll={props.onClose ?? (() => {})}\n onPrev={() => {\n if (current - 1 < 0) {\n return;\n }\n setCurrent(current - 1);\n }}\n onNext={() => {\n if (current + 1 >= len) {\n return;\n }\n setCurrent(current + 1);\n }}\n />\n </div>\n );\n};\n","import { FC, useMemo } from \"react\";\nimport { UTCDate } from \"@date-fns/utc\";\nimport { format, differenceInHours, differenceInMinutes } from \"date-fns\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { Flex, Text } from \"@kodiak-finance/orderly-ui\";\nimport { ArrowRightShortIcon } from \"../announcementCenter/icons\";\n\nexport const CampaignContentCard: FC<{\n message: string;\n coverImage: string;\n updateTime: number;\n url?: string | null;\n onItemClick: (url: string) => void;\n}> = ({ message, coverImage, url, onItemClick }) => {\n const { t } = useTranslation();\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-5\">\n <Text size=\"sm\" weight=\"bold\">\n {message}\n </Text>\n <div\n className=\"oui-rounded-xl oui-bg-base-9 oui-bg-cover oui-bg-center oui-bg-no-repeat\"\n style={{\n backgroundImage: `url(${coverImage})`,\n height: \"100px\",\n }}\n ></div>\n {typeof url === \"string\" &&\n url !== \"\" &&\n typeof onItemClick === \"function\" && (\n <button\n className=\"oui-flex oui-items-center oui-gap-1\"\n onClick={() => onItemClick(url)}\n >\n <Text\n size=\"xs\"\n color=\"buy\"\n className=\"oui-bg-clip-text oui-text-transparent oui-gradient-brand\"\n >\n {t(\"notification.joinNow\")}\n </Text>\n <ArrowRightShortIcon size={18} color=\"success\" />\n </button>\n )}\n </div>\n );\n};\n\nexport const MaintenanceContentCard: FC<{\n message: string;\n startTime: number;\n endTime: number;\n}> = ({ message, startTime, endTime }) => {\n const { t } = useTranslation();\n const formattedMessage = useMemo(() => {\n // Calculate duration in hours\n const hours = differenceInHours(endTime, startTime);\n\n const minutes = differenceInMinutes(endTime, startTime) - hours * 60;\n\n // Convert timestamps to UTC dates\n const startUtc = new UTCDate(startTime);\n const endUtc = new UTCDate(endTime);\n\n // Format start time as HH:mm (24-hour format) in UTC\n const startTimeFormatted = format(startUtc, \"HH:mm\");\n\n // Format end time as hh:mm a (12-hour format with AM/PM) in UTC\n const endTimeFormatted = format(endUtc, \"hh:mm a\");\n\n if (hours > 0) {\n return t(\"notification.maintenanceDuration.hours\", {\n hours: minutes > 0 ? (hours + minutes / 60).toFixed(1) : hours,\n startTimeFormatted,\n endTimeFormatted,\n });\n }\n\n return t(\"notification.maintenanceDuration.minutes\", {\n minutes,\n startTimeFormatted,\n endTimeFormatted,\n });\n }, [startTime, endTime, t]);\n\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-1\">\n <Text size=\"xs\" intensity={54}>\n {t(\"notification.recentlyUpdated\")}\n </Text>\n <Flex itemAlign={\"center\"}>\n <Text size=\"xs\" weight=\"bold\">\n {formattedMessage}\n </Text>\n </Flex>\n {message && (\n <Text size=\"2xs\" intensity={80} as=\"div\" className=\"oui-mt-2\">\n {message}\n </Text>\n )}\n </div>\n );\n};\n\nexport const DelistingContentCard: FC<{\n message: string;\n updateTime: number;\n}> = ({ message, updateTime }) => {\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-1\">\n <Text.formatted\n rule=\"date\"\n intensity={54}\n formatString=\"yyyy-MM-dd HH:mm:ss\"\n size=\"xs\"\n >\n {updateTime}\n </Text.formatted>\n <Text size=\"sm\" weight=\"bold\">\n {message}\n </Text>\n </div>\n );\n};\n\nexport const ListingContentCard: FC<{\n message: string;\n updateTime: number;\n}> = ({ message, updateTime }) => {\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-1\">\n <Text.formatted\n rule=\"date\"\n intensity={54}\n formatString=\"yyyy-MM-dd HH:mm:ss\"\n size=\"xs\"\n >\n {updateTime}\n </Text.formatted>\n <Text size=\"sm\" weight=\"bold\">\n {message}\n </Text>\n </div>\n );\n};\n","import { FC, useCallback } from \"react\";\nimport { useAnnouncementCenterScript } from \"./announcementCenter.script\";\nimport { AnnouncementCenterUI } from \"./announcementCenter.ui\";\n\nexport const AnnouncementCenterWidget: FC<{\n onRouteChange: (url: string) => void;\n}> = (props) => {\n const { dataSource, current, setCurrent } = useAnnouncementCenterScript();\n const onItemClick = useCallback(\n (url: string) => {\n if (!url) return;\n props.onRouteChange(url);\n },\n [props.onRouteChange],\n );\n return (\n <AnnouncementCenterUI\n dataSource={dataSource}\n current={current}\n setCurrent={setCurrent}\n onItemClick={onItemClick}\n />\n );\n};\n","import { useState } from \"react\";\nimport { useAnnouncement } from \"../hooks/useAnnouncement\";\n\nexport const useAnnouncementCenterScript = () => {\n const { tips } = useAnnouncement();\n const [current, setCurrent] = useState<string | number | null>(null);\n\n return {\n dataSource: tips,\n current,\n setCurrent,\n };\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport { UTCDateMini } from \"@date-fns/utc\";\nimport { format } from \"date-fns\";\nimport { produce } from \"immer\";\nimport {\n MaintenanceStatus,\n useLocalStorage,\n useMaintenanceStatus,\n useOrderlyContext,\n useQuery,\n useWS,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport {\n AnnouncementType,\n API,\n EMPTY_LIST,\n WSMessage,\n} from \"@kodiak-finance/orderly-types\";\nimport { getTimestamp } from \"@kodiak-finance/orderly-utils\";\n\nconst oneDay = 1000 * 60 * 60 * 24;\n\nconst maintentanceId = \"-1\";\n\nexport type AnnouncementOptions = {\n hideTips?: boolean;\n};\n\ninterface AnnouncementStore {\n show?: boolean;\n lastUpdateTime?: number | null;\n}\n\nconst ORDERLY_ANNOUNCEMENT_KEY = \"orderly_announcement\";\n\nconst getTimeString = (timestamp: number) => {\n const date = format(new UTCDateMini(timestamp), \"MMM dd\");\n const time = format(new UTCDateMini(timestamp), \"h:mm aa\");\n return `${time} (UTC) on ${date}`;\n};\n\nconst sortDataByUpdatedTime = (ori: API.Announcement) => {\n return produce<API.Announcement>(ori, (draft) => {\n if (Array.isArray(draft.rows)) {\n draft.rows.sort((a, b) => {\n if (a.updated_time && b.updated_time) {\n return b.updated_time - a.updated_time;\n }\n return 0;\n });\n }\n });\n};\n\nconst useAnnouncementData = () => {\n const ws = useWS();\n\n const [announcementStore, setStore] = useLocalStorage<AnnouncementStore>(\n ORDERLY_ANNOUNCEMENT_KEY,\n {},\n );\n\n const [tips, setTips] = useState<API.Announcement>({});\n\n const [maintenanceDialogInfo, setMaintenanceDialogInfo] = useState<string>();\n\n const { startTime, endTime, status, brokerName } = useMaintenanceStatus();\n\n const { t } = useTranslation();\n\n const { data: announcements } = useQuery<API.Announcement>(\n `/v2/public/announcement`,\n {\n revalidateOnFocus: false,\n refreshInterval: 60 * 60 * 1000, // refresh every 1 hour\n formatter: (data) => data,\n },\n );\n\n const getMaintentTipsContent = (\n brokerName: string,\n startDate: string,\n endDate: string,\n ) => t(\"maintenance.tips.description\", { brokerName, startDate, endDate });\n\n const getMaintentDialogContent = (brokerName: string, endDate: string) =>\n t(\"maintenance.dialog.description\", { brokerName, endDate });\n\n useEffect(() => {\n const unsubscribe = ws.subscribe(\"announcement\", {\n onMessage(message: WSMessage.Announcement) {\n if (message) {\n setTips((prev) => {\n return produce(prev, (draft) => {\n // Make sure draft.rows is an array\n if (!Array.isArray(draft.rows)) {\n draft.rows = [];\n }\n const idx = draft.rows.findIndex(\n (tip) => tip.announcement_id === message.announcement_id,\n );\n // Filter out old tips with the same id\n if (idx !== -1) {\n draft.rows.splice(idx, 1);\n }\n // Add the latest tip\n draft.rows.push({\n announcement_id: message.announcement_id,\n message: message.message,\n url: message.url,\n i18n: message.i18n,\n type: message.type,\n updated_time: message.updated_time,\n });\n });\n });\n // @ts-ignore\n setStore((prev) => ({ ...prev, show: true }));\n }\n },\n onError(err) {\n if (err instanceof Error) {\n console.error(\"Error receiving announcement:\", err.message);\n }\n },\n });\n return () => {\n unsubscribe?.();\n };\n }, [ws]);\n\n useEffect(() => {\n if (!announcements?.rows) {\n return;\n }\n const apiTime = announcements.last_updated_time ?? 0;\n const cachedTime = announcementStore.lastUpdateTime ?? 0;\n if (cachedTime < apiTime) {\n setTips((prev) => ({ ...prev, rows: announcements?.rows }));\n setStore({ show: true, lastUpdateTime: apiTime });\n } else {\n setTips((prev) => {\n return produce<API.Announcement>(prev, (draft) => {\n if (announcements?.rows?.length) {\n // If there are announcement rows available, create a Set to store IDs of existing tips\n const existingIds = new Set<string | number>(\n prev.rows?.map((tip) => tip.announcement_id),\n );\n // Find the maintenance tip in previous tips (if any)\n const maintenanceTip = prev.rows?.find(\n (tip) => tip.announcement_id === maintentanceId,\n );\n // Clear the draft’s rows array to refill it\n draft.rows = [];\n announcements.rows.forEach((item) => {\n if (!existingIds.has(item.announcement_id)) {\n // If the item’s ID is not in existingIds, push it into the draft\n draft.rows?.push(item);\n }\n });\n if (maintenanceTip) {\n // If a maintenance tip existed before, unshift it to the front\n draft.rows.unshift(maintenanceTip);\n }\n } else {\n // Find the index of the maintenance tip in draft rows\n const idx = draft.rows?.findIndex(\n (tip) => tip.announcement_id === maintentanceId,\n );\n if (idx !== undefined && idx !== -1) {\n // Remove the maintenance tip from draft rows\n draft.rows?.splice(idx, 1);\n }\n }\n });\n });\n }\n }, [announcements]);\n\n useEffect(() => {\n const startDate = startTime ? getTimeString(startTime) : \"-\";\n const endDate = endTime ? getTimeString(endTime) : \"-\";\n if (status === MaintenanceStatus.Maintenance) {\n setMaintenanceDialogInfo(getMaintentDialogContent(brokerName, endDate));\n return;\n }\n setMaintenanceDialogInfo(undefined);\n\n if (startTime && endTime) {\n // if (startTime < getTimestamp() + oneDay) {\n setTips((prev) =>\n produce<API.Announcement>(prev, (draft) => {\n // Make sure draft.rows is an array\n if (!Array.isArray(draft.rows)) {\n draft.rows = [];\n }\n // Rebuild rows: insert the latest maintenance tip first, then put the old non-maintenance ones at the end\n draft.rows = [\n {\n announcement_id: maintentanceId,\n type: AnnouncementType.Maintenance,\n /** @ts-ignore */\n startTime: startTime,\n /** @ts-ignore */\n endTime: endTime,\n message: getMaintentTipsContent(brokerName, startDate, endDate),\n },\n ...draft.rows.filter(\n (tip) => tip.type !== AnnouncementType.Maintenance,\n ),\n ];\n }),\n );\n } else {\n setTips((prev) => {\n return produce<API.Announcement>(prev, (draft) => {\n const index = draft.rows?.findIndex(\n (tip) => tip.announcement_id === maintentanceId,\n );\n if (index !== undefined && index !== -1) {\n draft.rows?.splice(index, 1);\n }\n });\n });\n }\n }, [startTime, endTime, status, brokerName, t]);\n\n const { customAnnouncements } = useAppContext();\n\n // Merge custom announcements with API announcements\n const mergedTips = useMemo(() => {\n const tipsCopy = { ...tips };\n if (customAnnouncements && customAnnouncements.length > 0) {\n // Custom announcements appear first (higher priority)\n tipsCopy.rows = [...customAnnouncements, ...(tips.rows || [])];\n }\n return sortDataByUpdatedTime(tipsCopy);\n }, [tips, customAnnouncements]);\n\n return {\n tips: mergedTips,\n maintenanceDialogInfo: maintenanceDialogInfo,\n };\n};\n\nexport type AnnouncementReturn = ReturnType<typeof useAnnouncement>;\n\nexport const useAnnouncement = (options?: AnnouncementOptions) => {\n const { showAnnouncement, setShowAnnouncement } = useAppContext();\n const { dataAdapter } = useOrderlyContext();\n\n const { tips: mergedTips, maintenanceDialogInfo } = useAnnouncementData();\n\n const memoizedTips = useMemo<API.AnnouncementRow[]>(() => {\n if (typeof dataAdapter?.announcementList === \"function\") {\n return dataAdapter.announcementList(\n mergedTips?.rows ?? (EMPTY_LIST as API.AnnouncementRow[]),\n );\n }\n return mergedTips?.rows ?? (EMPTY_LIST as API.AnnouncementRow[]);\n }, [dataAdapter?.announcementList, mergedTips?.rows]);\n\n const [announcementStore, setStore] = useLocalStorage<AnnouncementStore>(\n ORDERLY_ANNOUNCEMENT_KEY,\n {},\n );\n\n const closeTips = () => {\n // @ts-ignore\n setStore((prev) => ({ ...prev, show: false }));\n };\n\n useEffect(() => {\n const len = memoizedTips.length;\n setShowAnnouncement(\n Boolean(len) && announcementStore.show && !options?.hideTips,\n );\n }, [\n memoizedTips,\n announcementStore.show,\n options?.hideTips,\n setShowAnnouncement,\n ]);\n\n return {\n maintenanceDialogInfo,\n tips: memoizedTips,\n closeTips: closeTips,\n showAnnouncement: showAnnouncement,\n };\n};\n","import { FC } from \"react\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { AnnouncementContent } from \"../components/announcementCenter/announcementCenter.ui\";\n\nexport const AnnouncementCenterUI: FC<{\n dataSource: API.AnnouncementRow[];\n current: string | number | null;\n setCurrent: (current: string | number | null) => void;\n onItemClick: (url: string) => void;\n}> = (props) => {\n const { dataSource, current, setCurrent, onItemClick } = props;\n return (\n <div className=\"oui-m-1 oui-rounded-xl oui-bg-base-9 oui-p-2\">\n <AnnouncementContent\n dataSource={dataSource}\n current={current}\n onExpandToggle={setCurrent}\n onItemClick={onItemClick}\n showDivider\n />\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { RouterAdapter } from \"@kodiak-finance/orderly-types\";\nimport { AnnouncementCenterWidget } from \"./announcementCenter.widget\";\n\nexport const AnnouncementCenterPage: FC<{ routerAdapter?: RouterAdapter }> = (\n props,\n) => {\n return (\n <AnnouncementCenterWidget\n onRouteChange={(url: string) => {\n if (!url) return;\n props.routerAdapter?.onRouteChange({\n href: url,\n name: url,\n });\n }}\n />\n );\n};\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -143,6 +143,14 @@ var AnnouncementItem = (props) => {
|
|
|
143
143
|
return t("notification.general");
|
|
144
144
|
}
|
|
145
145
|
}, [props.type, t]);
|
|
146
|
+
const isExternalLink = (url) => {
|
|
147
|
+
try {
|
|
148
|
+
const urlObj = new URL(url, window.location.origin);
|
|
149
|
+
return urlObj.origin !== window.location.origin;
|
|
150
|
+
} catch {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
};
|
|
146
154
|
const action = useMemo(() => {
|
|
147
155
|
if (props.type === AnnouncementType.Campaign && typeof props.url === "string" && props.url !== "" && typeof props.onItemClick === "function") {
|
|
148
156
|
return /* @__PURE__ */ jsxs(
|
|
@@ -153,7 +161,13 @@ var AnnouncementItem = (props) => {
|
|
|
153
161
|
className: "oui-cursor-pointer",
|
|
154
162
|
onClick: (event) => {
|
|
155
163
|
event.stopPropagation();
|
|
156
|
-
props.
|
|
164
|
+
const url = props.url;
|
|
165
|
+
const isExternal = isExternalLink(url);
|
|
166
|
+
if (isExternal) {
|
|
167
|
+
window.open(url, "_blank", "noopener,noreferrer");
|
|
168
|
+
} else {
|
|
169
|
+
props.onItemClick(url);
|
|
170
|
+
}
|
|
157
171
|
},
|
|
158
172
|
children: [
|
|
159
173
|
/* @__PURE__ */ jsx(
|
|
@@ -846,8 +860,7 @@ var AnnouncementCenterPage = (props) => {
|
|
|
846
860
|
return;
|
|
847
861
|
props.routerAdapter?.onRouteChange({
|
|
848
862
|
href: url,
|
|
849
|
-
name: url
|
|
850
|
-
target: "_blank"
|
|
863
|
+
name: url
|
|
851
864
|
});
|
|
852
865
|
}
|
|
853
866
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/announcementCenter/announcementCenter.ui.tsx","../src/components/announcementCenter/announcementItem.tsx","../src/components/announcementCenter/icons.tsx","../src/components/notification/notification.ui.tsx","../src/components/notification/contentCard.tsx","../src/pages/announcementCenter.widget.tsx","../src/pages/announcementCenter.script.tsx","../src/hooks/useAnnouncement.ts","../src/pages/announcementCenter.ui.tsx","../src/pages/announcementCenter.page.tsx"],"names":["useTranslation","Text","cn","jsx","jsxs","Icon","useMemo","useState","AnnouncementType","ChevronDownIcon","Flex","Fragment","format","brokerName","AnnouncementCenterUI"],"mappings":"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","sourcesContent":["import { FC, useState } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { type API } from \"@kodiak-finance/orderly-types\";\nimport {\n ExtensionPositionEnum,\n ExtensionSlot,\n ScrollArea,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\nimport { AnnouncementItem } from \"./announcementItem\";\n\nexport const AnnouncementContent: FC<{\n dataSource: API.AnnouncementRow[];\n current: string | number | null;\n onExpandToggle: (id: string | number | null) => void;\n onItemClick: (url: string) => void;\n showDivider?: boolean;\n}> = (props) => {\n const { dataSource, current, onExpandToggle, onItemClick } = props;\n const { t } = useTranslation();\n\n if (!Array.isArray(dataSource) || dataSource.length === 0) {\n return (\n <div className=\"oui-flex oui-h-[160px] oui-items-center oui-justify-center\">\n <ExtensionSlot\n position={ExtensionPositionEnum.EmptyDataIdentifier}\n title={t(\"notification.empty\")}\n />\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"oui-flex oui-flex-col oui-space-y-1\",\n props.showDivider &&\n \"[&>*:not(:first-child)]:oui-border-t [&>*:not(:first-child)]:oui-border-line-12 [&>*:not(:first-child)]:oui-pt-1\",\n )}\n >\n {dataSource.map((item) => (\n <AnnouncementItem\n url={item.url}\n onItemClick={onItemClick}\n key={item.announcement_id}\n message={item.message}\n updatedTime={item.updated_time ?? 0}\n expanded={current === item.announcement_id}\n type={item.type}\n showDivider={props.showDivider}\n onExpandToggle={() => {\n if (current === item.announcement_id) {\n onExpandToggle(null);\n } else {\n onExpandToggle(item.announcement_id);\n }\n }}\n />\n ))}\n </div>\n );\n};\n\nexport const AnnouncementCenterUI: FC<{\n dataSource: API.AnnouncementRow[];\n onItemClick: (url: string) => void;\n}> = (props) => {\n const { t } = useTranslation();\n const [expanded, setExpanded] = useState<string | number | null>(null);\n\n return (\n <>\n <div className=\"oui-px-5 oui-pt-4\">\n <Text intensity={80} weight=\"bold\">\n {t(\"notification.title\")}\n </Text>\n </div>\n\n <ScrollArea className=\"oui-flex oui-h-[300px] oui-flex-col oui-space-y-1 oui-p-3\">\n <AnnouncementContent\n dataSource={props.dataSource}\n current={expanded}\n onExpandToggle={setExpanded}\n onItemClick={props.onItemClick}\n />\n </ScrollArea>\n </>\n );\n};\n","import { FC, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { AnnouncementType } from \"@kodiak-finance/orderly-types\";\nimport { Flex, Text, ChevronDownIcon, cn } from \"@kodiak-finance/orderly-ui\";\nimport {\n AnnouncementIcon,\n ArrowRightShortIcon,\n CampaignIcon,\n FundIcon,\n SecurityIcon,\n} from \"./icons\";\n\nexport const AnnouncementItem: FC<{\n // title: string;\n expanded: boolean;\n url?: string | null;\n onItemClick: (url: string) => void;\n onExpandToggle?: () => void;\n type: AnnouncementType | undefined | null;\n message: string;\n updatedTime: number;\n className?: string;\n showDivider?: boolean;\n}> = (props) => {\n const { t } = useTranslation();\n const Icon = useMemo(() => {\n switch (props.type) {\n case AnnouncementType.Campaign:\n return CampaignIcon;\n\n case AnnouncementType.Listing:\n return FundIcon;\n case AnnouncementType.Maintenance:\n return SecurityIcon;\n case AnnouncementType.Delisting:\n default:\n return AnnouncementIcon;\n }\n }, [props.type]);\n\n const title = useMemo(() => {\n switch (props.type) {\n case AnnouncementType.Campaign:\n return t(\"notification.campaign\");\n case AnnouncementType.Delisting:\n return t(\"notification.delisting\");\n case AnnouncementType.Listing:\n return t(\"notification.listing\");\n case AnnouncementType.Maintenance:\n return t(\"notification.maintenance\");\n default:\n return t(\"notification.general\");\n }\n }, [props.type, t]);\n\n const action = useMemo(() => {\n if (\n props.type === AnnouncementType.Campaign &&\n typeof props.url === \"string\" &&\n props.url !== \"\" &&\n typeof props.onItemClick === \"function\"\n ) {\n return (\n <Flex\n gap={1}\n itemAlign=\"center\"\n className=\"oui-cursor-pointer\"\n onClick={(event) => {\n event.stopPropagation();\n props.onItemClick(props.url!);\n }}\n >\n <Text\n size=\"xs\"\n color=\"buy\"\n className=\"oui-bg-clip-text oui-text-transparent oui-gradient-brand\"\n >\n {t(\"notification.joinNow\")}\n </Text>\n <ArrowRightShortIcon size={18} />\n </Flex>\n );\n }\n return null;\n }, [props.type, props.url, t]);\n\n const updateTime = useMemo(() => {\n if (props.type === AnnouncementType.Maintenance) {\n return (\n <Text size=\"2xs\" intensity={36}>\n {t(\"notification.recentlyUpdated\")}\n </Text>\n );\n }\n return (\n <Text.formatted\n size=\"2xs\"\n intensity={36}\n rule=\"date\"\n formatString=\"yyyy-MM-dd HH:mm:ss\"\n >\n {props.updatedTime}\n </Text.formatted>\n );\n }, [props.updatedTime, props.type, t]);\n\n return (\n <Flex\n gap={2}\n itemAlign=\"start\"\n className={cn(\n \"oui-px-2 oui-py-[6px] oui-text-base-contrast-80\",\n !props.showDivider && \"oui-rounded-md hover:oui-bg-base-6\",\n !props.showDivider && props.expanded && \"oui-bg-base-6\",\n props.className,\n )}\n onClick={() => {\n props.onExpandToggle?.();\n }}\n >\n <Icon color=\"white\" className=\"oui-mt-3 oui-shrink-0\" />\n\n <Flex direction=\"column\" itemAlign=\"start\" grow>\n <Text size=\"xs\" intensity={80} weight=\"bold\">\n {title}\n </Text>\n {updateTime}\n {/* Expandable content with animation */}\n <div\n className=\"oui-grid oui-transition-all oui-duration-300 oui-ease-in-out\"\n style={{\n gridTemplateRows: props.expanded ? \"1fr\" : \"0fr\",\n }}\n >\n <div className=\"oui-flex oui-flex-col oui-gap-2 oui-overflow-hidden\">\n <Text size=\"2xs\" intensity={80} as=\"div\" className=\"oui-pt-2\">\n {props.message}\n </Text>\n {action}\n </div>\n </div>\n </Flex>\n <div className=\"oui-pt-3\">\n {/* Chevron icon with rotation animation */}\n <ChevronDownIcon\n color=\"white\"\n size={18}\n className={`oui-transition-transform oui-duration-300 oui-ease-in-out ${\n props.expanded ? \"oui-rotate-180\" : \"oui-rotate-0\"\n }`}\n />\n </div>\n </Flex>\n );\n};\n","import { FC } from \"react\";\nimport type { BaseIconProps } from \"@kodiak-finance/orderly-ui\";\nimport { Icon } from \"@kodiak-finance/orderly-ui\";\n\nexport const BattleIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <defs>\n <linearGradient\n id=\"paint0_linear_555_7374\"\n x1=\"17.0157\"\n y1=\"9.26513\"\n x2=\"0.969849\"\n y2=\"9.26513\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"rgb(var(--oui-gradient-brand-end))\" />\n <stop offset=\"1\" stopColor=\"rgb(var(--oui-gradient-brand-start))\" />\n </linearGradient>\n </defs>\n <path\n fill=\"url(#paint0_linear_555_7374)\"\n fillOpacity={1}\n d=\"m1.5 1.5.75 3 4.843 4.56-1.808 1.919-.63-.633-1.06 1.06.665.665-1.88 1.996-.35-.346-1.06 1.06 2.25 2.25 1.06-1.06-.348-.349 1.998-1.878.665.662 1.06-1.06-.63-.63L9 10.852l1.969 1.854-.639.639 1.06 1.06.672-.67 1.998 1.877-.358.358 1.064 1.06 2.25-2.25-1.06-1.06-.34.34-1.881-1.998.656-.657-1.06-1.06-.625.624-1.799-1.91.003-.003L9 7.03 4.5 2.25zm15 0-3 .75-3.636 3.861 2.022 2.025L15.75 4.5z\"\n />\n </Icon>\n );\n};\n\nexport const CampaignIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <path\n fill=\"currentcolor\"\n fillOpacity={1}\n d=\"m1.5 1.5.75 3 4.843 4.56-1.808 1.919-.63-.633-1.06 1.06.665.665-1.88 1.996-.35-.346-1.06 1.06 2.25 2.25 1.06-1.06-.348-.349 1.998-1.878.665.662 1.06-1.06-.63-.63L9 10.852l1.969 1.854-.639.639 1.06 1.06.672-.67 1.998 1.877-.358.358 1.064 1.06 2.25-2.25-1.06-1.06-.34.34-1.881-1.998.656-.657-1.06-1.06-.625.624-1.799-1.91.003-.003L9 7.03 4.5 2.25zm15 0-3 .75-3.636 3.861 2.022 2.025L15.75 4.5z\"\n />\n </Icon>\n );\n};\n\nexport const ArrowRightShortIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <defs>\n <linearGradient\n id=\"paint0_linear_555_7374\"\n x1=\"17.0157\"\n y1=\"9.26513\"\n x2=\"0.969849\"\n y2=\"9.26513\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"rgb(var(--oui-gradient-brand-end))\" />\n <stop offset=\"1\" stopColor=\"rgb(var(--oui-gradient-brand-start))\" />\n </linearGradient>\n </defs>\n <path\n fill=\"url(#paint0_linear_555_7374)\"\n fillOpacity={1}\n d=\"M4.509 8.995a.75.75 0 0 1 .75-.75h5.666L8.7 5.998l1.054-1.054 3.535 3.512c.147.146.22.343.22.54a.76.76 0 0 1-.22.537l-3.535 3.512L8.7 11.992l2.225-2.248H5.258a.75.75 0 0 1-.749-.75\"\n />\n </Icon>\n );\n};\n\nexport const FundIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <path\n fill=\"currentcolor\"\n fillOpacity={0.8}\n d=\"M15.694 7.087c-.788-.393-1.857-.618-2.925-.618-1.125 0-2.138.225-2.925.618-.056 0-.113.057-.113.057V3.769c0-.9-.731-1.575-1.462-1.913-.788-.394-1.857-.619-2.925-.619-1.069 0-2.25.225-3.038.62C1.575 2.193.844 2.868.844 3.768v10.519c0 .9.731 1.575 1.462 1.912.788.394 1.856.619 2.925.619s2.138-.225 2.925-.619c.281-.169.563-.337.788-.562.225.225.506.393.787.562.788.394 1.857.619 2.925.619 1.125 0 2.138-.225 2.925-.619.732-.394 1.463-1.012 1.463-1.912V9c.112-.9-.619-1.519-1.35-1.913m-7.369 7.144c0 .113-.112.45-.731.732-.563.28-1.407.506-2.363.506s-1.8-.169-2.362-.506c-.619-.282-.731-.62-.731-.732V13.5c.056 0 .112 0 .168.056.788.394 1.856.619 2.925.619s2.138-.225 2.925-.619c.056 0 .113-.056.113-.056v.731zm0-2.587c0 .112-.112.45-.731.731-.563.281-1.407.506-2.363.506s-1.8-.168-2.362-.506c-.619-.281-.731-.619-.731-.731v-.788c.056 0 .112.056.112.056.788.394 1.856.62 2.925.62s2.138-.226 2.925-.62c.056 0 .113-.056.113-.056v.788zm0-2.644c0 .112-.112.45-.731.731-.563.281-1.407.507-2.363.507s-1.8-.17-2.362-.507C2.25 9.45 2.138 9.112 2.138 9v-.788c.056 0 .112.057.112.057.788.393 1.856.618 2.925.618S7.313 8.662 8.1 8.27c.056 0 .113-.057.113-.057V9zm0-2.644c0 .113-.112.45-.731.731-.563.282-1.407.507-2.363.507s-1.8-.169-2.362-.507c-.619-.28-.731-.618-.731-.73v-.732c.056 0 .112 0 .168.056.788.394 1.856.619 2.925.619s2.138-.225 2.925-.619c.056 0 .113-.056.113-.056v.731zM7.594 4.5c-.563.281-1.407.506-2.363.506S3.488 4.781 2.925 4.5c-.619-.338-.731-.619-.731-.731 0-.113.112-.45.731-.732.563-.28 1.406-.506 2.363-.506.956 0 1.8.169 2.362.506.619.282.731.62.731.732-.056.112-.168.393-.787.731m8.212 9.731c0 .113-.112.45-.731.732-.562.28-1.406.506-2.362.506s-1.8-.169-2.363-.506c-.619-.282-.731-.62-.731-.732V13.5c.056 0 .112.056.112.056.788.394 1.857.619 2.925.619 1.125 0 2.138-.225 2.925-.619.056 0 .113-.056.113-.056v.731zm0-2.587c0 .112-.112.45-.731.731-.562.281-1.406.506-2.362.506s-1.8-.168-2.363-.506c-.619-.281-.731-.619-.731-.731v-.788c.056 0 .112.056.112.056.788.394 1.857.62 2.925.62 1.125 0 2.138-.226 2.925-.62.056 0 .113-.056.113-.056v.788zm-.675-1.913c-.562.281-1.406.507-2.362.507s-1.8-.17-2.363-.507c-.619-.281-.731-.619-.731-.731 0-.113.112-.45.731-.731.563-.282 1.406-.507 2.363-.507.956 0 1.8.17 2.362.507.619.281.732.618.732.731-.057.112-.17.45-.732.731\"\n />\n </Icon>\n );\n};\n\nexport const AnnouncementIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <path\n fill=\"currentcolor\"\n fillOpacity={0.8}\n d=\"M11.53 2.255a.745.745 0 0 0-.82.165c-.525.524-1.188.959-1.947 1.284-.77.33-2.353.757-3.508.75-2.248-.015-3.756 1.259-3.756 3.726 0 2.163 1.228 3.42 2.994 3.703l.006 1.565a2.25 2.25 0 0 0 2.25 2.247c1.142 0 2.083-.883 2.228-1.988.007-.053.022-.26.022-1.01.674.315 1.232.812 1.711 1.29.473.472 1.29.13 1.29-.538 0-.678-.004-1.906-.004-3.13.884-.327 1.503-1.165 1.503-2.115s-.585-1.81-1.496-2.129c0-1.225-.004-2.439-.004-3.117a.76.76 0 0 0-.469-.703m1.805 1.335a.73.73 0 0 0-.445.351.75.75 0 0 0 .258 1.03 3.74 3.74 0 0 1 1.851 3.233 3.74 3.74 0 0 1-1.851 3.231.76.76 0 0 0-.282 1.03.754.754 0 0 0 1.032.258 5.24 5.24 0 0 0 2.601-4.52 5.24 5.24 0 0 0-2.601-4.519.74.74 0 0 0-.563-.094m-2.832.884c0 .694-.004 1.417-.004 2.231v2.997c0 .815.003 1.508.003 2.202-1.52-.896-3.085-1.294-4.501-1.421 0-1.144-.004-3.406-.004-4.584.147-.007.318-.026.565-.06a11.2 11.2 0 0 0 2.812-.773c.43-.184.75-.35 1.129-.592m-6.005 1.55-.001 4.34c-.976-.27-1.498-.959-1.498-2.184 0-1.21.47-1.928 1.499-2.155M6 11.998c.238.008 1.098.161 1.493.261l.007 1.19a.75.75 0 0 1-1.5 0z\"\n />\n </Icon>\n );\n};\n\nexport const SecurityIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <path\n d=\"M6.563 7.678V6.603c0-1.153 1.09-2.088 2.437-2.088s2.438.935 2.438 2.088v1.075c.448 0 .812.311.812.696v3.479c0 .384-.364.696-.812.696H6.563c-.449 0-.813-.312-.813-.696v-3.48c0-.384.364-.695.813-.695m1.187-.006 1.431.006h1.07V6.564c0-.64-.504-1.104-1.25-1.104-.748 0-1.25.465-1.25 1.104zm1.956 2.14c0-.335-.317-.605-.706-.605-.39 0-.706.27-.706.604v.77c0 .335.316.605.706.605s.706-.27.706-.604z\"\n fill=\"currentcolor\"\n fillOpacity=\".8\"\n />\n <path\n d=\"M2 3.607c.003 5.606.146 11.651 6.879 13.378.078.02.164.02.242 0C15.854 15.258 15.997 9.213 16 3.607c0-.217-.14-.41-.345-.477L9.31 1.05a1 1 0 0 0-.62 0L2.345 3.13A.5.5 0 0 0 2 3.607m2.326 7.63c-.707-1.954-.81-4.33-.824-6.902L9 2.532l5.498 1.803c-.014 2.573-.117 4.948-.824 6.901-.697 1.93-1.987 3.463-4.674 4.222-2.687-.759-3.977-2.293-4.674-4.222\"\n fill=\"currentcolor\"\n fillOpacity=\".8\"\n />\n </Icon>\n );\n};\n","import { FC, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { AnnouncementType, type API } from \"@kodiak-finance/orderly-types\";\nimport {\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n Divider,\n Flex,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport {\n AnnouncementIcon,\n BattleIcon,\n FundIcon,\n SecurityIcon,\n} from \"../announcementCenter/icons\";\nimport {\n CampaignContentCard,\n DelistingContentCard,\n ListingContentCard,\n MaintenanceContentCard,\n} from \"./contentCard\";\n\nexport interface NotificationProps {\n // Define your notification props here\n className?: string;\n // children?: React.ReactNode;\n dataSource: API.AnnouncementRow[];\n onClose?: () => void;\n}\n\nexport interface NotificationItemProps {\n id: string;\n type?: \"success\" | \"error\" | \"warning\" | \"info\";\n title?: string;\n message: string;\n onClose?: () => void;\n}\n\nexport interface NotificationListProps {\n notifications: NotificationItemProps[];\n onRemove?: (id: string) => void;\n}\n\nconst NotificationHeader: FC<{\n // type: AnnouncementType;\n dataSource: API.AnnouncementRow[];\n current: number;\n expanded?: boolean;\n onExpandToggle?: () => void;\n // onClose?: () => void;\n}> = (props) => {\n const { t } = useTranslation();\n const { expanded } = props;\n const { type } = props.dataSource[props.current];\n\n const title = useMemo(() => {\n switch (type) {\n case AnnouncementType.Campaign:\n return (\n <Text\n size=\"sm\"\n className=\"oui-text-transparent oui-bg-clip-text oui-gradient-brand\"\n >\n {t(\"notification.campaign\")}\n </Text>\n );\n case AnnouncementType.Delisting:\n return <Text size=\"sm\">{t(\"notification.delistingTitle\")}</Text>;\n case AnnouncementType.Listing:\n return (\n <Text size=\"sm\" color=\"buy\">\n {t(\"notification.listing\")}\n </Text>\n );\n case AnnouncementType.Maintenance:\n return (\n <Text size=\"sm\" color=\"warning\">\n {t(\"notification.maintenanceTitle\")}\n </Text>\n );\n default:\n return (\n <Text size=\"sm\" color=\"inherit\">\n {t(\"notification.generalTitle\")}\n </Text>\n );\n }\n }, [type, t]);\n const icon = useMemo(() => {\n switch (type) {\n case AnnouncementType.Campaign:\n return <BattleIcon color=\"white\" />;\n\n case AnnouncementType.Listing:\n return <FundIcon color=\"success\" />;\n case AnnouncementType.Maintenance:\n return <SecurityIcon color=\"warning\" />;\n case AnnouncementType.Delisting:\n default:\n return <AnnouncementIcon color=\"white\" />;\n }\n }, [type]);\n return (\n <Flex itemAlign=\"center\" justify=\"between\" className=\"oui-px-4 oui-py-3\">\n <div className=\"orderly-notification-header oui-flex oui-items-center oui-gap-2\">\n {icon}\n {title}\n </div>\n <button\n onClick={props.onExpandToggle}\n className=\"oui-transition-transform oui-duration-300\"\n style={{\n transform: !expanded ? \"rotate(180deg)\" : \"rotate(0deg)\",\n }}\n >\n <ChevronDownIcon size={18} color=\"white\" />\n </button>\n </Flex>\n );\n};\n\nconst NotificationFooter: FC<{\n total: number;\n current: number;\n onCloseAll: () => void;\n onPrev: () => void;\n onNext: () => void;\n}> = (props) => {\n const { total, current, onCloseAll, onPrev, onNext } = props;\n const { t } = useTranslation();\n return (\n <Flex\n className=\"orderly-notification-footer oui-px-4 oui-py-2\"\n itemAlign=\"center\"\n justify=\"between\"\n >\n <Flex gap={2}>\n <button\n disabled={current - 1 < 0}\n onClick={onPrev}\n className=\"oui-flex oui-size-[18px] oui-items-center oui-justify-center oui-rounded-full oui-bg-base-6 hover:oui-bg-base-5 disabled:oui-opacity-50\"\n >\n <ChevronLeftIcon size={14} color=\"white\" />\n </button>\n <Text intensity={54} size=\"sm\">\n {current + 1}/{total}\n </Text>\n <button\n disabled={current + 1 >= total}\n onClick={onNext}\n className=\"oui-flex oui-size-[18px] oui-items-center oui-justify-center oui-rounded-full oui-bg-base-6 hover:oui-bg-base-5 disabled:oui-opacity-50\"\n >\n <ChevronRightIcon size={14} color=\"white\" />\n </button>\n </Flex>\n <button onClick={onCloseAll}>\n <Text size=\"xs\" color=\"primary\">\n {t(\"notification.closeAll\", { total })}\n </Text>\n </button>\n </Flex>\n );\n};\n\nconst NotificationContent: FC<{\n dataSource: (API.AnnouncementRow & {\n startTime?: number;\n endTime?: number;\n })[];\n current: number;\n onItemClick: (url: string) => void;\n}> = (props) => {\n const elements = useMemo(() => {\n return props.dataSource.map((message) => {\n const { type } = message;\n switch (type) {\n case AnnouncementType.Campaign:\n return (\n <CampaignContentCard\n message={message.message}\n coverImage={message.coverImage ?? \"\"}\n updateTime={message.updated_time ?? 0}\n url={message.url ?? \"\"}\n onItemClick={props.onItemClick}\n />\n );\n case AnnouncementType.Maintenance:\n return (\n <MaintenanceContentCard\n message={message.message}\n startTime={message.startTime ?? 0}\n endTime={message.endTime ?? 0}\n />\n );\n case AnnouncementType.Delisting:\n return (\n <DelistingContentCard\n message={message.message}\n updateTime={message.updated_time ?? 0}\n />\n );\n default:\n return (\n <ListingContentCard\n message={message.message}\n updateTime={message.updated_time ?? 0}\n />\n );\n }\n });\n }, [props.dataSource]);\n return <>{elements[props.current]}</>;\n};\n\nexport const NotificationUI: FC<\n NotificationProps & {\n maintenanceMessage?: string;\n onItemClick: (url: string) => void;\n }\n> = (props) => {\n const [expanded, setExpanded] = useState(true);\n\n const [current, setCurrent] = useState(0);\n const len = useMemo(() => props.dataSource?.length ?? 0, [props.dataSource]);\n\n if (len === 0) {\n return null;\n }\n\n return (\n <div className=\"orderly-notification oui-w-full \">\n <NotificationHeader\n dataSource={props.dataSource ?? []}\n current={current}\n expanded={expanded}\n onExpandToggle={() => {\n setExpanded(!expanded);\n }}\n />\n <Divider className=\"oui-mx-4\" />\n <div\n className=\"oui-grid oui-transition-all oui-duration-300 oui-ease-in-out\"\n style={{\n gridTemplateRows: expanded ? \"1fr\" : \"0fr\",\n }}\n >\n {/* Inner div needs overflow-hidden and min-height-0 for grid animation to work */}\n <div className=\"oui-min-h-0 oui-overflow-hidden \">\n <div className=\"oui-px-4 oui-py-3\">\n <NotificationContent\n dataSource={props.dataSource ?? []}\n current={current}\n onItemClick={props.onItemClick}\n />\n </div>\n </div>\n </div>\n\n <NotificationFooter\n total={len}\n current={current}\n onCloseAll={props.onClose ?? (() => {})}\n onPrev={() => {\n if (current - 1 < 0) {\n return;\n }\n setCurrent(current - 1);\n }}\n onNext={() => {\n if (current + 1 >= len) {\n return;\n }\n setCurrent(current + 1);\n }}\n />\n </div>\n );\n};\n","import { FC, useMemo } from \"react\";\nimport { UTCDate } from \"@date-fns/utc\";\nimport { format, differenceInHours, differenceInMinutes } from \"date-fns\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { Flex, Text } from \"@kodiak-finance/orderly-ui\";\nimport { ArrowRightShortIcon } from \"../announcementCenter/icons\";\n\nexport const CampaignContentCard: FC<{\n message: string;\n coverImage: string;\n updateTime: number;\n url?: string | null;\n onItemClick: (url: string) => void;\n}> = ({ message, coverImage, url, onItemClick }) => {\n const { t } = useTranslation();\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-5\">\n <Text size=\"sm\" weight=\"bold\">\n {message}\n </Text>\n <div\n className=\"oui-rounded-xl oui-bg-base-9 oui-bg-cover oui-bg-center oui-bg-no-repeat\"\n style={{\n backgroundImage: `url(${coverImage})`,\n height: \"100px\",\n }}\n ></div>\n {typeof url === \"string\" &&\n url !== \"\" &&\n typeof onItemClick === \"function\" && (\n <button\n className=\"oui-flex oui-items-center oui-gap-1\"\n onClick={() => onItemClick(url)}\n >\n <Text\n size=\"xs\"\n color=\"buy\"\n className=\"oui-bg-clip-text oui-text-transparent oui-gradient-brand\"\n >\n {t(\"notification.joinNow\")}\n </Text>\n <ArrowRightShortIcon size={18} color=\"success\" />\n </button>\n )}\n </div>\n );\n};\n\nexport const MaintenanceContentCard: FC<{\n message: string;\n startTime: number;\n endTime: number;\n}> = ({ message, startTime, endTime }) => {\n const { t } = useTranslation();\n const formattedMessage = useMemo(() => {\n // Calculate duration in hours\n const hours = differenceInHours(endTime, startTime);\n\n const minutes = differenceInMinutes(endTime, startTime) - hours * 60;\n\n // Convert timestamps to UTC dates\n const startUtc = new UTCDate(startTime);\n const endUtc = new UTCDate(endTime);\n\n // Format start time as HH:mm (24-hour format) in UTC\n const startTimeFormatted = format(startUtc, \"HH:mm\");\n\n // Format end time as hh:mm a (12-hour format with AM/PM) in UTC\n const endTimeFormatted = format(endUtc, \"hh:mm a\");\n\n if (hours > 0) {\n return t(\"notification.maintenanceDuration.hours\", {\n hours: minutes > 0 ? (hours + minutes / 60).toFixed(1) : hours,\n startTimeFormatted,\n endTimeFormatted,\n });\n }\n\n return t(\"notification.maintenanceDuration.minutes\", {\n minutes,\n startTimeFormatted,\n endTimeFormatted,\n });\n }, [startTime, endTime, t]);\n\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-1\">\n <Text size=\"xs\" intensity={54}>\n {t(\"notification.recentlyUpdated\")}\n </Text>\n <Flex itemAlign={\"center\"}>\n <Text size=\"xs\" weight=\"bold\">\n {formattedMessage}\n </Text>\n </Flex>\n {message && (\n <Text size=\"2xs\" intensity={80} as=\"div\" className=\"oui-mt-2\">\n {message}\n </Text>\n )}\n </div>\n );\n};\n\nexport const DelistingContentCard: FC<{\n message: string;\n updateTime: number;\n}> = ({ message, updateTime }) => {\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-1\">\n <Text.formatted\n rule=\"date\"\n intensity={54}\n formatString=\"yyyy-MM-dd HH:mm:ss\"\n size=\"xs\"\n >\n {updateTime}\n </Text.formatted>\n <Text size=\"sm\" weight=\"bold\">\n {message}\n </Text>\n </div>\n );\n};\n\nexport const ListingContentCard: FC<{\n message: string;\n updateTime: number;\n}> = ({ message, updateTime }) => {\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-1\">\n <Text.formatted\n rule=\"date\"\n intensity={54}\n formatString=\"yyyy-MM-dd HH:mm:ss\"\n size=\"xs\"\n >\n {updateTime}\n </Text.formatted>\n <Text size=\"sm\" weight=\"bold\">\n {message}\n </Text>\n </div>\n );\n};\n","import { FC, useCallback } from \"react\";\nimport { useAnnouncementCenterScript } from \"./announcementCenter.script\";\nimport { AnnouncementCenterUI } from \"./announcementCenter.ui\";\n\nexport const AnnouncementCenterWidget: FC<{\n onRouteChange: (url: string) => void;\n}> = (props) => {\n const { dataSource, current, setCurrent } = useAnnouncementCenterScript();\n const onItemClick = useCallback(\n (url: string) => {\n if (!url) return;\n props.onRouteChange(url);\n },\n [props.onRouteChange],\n );\n return (\n <AnnouncementCenterUI\n dataSource={dataSource}\n current={current}\n setCurrent={setCurrent}\n onItemClick={onItemClick}\n />\n );\n};\n","import { useState } from \"react\";\nimport { useAnnouncement } from \"../hooks/useAnnouncement\";\n\nexport const useAnnouncementCenterScript = () => {\n const { tips } = useAnnouncement();\n const [current, setCurrent] = useState<string | number | null>(null);\n\n return {\n dataSource: tips,\n current,\n setCurrent,\n };\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport { UTCDateMini } from \"@date-fns/utc\";\nimport { format } from \"date-fns\";\nimport { produce } from \"immer\";\nimport {\n MaintenanceStatus,\n useLocalStorage,\n useMaintenanceStatus,\n useOrderlyContext,\n useQuery,\n useWS,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport {\n AnnouncementType,\n API,\n EMPTY_LIST,\n WSMessage,\n} from \"@kodiak-finance/orderly-types\";\nimport { getTimestamp } from \"@kodiak-finance/orderly-utils\";\n\nconst oneDay = 1000 * 60 * 60 * 24;\n\nconst maintentanceId = \"-1\";\n\nexport type AnnouncementOptions = {\n hideTips?: boolean;\n};\n\ninterface AnnouncementStore {\n show?: boolean;\n lastUpdateTime?: number | null;\n}\n\nconst ORDERLY_ANNOUNCEMENT_KEY = \"orderly_announcement\";\n\nconst getTimeString = (timestamp: number) => {\n const date = format(new UTCDateMini(timestamp), \"MMM dd\");\n const time = format(new UTCDateMini(timestamp), \"h:mm aa\");\n return `${time} (UTC) on ${date}`;\n};\n\nconst sortDataByUpdatedTime = (ori: API.Announcement) => {\n return produce<API.Announcement>(ori, (draft) => {\n if (Array.isArray(draft.rows)) {\n draft.rows.sort((a, b) => {\n if (a.updated_time && b.updated_time) {\n return b.updated_time - a.updated_time;\n }\n return 0;\n });\n }\n });\n};\n\nconst useAnnouncementData = () => {\n const ws = useWS();\n\n const [announcementStore, setStore] = useLocalStorage<AnnouncementStore>(\n ORDERLY_ANNOUNCEMENT_KEY,\n {},\n );\n\n const [tips, setTips] = useState<API.Announcement>({});\n\n const [maintenanceDialogInfo, setMaintenanceDialogInfo] = useState<string>();\n\n const { startTime, endTime, status, brokerName } = useMaintenanceStatus();\n\n const { t } = useTranslation();\n\n const { data: announcements } = useQuery<API.Announcement>(\n `/v2/public/announcement`,\n {\n revalidateOnFocus: false,\n refreshInterval: 60 * 60 * 1000, // refresh every 1 hour\n formatter: (data) => data,\n },\n );\n\n const getMaintentTipsContent = (\n brokerName: string,\n startDate: string,\n endDate: string,\n ) => t(\"maintenance.tips.description\", { brokerName, startDate, endDate });\n\n const getMaintentDialogContent = (brokerName: string, endDate: string) =>\n t(\"maintenance.dialog.description\", { brokerName, endDate });\n\n useEffect(() => {\n const unsubscribe = ws.subscribe(\"announcement\", {\n onMessage(message: WSMessage.Announcement) {\n if (message) {\n setTips((prev) => {\n return produce(prev, (draft) => {\n // Make sure draft.rows is an array\n if (!Array.isArray(draft.rows)) {\n draft.rows = [];\n }\n const idx = draft.rows.findIndex(\n (tip) => tip.announcement_id === message.announcement_id,\n );\n // Filter out old tips with the same id\n if (idx !== -1) {\n draft.rows.splice(idx, 1);\n }\n // Add the latest tip\n draft.rows.push({\n announcement_id: message.announcement_id,\n message: message.message,\n url: message.url,\n i18n: message.i18n,\n type: message.type,\n updated_time: message.updated_time,\n });\n });\n });\n // @ts-ignore\n setStore((prev) => ({ ...prev, show: true }));\n }\n },\n onError(err) {\n if (err instanceof Error) {\n console.error(\"Error receiving announcement:\", err.message);\n }\n },\n });\n return () => {\n unsubscribe?.();\n };\n }, [ws]);\n\n useEffect(() => {\n if (!announcements?.rows) {\n return;\n }\n const apiTime = announcements.last_updated_time ?? 0;\n const cachedTime = announcementStore.lastUpdateTime ?? 0;\n if (cachedTime < apiTime) {\n setTips((prev) => ({ ...prev, rows: announcements?.rows }));\n setStore({ show: true, lastUpdateTime: apiTime });\n } else {\n setTips((prev) => {\n return produce<API.Announcement>(prev, (draft) => {\n if (announcements?.rows?.length) {\n // If there are announcement rows available, create a Set to store IDs of existing tips\n const existingIds = new Set<string | number>(\n prev.rows?.map((tip) => tip.announcement_id),\n );\n // Find the maintenance tip in previous tips (if any)\n const maintenanceTip = prev.rows?.find(\n (tip) => tip.announcement_id === maintentanceId,\n );\n // Clear the draft’s rows array to refill it\n draft.rows = [];\n announcements.rows.forEach((item) => {\n if (!existingIds.has(item.announcement_id)) {\n // If the item’s ID is not in existingIds, push it into the draft\n draft.rows?.push(item);\n }\n });\n if (maintenanceTip) {\n // If a maintenance tip existed before, unshift it to the front\n draft.rows.unshift(maintenanceTip);\n }\n } else {\n // Find the index of the maintenance tip in draft rows\n const idx = draft.rows?.findIndex(\n (tip) => tip.announcement_id === maintentanceId,\n );\n if (idx !== undefined && idx !== -1) {\n // Remove the maintenance tip from draft rows\n draft.rows?.splice(idx, 1);\n }\n }\n });\n });\n }\n }, [announcements]);\n\n useEffect(() => {\n const startDate = startTime ? getTimeString(startTime) : \"-\";\n const endDate = endTime ? getTimeString(endTime) : \"-\";\n if (status === MaintenanceStatus.Maintenance) {\n setMaintenanceDialogInfo(getMaintentDialogContent(brokerName, endDate));\n return;\n }\n setMaintenanceDialogInfo(undefined);\n\n if (startTime && endTime) {\n // if (startTime < getTimestamp() + oneDay) {\n setTips((prev) =>\n produce<API.Announcement>(prev, (draft) => {\n // Make sure draft.rows is an array\n if (!Array.isArray(draft.rows)) {\n draft.rows = [];\n }\n // Rebuild rows: insert the latest maintenance tip first, then put the old non-maintenance ones at the end\n draft.rows = [\n {\n announcement_id: maintentanceId,\n type: AnnouncementType.Maintenance,\n /** @ts-ignore */\n startTime: startTime,\n /** @ts-ignore */\n endTime: endTime,\n message: getMaintentTipsContent(brokerName, startDate, endDate),\n },\n ...draft.rows.filter(\n (tip) => tip.type !== AnnouncementType.Maintenance,\n ),\n ];\n }),\n );\n } else {\n setTips((prev) => {\n return produce<API.Announcement>(prev, (draft) => {\n const index = draft.rows?.findIndex(\n (tip) => tip.announcement_id === maintentanceId,\n );\n if (index !== undefined && index !== -1) {\n draft.rows?.splice(index, 1);\n }\n });\n });\n }\n }, [startTime, endTime, status, brokerName, t]);\n\n const { customAnnouncements } = useAppContext();\n\n // Merge custom announcements with API announcements\n const mergedTips = useMemo(() => {\n const tipsCopy = { ...tips };\n if (customAnnouncements && customAnnouncements.length > 0) {\n // Custom announcements appear first (higher priority)\n tipsCopy.rows = [...customAnnouncements, ...(tips.rows || [])];\n }\n return sortDataByUpdatedTime(tipsCopy);\n }, [tips, customAnnouncements]);\n\n return {\n tips: mergedTips,\n maintenanceDialogInfo: maintenanceDialogInfo,\n };\n};\n\nexport type AnnouncementReturn = ReturnType<typeof useAnnouncement>;\n\nexport const useAnnouncement = (options?: AnnouncementOptions) => {\n const { showAnnouncement, setShowAnnouncement } = useAppContext();\n const { dataAdapter } = useOrderlyContext();\n\n const { tips: mergedTips, maintenanceDialogInfo } = useAnnouncementData();\n\n const memoizedTips = useMemo<API.AnnouncementRow[]>(() => {\n if (typeof dataAdapter?.announcementList === \"function\") {\n return dataAdapter.announcementList(\n mergedTips?.rows ?? (EMPTY_LIST as API.AnnouncementRow[]),\n );\n }\n return mergedTips?.rows ?? (EMPTY_LIST as API.AnnouncementRow[]);\n }, [dataAdapter?.announcementList, mergedTips?.rows]);\n\n const [announcementStore, setStore] = useLocalStorage<AnnouncementStore>(\n ORDERLY_ANNOUNCEMENT_KEY,\n {},\n );\n\n const closeTips = () => {\n // @ts-ignore\n setStore((prev) => ({ ...prev, show: false }));\n };\n\n useEffect(() => {\n const len = memoizedTips.length;\n setShowAnnouncement(\n Boolean(len) && announcementStore.show && !options?.hideTips,\n );\n }, [\n memoizedTips,\n announcementStore.show,\n options?.hideTips,\n setShowAnnouncement,\n ]);\n\n return {\n maintenanceDialogInfo,\n tips: memoizedTips,\n closeTips: closeTips,\n showAnnouncement: showAnnouncement,\n };\n};\n","import { FC } from \"react\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { AnnouncementContent } from \"../components/announcementCenter/announcementCenter.ui\";\n\nexport const AnnouncementCenterUI: FC<{\n dataSource: API.AnnouncementRow[];\n current: string | number | null;\n setCurrent: (current: string | number | null) => void;\n onItemClick: (url: string) => void;\n}> = (props) => {\n const { dataSource, current, setCurrent, onItemClick } = props;\n return (\n <div className=\"oui-m-1 oui-rounded-xl oui-bg-base-9 oui-p-2\">\n <AnnouncementContent\n dataSource={dataSource}\n current={current}\n onExpandToggle={setCurrent}\n onItemClick={onItemClick}\n showDivider\n />\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { RouterAdapter } from \"@kodiak-finance/orderly-types\";\nimport { AnnouncementCenterWidget } from \"./announcementCenter.widget\";\n\nexport const AnnouncementCenterPage: FC<{ routerAdapter?: RouterAdapter }> = (\n props,\n) => {\n return (\n <AnnouncementCenterWidget\n onRouteChange={(url: string) => {\n if (!url) return;\n props.routerAdapter?.onRouteChange({\n href: url,\n name: url,\n target: \"_blank\",\n });\n }}\n />\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/announcementCenter/announcementCenter.ui.tsx","../src/components/announcementCenter/announcementItem.tsx","../src/components/announcementCenter/icons.tsx","../src/components/notification/notification.ui.tsx","../src/components/notification/contentCard.tsx","../src/pages/announcementCenter.widget.tsx","../src/pages/announcementCenter.script.tsx","../src/hooks/useAnnouncement.ts","../src/pages/announcementCenter.ui.tsx","../src/pages/announcementCenter.page.tsx"],"names":["useTranslation","Text","cn","jsx","jsxs","Icon","useMemo","useState","AnnouncementType","ChevronDownIcon","Flex","Fragment","format","brokerName","AnnouncementCenterUI"],"mappings":";AAAA,SAAa,gBAAgB;AAC7B,SAAS,kBAAAA,uBAAsB;AAE/B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAAC;AAAA,OACK;AACP,SAAS,MAAAC,WAAU;;;ACTnB,SAAa,eAAe;AAC5B,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AACjC,SAAS,MAAM,MAAM,iBAAiB,UAAU;;;ACDhD,SAAS,YAAY;AAMb,SAQE,KARF;AAJD,IAAM,aAAgC,CAAC,UAAU;AACtD,SACE,qBAAC,QAAK,MAAM,IAAI,SAAQ,aAAa,GAAG,OACtC;AAAA,wBAAC,UACC;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,eAAc;AAAA,QAEd;AAAA,8BAAC,UAAK,WAAU,sCAAqC;AAAA,UACrD,oBAAC,UAAK,QAAO,KAAI,WAAU,wCAAuC;AAAA;AAAA;AAAA,IACpE,GACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,aAAa;AAAA,QACb,GAAE;AAAA;AAAA,IACJ;AAAA,KACF;AAEJ;AAEO,IAAM,eAAkC,CAAC,UAAU;AACxD,SACE,oBAAC,QAAK,MAAM,IAAI,SAAQ,aAAa,GAAG,OACtC;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAa;AAAA,MACb,GAAE;AAAA;AAAA,EACJ,GACF;AAEJ;AAEO,IAAM,sBAAyC,CAAC,UAAU;AAC/D,SACE,qBAAC,QAAK,MAAM,IAAI,SAAQ,aAAa,GAAG,OACtC;AAAA,wBAAC,UACC;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,eAAc;AAAA,QAEd;AAAA,8BAAC,UAAK,WAAU,sCAAqC;AAAA,UACrD,oBAAC,UAAK,QAAO,KAAI,WAAU,wCAAuC;AAAA;AAAA;AAAA,IACpE,GACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,aAAa;AAAA,QACb,GAAE;AAAA;AAAA,IACJ;AAAA,KACF;AAEJ;AAEO,IAAM,WAA8B,CAAC,UAAU;AACpD,SACE,oBAAC,QAAK,MAAM,IAAI,SAAQ,aAAa,GAAG,OACtC;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAa;AAAA,MACb,GAAE;AAAA;AAAA,EACJ,GACF;AAEJ;AAEO,IAAM,mBAAsC,CAAC,UAAU;AAC5D,SACE,oBAAC,QAAK,MAAM,IAAI,SAAQ,aAAa,GAAG,OACtC;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAa;AAAA,MACb,GAAE;AAAA;AAAA,EACJ,GACF;AAEJ;AAEO,IAAM,eAAkC,CAAC,UAAU;AACxD,SACE,qBAAC,QAAK,MAAM,IAAI,SAAQ,aAAa,GAAG,OACtC;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,MAAK;AAAA,QACL,aAAY;AAAA;AAAA,IACd;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,MAAK;AAAA,QACL,aAAY;AAAA;AAAA,IACd;AAAA,KACF;AAEJ;;;ADhCQ,SAmBE,OAAAC,MAnBF,QAAAC,aAAA;AA7DD,IAAM,mBAWR,CAAC,UAAU;AACd,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAMC,QAAO,QAAQ,MAAM;AACzB,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK,iBAAiB;AACpB,eAAO;AAAA,MAET,KAAK,iBAAiB;AACpB,eAAO;AAAA,MACT,KAAK,iBAAiB;AACpB,eAAO;AAAA,MACT,KAAK,iBAAiB;AAAA,MACtB;AACE,eAAO;AAAA,IACX;AAAA,EACF,GAAG,CAAC,MAAM,IAAI,CAAC;AAEf,QAAM,QAAQ,QAAQ,MAAM;AAC1B,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK,iBAAiB;AACpB,eAAO,EAAE,uBAAuB;AAAA,MAClC,KAAK,iBAAiB;AACpB,eAAO,EAAE,wBAAwB;AAAA,MACnC,KAAK,iBAAiB;AACpB,eAAO,EAAE,sBAAsB;AAAA,MACjC,KAAK,iBAAiB;AACpB,eAAO,EAAE,0BAA0B;AAAA,MACrC;AACE,eAAO,EAAE,sBAAsB;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;AAElB,QAAM,iBAAiB,CAAC,QAAyB;AAC/C,QAAI;AACF,YAAM,SAAS,IAAI,IAAI,KAAK,OAAO,SAAS,MAAM;AAClD,aAAO,OAAO,WAAW,OAAO,SAAS;AAAA,IAC3C,QAAQ;AAEN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,SAAS,QAAQ,MAAM;AAC3B,QACE,MAAM,SAAS,iBAAiB,YAChC,OAAO,MAAM,QAAQ,YACrB,MAAM,QAAQ,MACd,OAAO,MAAM,gBAAgB,YAC7B;AACA,aACE,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,WAAU;AAAA,UACV,WAAU;AAAA,UACV,SAAS,CAAC,UAAU;AAClB,kBAAM,gBAAgB;AAEtB,kBAAM,MAAM,MAAM;AAClB,kBAAM,aAAa,eAAe,GAAG;AAErC,gBAAI,YAAY;AAEd,qBAAO,KAAK,KAAK,UAAU,qBAAqB;AAAA,YAClD,OAAO;AAEL,oBAAM,YAAY,GAAG;AAAA,YACvB;AAAA,UACF;AAAA,UAEA;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAM;AAAA,gBACN,WAAU;AAAA,gBAET,YAAE,sBAAsB;AAAA;AAAA,YAC3B;AAAA,YACA,gBAAAA,KAAC,uBAAoB,MAAM,IAAI;AAAA;AAAA;AAAA,MACjC;AAAA,IAEJ;AACA,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,MAAM,MAAM,KAAK,CAAC,CAAC;AAE7B,QAAM,aAAa,QAAQ,MAAM;AAC/B,QAAI,MAAM,SAAS,iBAAiB,aAAa;AAC/C,aACE,gBAAAA,KAAC,QAAK,MAAK,OAAM,WAAW,IACzB,YAAE,8BAA8B,GACnC;AAAA,IAEJ;AACA,WACE,gBAAAA;AAAA,MAAC,KAAK;AAAA,MAAL;AAAA,QACC,MAAK;AAAA,QACL,WAAW;AAAA,QACX,MAAK;AAAA,QACL,cAAa;AAAA,QAEZ,gBAAM;AAAA;AAAA,IACT;AAAA,EAEJ,GAAG,CAAC,MAAM,aAAa,MAAM,MAAM,CAAC,CAAC;AAErC,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA,CAAC,MAAM,eAAe;AAAA,QACtB,CAAC,MAAM,eAAe,MAAM,YAAY;AAAA,QACxC,MAAM;AAAA,MACR;AAAA,MACA,SAAS,MAAM;AACb,cAAM,iBAAiB;AAAA,MACzB;AAAA,MAEA;AAAA,wBAAAD,KAACE,OAAA,EAAK,OAAM,SAAQ,WAAU,yBAAwB;AAAA,QAEtD,gBAAAD,MAAC,QAAK,WAAU,UAAS,WAAU,SAAQ,MAAI,MAC7C;AAAA,0BAAAD,KAAC,QAAK,MAAK,MAAK,WAAW,IAAI,QAAO,QACnC,iBACH;AAAA,UACC;AAAA,UAED,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,kBAAkB,MAAM,WAAW,QAAQ;AAAA,cAC7C;AAAA,cAEA,0BAAAC,MAAC,SAAI,WAAU,uDACb;AAAA,gCAAAD,KAAC,QAAK,MAAK,OAAM,WAAW,IAAI,IAAG,OAAM,WAAU,YAChD,gBAAM,SACT;AAAA,gBACC;AAAA,iBACH;AAAA;AAAA,UACF;AAAA,WACF;AAAA,QACA,gBAAAA,KAAC,SAAI,WAAU,YAEb,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,MAAM;AAAA,YACN,WAAW,6DACT,MAAM,WAAW,mBAAmB,cACtC;AAAA;AAAA,QACF,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;ADrJQ,SA+CJ,UA/CI,OAAAA,MA+CJ,QAAAC,aA/CI;AAbD,IAAM,sBAMR,CAAC,UAAU;AACd,QAAM,EAAE,YAAY,SAAS,gBAAgB,YAAY,IAAI;AAC7D,QAAM,EAAE,EAAE,IAAIJ,gBAAe;AAE7B,MAAI,CAAC,MAAM,QAAQ,UAAU,KAAK,WAAW,WAAW,GAAG;AACzD,WACE,gBAAAG,KAAC,SAAI,WAAU,8DACb,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,UAAU,sBAAsB;AAAA,QAChC,OAAO,EAAE,oBAAoB;AAAA;AAAA,IAC/B,GACF;AAAA,EAEJ;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAWD;AAAA,QACT;AAAA,QACA,MAAM,eACJ;AAAA,MACJ;AAAA,MAEC,qBAAW,IAAI,CAAC,SACf,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,KAAK,KAAK;AAAA,UACV;AAAA,UAEA,SAAS,KAAK;AAAA,UACd,aAAa,KAAK,gBAAgB;AAAA,UAClC,UAAU,YAAY,KAAK;AAAA,UAC3B,MAAM,KAAK;AAAA,UACX,aAAa,MAAM;AAAA,UACnB,gBAAgB,MAAM;AACpB,gBAAI,YAAY,KAAK,iBAAiB;AACpC,6BAAe,IAAI;AAAA,YACrB,OAAO;AACL,6BAAe,KAAK,eAAe;AAAA,YACrC;AAAA,UACF;AAAA;AAAA,QAZK,KAAK;AAAA,MAaZ,CACD;AAAA;AAAA,EACH;AAEJ;AAEO,IAAM,uBAGR,CAAC,UAAU;AACd,QAAM,EAAE,EAAE,IAAIH,gBAAe;AAC7B,QAAM,CAAC,UAAU,WAAW,IAAI,SAAiC,IAAI;AAErE,SACE,gBAAAI,MAAA,YACE;AAAA,oBAAAD,KAAC,SAAI,WAAU,qBACb,0BAAAA,KAACF,OAAA,EAAK,WAAW,IAAI,QAAO,QACzB,YAAE,oBAAoB,GACzB,GACF;AAAA,IAEA,gBAAAE,KAAC,cAAW,WAAU,6DACpB,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,YAAY,MAAM;AAAA,QAClB,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,aAAa,MAAM;AAAA;AAAA,IACrB,GACF;AAAA,KACF;AAEJ;;;AGzFA,SAAa,WAAAG,UAAS,YAAAC,iBAAgB;AACtC,SAAS,kBAAAP,uBAAsB;AAC/B,SAAS,oBAAAQ,yBAAkC;AAC3C;AAAA,EACE,mBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAAC;AAAA,EACA,QAAAT;AAAA,OACK;;;ACVP,SAAa,WAAAK,gBAAe;AAC5B,SAAS,eAAe;AACxB,SAAS,QAAQ,mBAAmB,2BAA2B;AAC/D,SAAS,kBAAAN,uBAAsB;AAC/B,SAAS,QAAAU,OAAM,QAAAT,aAAY;AAarB,gBAAAE,MAaI,QAAAC,aAbJ;AAVC,IAAM,sBAMR,CAAC,EAAE,SAAS,YAAY,KAAK,YAAY,MAAM;AAClD,QAAM,EAAE,EAAE,IAAIJ,gBAAe;AAC7B,SACE,gBAAAI,MAAC,SAAI,WAAU,mCACb;AAAA,oBAAAD,KAACF,OAAA,EAAK,MAAK,MAAK,QAAO,QACpB,mBACH;AAAA,IACA,gBAAAE;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,iBAAiB,OAAO,UAAU;AAAA,UAClC,QAAQ;AAAA,QACV;AAAA;AAAA,IACD;AAAA,IACA,OAAO,QAAQ,YACd,QAAQ,MACR,OAAO,gBAAgB,cACrB,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAS,MAAM,YAAY,GAAG;AAAA,QAE9B;AAAA,0BAAAD;AAAA,YAACF;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAM;AAAA,cACN,WAAU;AAAA,cAET,YAAE,sBAAsB;AAAA;AAAA,UAC3B;AAAA,UACA,gBAAAE,KAAC,uBAAoB,MAAM,IAAI,OAAM,WAAU;AAAA;AAAA;AAAA,IACjD;AAAA,KAEN;AAEJ;AAEO,IAAM,yBAIR,CAAC,EAAE,SAAS,WAAW,QAAQ,MAAM;AACxC,QAAM,EAAE,EAAE,IAAIH,gBAAe;AAC7B,QAAM,mBAAmBM,SAAQ,MAAM;AAErC,UAAM,QAAQ,kBAAkB,SAAS,SAAS;AAElD,UAAM,UAAU,oBAAoB,SAAS,SAAS,IAAI,QAAQ;AAGlE,UAAM,WAAW,IAAI,QAAQ,SAAS;AACtC,UAAM,SAAS,IAAI,QAAQ,OAAO;AAGlC,UAAM,qBAAqB,OAAO,UAAU,OAAO;AAGnD,UAAM,mBAAmB,OAAO,QAAQ,SAAS;AAEjD,QAAI,QAAQ,GAAG;AACb,aAAO,EAAE,0CAA0C;AAAA,QACjD,OAAO,UAAU,KAAK,QAAQ,UAAU,IAAI,QAAQ,CAAC,IAAI;AAAA,QACzD;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO,EAAE,4CAA4C;AAAA,MACnD;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,WAAW,SAAS,CAAC,CAAC;AAE1B,SACE,gBAAAF,MAAC,SAAI,WAAU,mCACb;AAAA,oBAAAD,KAACF,OAAA,EAAK,MAAK,MAAK,WAAW,IACxB,YAAE,8BAA8B,GACnC;AAAA,IACA,gBAAAE,KAACO,OAAA,EAAK,WAAW,UACf,0BAAAP,KAACF,OAAA,EAAK,MAAK,MAAK,QAAO,QACpB,4BACH,GACF;AAAA,IACC,WACC,gBAAAE,KAACF,OAAA,EAAK,MAAK,OAAM,WAAW,IAAI,IAAG,OAAM,WAAU,YAChD,mBACH;AAAA,KAEJ;AAEJ;AAEO,IAAM,uBAGR,CAAC,EAAE,SAAS,WAAW,MAAM;AAChC,SACE,gBAAAG,MAAC,SAAI,WAAU,mCACb;AAAA,oBAAAD;AAAA,MAACF,MAAK;AAAA,MAAL;AAAA,QACC,MAAK;AAAA,QACL,WAAW;AAAA,QACX,cAAa;AAAA,QACb,MAAK;AAAA,QAEJ;AAAA;AAAA,IACH;AAAA,IACA,gBAAAE,KAACF,OAAA,EAAK,MAAK,MAAK,QAAO,QACpB,mBACH;AAAA,KACF;AAEJ;AAEO,IAAM,qBAGR,CAAC,EAAE,SAAS,WAAW,MAAM;AAChC,SACE,gBAAAG,MAAC,SAAI,WAAU,mCACb;AAAA,oBAAAD;AAAA,MAACF,MAAK;AAAA,MAAL;AAAA,QACC,MAAK;AAAA,QACL,WAAW;AAAA,QACX,cAAa;AAAA,QACb,MAAK;AAAA,QAEJ;AAAA;AAAA,IACH;AAAA,IACA,gBAAAE,KAACF,OAAA,EAAK,MAAK,MAAK,QAAO,QACpB,mBACH;AAAA,KACF;AAEJ;;;ADnFU,SAwJD,YAAAU,WAxJC,OAAAR,MA6CJ,QAAAC,aA7CI;AAhBV,IAAM,qBAOD,CAAC,UAAU;AACd,QAAM,EAAE,EAAE,IAAIJ,gBAAe;AAC7B,QAAM,EAAE,SAAS,IAAI;AACrB,QAAM,EAAE,KAAK,IAAI,MAAM,WAAW,MAAM,OAAO;AAE/C,QAAM,QAAQM,SAAQ,MAAM;AAC1B,YAAQ,MAAM;AAAA,MACZ,KAAKE,kBAAiB;AACpB,eACE,gBAAAL;AAAA,UAACF;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YAET,YAAE,uBAAuB;AAAA;AAAA,QAC5B;AAAA,MAEJ,KAAKO,kBAAiB;AACpB,eAAO,gBAAAL,KAACF,OAAA,EAAK,MAAK,MAAM,YAAE,6BAA6B,GAAE;AAAA,MAC3D,KAAKO,kBAAiB;AACpB,eACE,gBAAAL,KAACF,OAAA,EAAK,MAAK,MAAK,OAAM,OACnB,YAAE,sBAAsB,GAC3B;AAAA,MAEJ,KAAKO,kBAAiB;AACpB,eACE,gBAAAL,KAACF,OAAA,EAAK,MAAK,MAAK,OAAM,WACnB,YAAE,+BAA+B,GACpC;AAAA,MAEJ;AACE,eACE,gBAAAE,KAACF,OAAA,EAAK,MAAK,MAAK,OAAM,WACnB,YAAE,2BAA2B,GAChC;AAAA,IAEN;AAAA,EACF,GAAG,CAAC,MAAM,CAAC,CAAC;AACZ,QAAM,OAAOK,SAAQ,MAAM;AACzB,YAAQ,MAAM;AAAA,MACZ,KAAKE,kBAAiB;AACpB,eAAO,gBAAAL,KAAC,cAAW,OAAM,SAAQ;AAAA,MAEnC,KAAKK,kBAAiB;AACpB,eAAO,gBAAAL,KAAC,YAAS,OAAM,WAAU;AAAA,MACnC,KAAKK,kBAAiB;AACpB,eAAO,gBAAAL,KAAC,gBAAa,OAAM,WAAU;AAAA,MACvC,KAAKK,kBAAiB;AAAA,MACtB;AACE,eAAO,gBAAAL,KAAC,oBAAiB,OAAM,SAAQ;AAAA,IAC3C;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AACT,SACE,gBAAAC,MAACM,OAAA,EAAK,WAAU,UAAS,SAAQ,WAAU,WAAU,qBACnD;AAAA,oBAAAN,MAAC,SAAI,WAAU,mEACZ;AAAA;AAAA,MACA;AAAA,OACH;AAAA,IACA,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,MAAM;AAAA,QACf,WAAU;AAAA,QACV,OAAO;AAAA,UACL,WAAW,CAAC,WAAW,mBAAmB;AAAA,QAC5C;AAAA,QAEA,0BAAAA,KAACM,kBAAA,EAAgB,MAAM,IAAI,OAAM,SAAQ;AAAA;AAAA,IAC3C;AAAA,KACF;AAEJ;AAEA,IAAM,qBAMD,CAAC,UAAU;AACd,QAAM,EAAE,OAAO,SAAS,YAAY,QAAQ,OAAO,IAAI;AACvD,QAAM,EAAE,EAAE,IAAIT,gBAAe;AAC7B,SACE,gBAAAI;AAAA,IAACM;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,WAAU;AAAA,MACV,SAAQ;AAAA,MAER;AAAA,wBAAAN,MAACM,OAAA,EAAK,KAAK,GACT;AAAA,0BAAAP;AAAA,YAAC;AAAA;AAAA,cACC,UAAU,UAAU,IAAI;AAAA,cACxB,SAAS;AAAA,cACT,WAAU;AAAA,cAEV,0BAAAA,KAAC,mBAAgB,MAAM,IAAI,OAAM,SAAQ;AAAA;AAAA,UAC3C;AAAA,UACA,gBAAAC,MAACH,OAAA,EAAK,WAAW,IAAI,MAAK,MACvB;AAAA,sBAAU;AAAA,YAAE;AAAA,YAAE;AAAA,aACjB;AAAA,UACA,gBAAAE;AAAA,YAAC;AAAA;AAAA,cACC,UAAU,UAAU,KAAK;AAAA,cACzB,SAAS;AAAA,cACT,WAAU;AAAA,cAEV,0BAAAA,KAAC,oBAAiB,MAAM,IAAI,OAAM,SAAQ;AAAA;AAAA,UAC5C;AAAA,WACF;AAAA,QACA,gBAAAA,KAAC,YAAO,SAAS,YACf,0BAAAA,KAACF,OAAA,EAAK,MAAK,MAAK,OAAM,WACnB,YAAE,yBAAyB,EAAE,MAAM,CAAC,GACvC,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAM,sBAOD,CAAC,UAAU;AACd,QAAM,WAAWK,SAAQ,MAAM;AAC7B,WAAO,MAAM,WAAW,IAAI,CAAC,YAAY;AACvC,YAAM,EAAE,KAAK,IAAI;AACjB,cAAQ,MAAM;AAAA,QACZ,KAAKE,kBAAiB;AACpB,iBACE,gBAAAL;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,QAAQ;AAAA,cACjB,YAAY,QAAQ,cAAc;AAAA,cAClC,YAAY,QAAQ,gBAAgB;AAAA,cACpC,KAAK,QAAQ,OAAO;AAAA,cACpB,aAAa,MAAM;AAAA;AAAA,UACrB;AAAA,QAEJ,KAAKK,kBAAiB;AACpB,iBACE,gBAAAL;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,QAAQ;AAAA,cACjB,WAAW,QAAQ,aAAa;AAAA,cAChC,SAAS,QAAQ,WAAW;AAAA;AAAA,UAC9B;AAAA,QAEJ,KAAKK,kBAAiB;AACpB,iBACE,gBAAAL;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,QAAQ;AAAA,cACjB,YAAY,QAAQ,gBAAgB;AAAA;AAAA,UACtC;AAAA,QAEJ;AACE,iBACE,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,QAAQ;AAAA,cACjB,YAAY,QAAQ,gBAAgB;AAAA;AAAA,UACtC;AAAA,MAEN;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,MAAM,UAAU,CAAC;AACrB,SAAO,gBAAAA,KAAAQ,WAAA,EAAG,mBAAS,MAAM,OAAO,GAAE;AACpC;AAEO,IAAM,iBAKT,CAAC,UAAU;AACb,QAAM,CAAC,UAAU,WAAW,IAAIJ,UAAS,IAAI;AAE7C,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,CAAC;AACxC,QAAM,MAAMD,SAAQ,MAAM,MAAM,YAAY,UAAU,GAAG,CAAC,MAAM,UAAU,CAAC;AAE3E,MAAI,QAAQ,GAAG;AACb,WAAO;AAAA,EACT;AAEA,SACE,gBAAAF,MAAC,SAAI,WAAU,oCACb;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,YAAY,MAAM,cAAc,CAAC;AAAA,QACjC;AAAA,QACA;AAAA,QACA,gBAAgB,MAAM;AACpB,sBAAY,CAAC,QAAQ;AAAA,QACvB;AAAA;AAAA,IACF;AAAA,IACA,gBAAAA,KAAC,WAAQ,WAAU,YAAW;AAAA,IAC9B,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,kBAAkB,WAAW,QAAQ;AAAA,QACvC;AAAA,QAGA,0BAAAA,KAAC,SAAI,WAAU,oCACb,0BAAAA,KAAC,SAAI,WAAU,qBACb,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,YAAY,MAAM,cAAc,CAAC;AAAA,YACjC;AAAA,YACA,aAAa,MAAM;AAAA;AAAA,QACrB,GACF,GACF;AAAA;AAAA,IACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP;AAAA,QACA,YAAY,MAAM,YAAY,MAAM;AAAA,QAAC;AAAA,QACrC,QAAQ,MAAM;AACZ,cAAI,UAAU,IAAI,GAAG;AACnB;AAAA,UACF;AACA,qBAAW,UAAU,CAAC;AAAA,QACxB;AAAA,QACA,QAAQ,MAAM;AACZ,cAAI,UAAU,KAAK,KAAK;AACtB;AAAA,UACF;AACA,qBAAW,UAAU,CAAC;AAAA,QACxB;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;AEvRA,SAAa,mBAAmB;;;ACAhC,SAAS,YAAAI,iBAAgB;;;ACAzB,SAAS,WAAW,WAAAD,UAAS,YAAAC,iBAAgB;AAC7C,SAAS,mBAAmB;AAC5B,SAAS,UAAAK,eAAc;AACvB,SAAS,eAAe;AACxB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAAZ,uBAAsB;AAC/B,SAAS,qBAAqB;AAC9B;AAAA,EACE,oBAAAQ;AAAA,EAEA;AAAA,OAEK;AAGP,IAAM,SAAS,MAAO,KAAK,KAAK;AAEhC,IAAM,iBAAiB;AAWvB,IAAM,2BAA2B;AAEjC,IAAM,gBAAgB,CAAC,cAAsB;AAC3C,QAAM,OAAOI,QAAO,IAAI,YAAY,SAAS,GAAG,QAAQ;AACxD,QAAM,OAAOA,QAAO,IAAI,YAAY,SAAS,GAAG,SAAS;AACzD,SAAO,GAAG,IAAI,aAAa,IAAI;AACjC;AAEA,IAAM,wBAAwB,CAAC,QAA0B;AACvD,SAAO,QAA0B,KAAK,CAAC,UAAU;AAC/C,QAAI,MAAM,QAAQ,MAAM,IAAI,GAAG;AAC7B,YAAM,KAAK,KAAK,CAAC,GAAG,MAAM;AACxB,YAAI,EAAE,gBAAgB,EAAE,cAAc;AACpC,iBAAO,EAAE,eAAe,EAAE;AAAA,QAC5B;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEA,IAAM,sBAAsB,MAAM;AAChC,QAAM,KAAK,MAAM;AAEjB,QAAM,CAAC,mBAAmB,QAAQ,IAAI;AAAA,IACpC;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,CAAC,MAAM,OAAO,IAAIL,UAA2B,CAAC,CAAC;AAErD,QAAM,CAAC,uBAAuB,wBAAwB,IAAIA,UAAiB;AAE3E,QAAM,EAAE,WAAW,SAAS,QAAQ,WAAW,IAAI,qBAAqB;AAExE,QAAM,EAAE,EAAE,IAAIP,gBAAe;AAE7B,QAAM,EAAE,MAAM,cAAc,IAAI;AAAA,IAC9B;AAAA,IACA;AAAA,MACE,mBAAmB;AAAA,MACnB,iBAAiB,KAAK,KAAK;AAAA;AAAA,MAC3B,WAAW,CAAC,SAAS;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,yBAAyB,CAC7Ba,aACA,WACA,YACG,EAAE,gCAAgC,EAAE,YAAAA,aAAY,WAAW,QAAQ,CAAC;AAEzE,QAAM,2BAA2B,CAACA,aAAoB,YACpD,EAAE,kCAAkC,EAAE,YAAAA,aAAY,QAAQ,CAAC;AAE7D,YAAU,MAAM;AACd,UAAM,cAAc,GAAG,UAAU,gBAAgB;AAAA,MAC/C,UAAU,SAAiC;AACzC,YAAI,SAAS;AACX,kBAAQ,CAAC,SAAS;AAChB,mBAAO,QAAQ,MAAM,CAAC,UAAU;AAE9B,kBAAI,CAAC,MAAM,QAAQ,MAAM,IAAI,GAAG;AAC9B,sBAAM,OAAO,CAAC;AAAA,cAChB;AACA,oBAAM,MAAM,MAAM,KAAK;AAAA,gBACrB,CAAC,QAAQ,IAAI,oBAAoB,QAAQ;AAAA,cAC3C;AAEA,kBAAI,QAAQ,IAAI;AACd,sBAAM,KAAK,OAAO,KAAK,CAAC;AAAA,cAC1B;AAEA,oBAAM,KAAK,KAAK;AAAA,gBACd,iBAAiB,QAAQ;AAAA,gBACzB,SAAS,QAAQ;AAAA,gBACjB,KAAK,QAAQ;AAAA,gBACb,MAAM,QAAQ;AAAA,gBACd,MAAM,QAAQ;AAAA,gBACd,cAAc,QAAQ;AAAA,cACxB,CAAC;AAAA,YACH,CAAC;AAAA,UACH,CAAC;AAED,mBAAS,CAAC,UAAU,EAAE,GAAG,MAAM,MAAM,KAAK,EAAE;AAAA,QAC9C;AAAA,MACF;AAAA,MACA,QAAQ,KAAK;AACX,YAAI,eAAe,OAAO;AAAA,QAE1B;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO,MAAM;AACX,oBAAc;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,EAAE,CAAC;AAEP,YAAU,MAAM;AACd,QAAI,CAAC,eAAe,MAAM;AACxB;AAAA,IACF;AACA,UAAM,UAAU,cAAc,qBAAqB;AACnD,UAAM,aAAa,kBAAkB,kBAAkB;AACvD,QAAI,aAAa,SAAS;AACxB,cAAQ,CAAC,UAAU,EAAE,GAAG,MAAM,MAAM,eAAe,KAAK,EAAE;AAC1D,eAAS,EAAE,MAAM,MAAM,gBAAgB,QAAQ,CAAC;AAAA,IAClD,OAAO;AACL,cAAQ,CAAC,SAAS;AAChB,eAAO,QAA0B,MAAM,CAAC,UAAU;AAChD,cAAI,eAAe,MAAM,QAAQ;AAE/B,kBAAM,cAAc,IAAI;AAAA,cACtB,KAAK,MAAM,IAAI,CAAC,QAAQ,IAAI,eAAe;AAAA,YAC7C;AAEA,kBAAM,iBAAiB,KAAK,MAAM;AAAA,cAChC,CAAC,QAAQ,IAAI,oBAAoB;AAAA,YACnC;AAEA,kBAAM,OAAO,CAAC;AACd,0BAAc,KAAK,QAAQ,CAAC,SAAS;AACnC,kBAAI,CAAC,YAAY,IAAI,KAAK,eAAe,GAAG;AAE1C,sBAAM,MAAM,KAAK,IAAI;AAAA,cACvB;AAAA,YACF,CAAC;AACD,gBAAI,gBAAgB;AAElB,oBAAM,KAAK,QAAQ,cAAc;AAAA,YACnC;AAAA,UACF,OAAO;AAEL,kBAAM,MAAM,MAAM,MAAM;AAAA,cACtB,CAAC,QAAQ,IAAI,oBAAoB;AAAA,YACnC;AACA,gBAAI,QAAQ,UAAa,QAAQ,IAAI;AAEnC,oBAAM,MAAM,OAAO,KAAK,CAAC;AAAA,YAC3B;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,YAAU,MAAM;AACd,UAAM,YAAY,YAAY,cAAc,SAAS,IAAI;AACzD,UAAM,UAAU,UAAU,cAAc,OAAO,IAAI;AACnD,QAAI,WAAW,kBAAkB,aAAa;AAC5C,+BAAyB,yBAAyB,YAAY,OAAO,CAAC;AACtE;AAAA,IACF;AACA,6BAAyB,MAAS;AAElC,QAAI,aAAa,SAAS;AAExB;AAAA,QAAQ,CAAC,SACP,QAA0B,MAAM,CAAC,UAAU;AAEzC,cAAI,CAAC,MAAM,QAAQ,MAAM,IAAI,GAAG;AAC9B,kBAAM,OAAO,CAAC;AAAA,UAChB;AAEA,gBAAM,OAAO;AAAA,YACX;AAAA,cACE,iBAAiB;AAAA,cACjB,MAAML,kBAAiB;AAAA;AAAA,cAEvB;AAAA;AAAA,cAEA;AAAA,cACA,SAAS,uBAAuB,YAAY,WAAW,OAAO;AAAA,YAChE;AAAA,YACA,GAAG,MAAM,KAAK;AAAA,cACZ,CAAC,QAAQ,IAAI,SAASA,kBAAiB;AAAA,YACzC;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AACL,cAAQ,CAAC,SAAS;AAChB,eAAO,QAA0B,MAAM,CAAC,UAAU;AAChD,gBAAM,QAAQ,MAAM,MAAM;AAAA,YACxB,CAAC,QAAQ,IAAI,oBAAoB;AAAA,UACnC;AACA,cAAI,UAAU,UAAa,UAAU,IAAI;AACvC,kBAAM,MAAM,OAAO,OAAO,CAAC;AAAA,UAC7B;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,WAAW,SAAS,QAAQ,YAAY,CAAC,CAAC;AAE9C,QAAM,EAAE,oBAAoB,IAAI,cAAc;AAG9C,QAAM,aAAaF,SAAQ,MAAM;AAC/B,UAAM,WAAW,EAAE,GAAG,KAAK;AAC3B,QAAI,uBAAuB,oBAAoB,SAAS,GAAG;AAEzD,eAAS,OAAO,CAAC,GAAG,qBAAqB,GAAI,KAAK,QAAQ,CAAC,CAAE;AAAA,IAC/D;AACA,WAAO,sBAAsB,QAAQ;AAAA,EACvC,GAAG,CAAC,MAAM,mBAAmB,CAAC;AAE9B,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,EACF;AACF;AAIO,IAAM,kBAAkB,CAAC,YAAkC;AAChE,QAAM,EAAE,kBAAkB,oBAAoB,IAAI,cAAc;AAChE,QAAM,EAAE,YAAY,IAAI,kBAAkB;AAE1C,QAAM,EAAE,MAAM,YAAY,sBAAsB,IAAI,oBAAoB;AAExE,QAAM,eAAeA,SAA+B,MAAM;AACxD,QAAI,OAAO,aAAa,qBAAqB,YAAY;AACvD,aAAO,YAAY;AAAA,QACjB,YAAY,QAAS;AAAA,MACvB;AAAA,IACF;AACA,WAAO,YAAY,QAAS;AAAA,EAC9B,GAAG,CAAC,aAAa,kBAAkB,YAAY,IAAI,CAAC;AAEpD,QAAM,CAAC,mBAAmB,QAAQ,IAAI;AAAA,IACpC;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,YAAY,MAAM;AAEtB,aAAS,CAAC,UAAU,EAAE,GAAG,MAAM,MAAM,MAAM,EAAE;AAAA,EAC/C;AAEA,YAAU,MAAM;AACd,UAAM,MAAM,aAAa;AACzB;AAAA,MACE,QAAQ,GAAG,KAAK,kBAAkB,QAAQ,CAAC,SAAS;AAAA,IACtD;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA,kBAAkB;AAAA,IAClB,SAAS;AAAA,IACT;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACF;;;ADjSO,IAAM,8BAA8B,MAAM;AAC/C,QAAM,EAAE,KAAK,IAAI,gBAAgB;AACjC,QAAM,CAAC,SAAS,UAAU,IAAIC,UAAiC,IAAI;AAEnE,SAAO;AAAA,IACL,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AACF;;;AECM,gBAAAJ,YAAA;AATC,IAAMW,wBAKR,CAAC,UAAU;AACd,QAAM,EAAE,YAAY,SAAS,YAAY,YAAY,IAAI;AACzD,SACE,gBAAAX,KAAC,SAAI,WAAU,gDACb,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,MAChB;AAAA,MACA,aAAW;AAAA;AAAA,EACb,GACF;AAEJ;;;AHNI,gBAAAA,YAAA;AAZG,IAAM,2BAER,CAAC,UAAU;AACd,QAAM,EAAE,YAAY,SAAS,WAAW,IAAI,4BAA4B;AACxE,QAAM,cAAc;AAAA,IAClB,CAAC,QAAgB;AACf,UAAI,CAAC;AAAK;AACV,YAAM,cAAc,GAAG;AAAA,IACzB;AAAA,IACA,CAAC,MAAM,aAAa;AAAA,EACtB;AACA,SACE,gBAAAA;AAAA,IAACW;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;;;AIfI,gBAAAX,YAAA;AAJG,IAAM,yBAAgE,CAC3E,UACG;AACH,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAe,CAAC,QAAgB;AAC9B,YAAI,CAAC;AAAK;AACV,cAAM,eAAe,cAAc;AAAA,UACjC,MAAM;AAAA,UACN,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA,EACF;AAEJ","sourcesContent":["import { FC, useState } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { type API } from \"@kodiak-finance/orderly-types\";\nimport {\n ExtensionPositionEnum,\n ExtensionSlot,\n ScrollArea,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\nimport { AnnouncementItem } from \"./announcementItem\";\n\nexport const AnnouncementContent: FC<{\n dataSource: API.AnnouncementRow[];\n current: string | number | null;\n onExpandToggle: (id: string | number | null) => void;\n onItemClick: (url: string) => void;\n showDivider?: boolean;\n}> = (props) => {\n const { dataSource, current, onExpandToggle, onItemClick } = props;\n const { t } = useTranslation();\n\n if (!Array.isArray(dataSource) || dataSource.length === 0) {\n return (\n <div className=\"oui-flex oui-h-[160px] oui-items-center oui-justify-center\">\n <ExtensionSlot\n position={ExtensionPositionEnum.EmptyDataIdentifier}\n title={t(\"notification.empty\")}\n />\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"oui-flex oui-flex-col oui-space-y-1\",\n props.showDivider &&\n \"[&>*:not(:first-child)]:oui-border-t [&>*:not(:first-child)]:oui-border-line-12 [&>*:not(:first-child)]:oui-pt-1\",\n )}\n >\n {dataSource.map((item) => (\n <AnnouncementItem\n url={item.url}\n onItemClick={onItemClick}\n key={item.announcement_id}\n message={item.message}\n updatedTime={item.updated_time ?? 0}\n expanded={current === item.announcement_id}\n type={item.type}\n showDivider={props.showDivider}\n onExpandToggle={() => {\n if (current === item.announcement_id) {\n onExpandToggle(null);\n } else {\n onExpandToggle(item.announcement_id);\n }\n }}\n />\n ))}\n </div>\n );\n};\n\nexport const AnnouncementCenterUI: FC<{\n dataSource: API.AnnouncementRow[];\n onItemClick: (url: string) => void;\n}> = (props) => {\n const { t } = useTranslation();\n const [expanded, setExpanded] = useState<string | number | null>(null);\n\n return (\n <>\n <div className=\"oui-px-5 oui-pt-4\">\n <Text intensity={80} weight=\"bold\">\n {t(\"notification.title\")}\n </Text>\n </div>\n\n <ScrollArea className=\"oui-flex oui-h-[300px] oui-flex-col oui-space-y-1 oui-p-3\">\n <AnnouncementContent\n dataSource={props.dataSource}\n current={expanded}\n onExpandToggle={setExpanded}\n onItemClick={props.onItemClick}\n />\n </ScrollArea>\n </>\n );\n};\n","import { FC, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { AnnouncementType } from \"@kodiak-finance/orderly-types\";\nimport { Flex, Text, ChevronDownIcon, cn } from \"@kodiak-finance/orderly-ui\";\nimport {\n AnnouncementIcon,\n ArrowRightShortIcon,\n CampaignIcon,\n FundIcon,\n SecurityIcon,\n} from \"./icons\";\n\nexport const AnnouncementItem: FC<{\n // title: string;\n expanded: boolean;\n url?: string | null;\n onItemClick: (url: string) => void;\n onExpandToggle?: () => void;\n type: AnnouncementType | undefined | null;\n message: string;\n updatedTime: number;\n className?: string;\n showDivider?: boolean;\n}> = (props) => {\n const { t } = useTranslation();\n const Icon = useMemo(() => {\n switch (props.type) {\n case AnnouncementType.Campaign:\n return CampaignIcon;\n\n case AnnouncementType.Listing:\n return FundIcon;\n case AnnouncementType.Maintenance:\n return SecurityIcon;\n case AnnouncementType.Delisting:\n default:\n return AnnouncementIcon;\n }\n }, [props.type]);\n\n const title = useMemo(() => {\n switch (props.type) {\n case AnnouncementType.Campaign:\n return t(\"notification.campaign\");\n case AnnouncementType.Delisting:\n return t(\"notification.delisting\");\n case AnnouncementType.Listing:\n return t(\"notification.listing\");\n case AnnouncementType.Maintenance:\n return t(\"notification.maintenance\");\n default:\n return t(\"notification.general\");\n }\n }, [props.type, t]);\n\n const isExternalLink = (url: string): boolean => {\n try {\n const urlObj = new URL(url, window.location.origin);\n return urlObj.origin !== window.location.origin;\n } catch {\n // If URL parsing fails, treat as internal link (relative path)\n return false;\n }\n };\n\n const action = useMemo(() => {\n if (\n props.type === AnnouncementType.Campaign &&\n typeof props.url === \"string\" &&\n props.url !== \"\" &&\n typeof props.onItemClick === \"function\"\n ) {\n return (\n <Flex\n gap={1}\n itemAlign=\"center\"\n className=\"oui-cursor-pointer\"\n onClick={(event) => {\n event.stopPropagation();\n\n const url = props.url!;\n const isExternal = isExternalLink(url);\n\n if (isExternal) {\n // Open external links in a new tab\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n } else {\n // Open internal links in the same tab via the handler\n props.onItemClick(url);\n }\n }}\n >\n <Text\n size=\"xs\"\n color=\"buy\"\n className=\"oui-bg-clip-text oui-text-transparent oui-gradient-brand\"\n >\n {t(\"notification.joinNow\")}\n </Text>\n <ArrowRightShortIcon size={18} />\n </Flex>\n );\n }\n return null;\n }, [props.type, props.url, t]);\n\n const updateTime = useMemo(() => {\n if (props.type === AnnouncementType.Maintenance) {\n return (\n <Text size=\"2xs\" intensity={36}>\n {t(\"notification.recentlyUpdated\")}\n </Text>\n );\n }\n return (\n <Text.formatted\n size=\"2xs\"\n intensity={36}\n rule=\"date\"\n formatString=\"yyyy-MM-dd HH:mm:ss\"\n >\n {props.updatedTime}\n </Text.formatted>\n );\n }, [props.updatedTime, props.type, t]);\n\n return (\n <Flex\n gap={2}\n itemAlign=\"start\"\n className={cn(\n \"oui-px-2 oui-py-[6px] oui-text-base-contrast-80\",\n !props.showDivider && \"oui-rounded-md hover:oui-bg-base-6\",\n !props.showDivider && props.expanded && \"oui-bg-base-6\",\n props.className,\n )}\n onClick={() => {\n props.onExpandToggle?.();\n }}\n >\n <Icon color=\"white\" className=\"oui-mt-3 oui-shrink-0\" />\n\n <Flex direction=\"column\" itemAlign=\"start\" grow>\n <Text size=\"xs\" intensity={80} weight=\"bold\">\n {title}\n </Text>\n {updateTime}\n {/* Expandable content with animation */}\n <div\n className=\"oui-grid oui-transition-all oui-duration-300 oui-ease-in-out\"\n style={{\n gridTemplateRows: props.expanded ? \"1fr\" : \"0fr\",\n }}\n >\n <div className=\"oui-flex oui-flex-col oui-gap-2 oui-overflow-hidden\">\n <Text size=\"2xs\" intensity={80} as=\"div\" className=\"oui-pt-2\">\n {props.message}\n </Text>\n {action}\n </div>\n </div>\n </Flex>\n <div className=\"oui-pt-3\">\n {/* Chevron icon with rotation animation */}\n <ChevronDownIcon\n color=\"white\"\n size={18}\n className={`oui-transition-transform oui-duration-300 oui-ease-in-out ${\n props.expanded ? \"oui-rotate-180\" : \"oui-rotate-0\"\n }`}\n />\n </div>\n </Flex>\n );\n};\n","import { FC } from \"react\";\nimport type { BaseIconProps } from \"@kodiak-finance/orderly-ui\";\nimport { Icon } from \"@kodiak-finance/orderly-ui\";\n\nexport const BattleIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <defs>\n <linearGradient\n id=\"paint0_linear_555_7374\"\n x1=\"17.0157\"\n y1=\"9.26513\"\n x2=\"0.969849\"\n y2=\"9.26513\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"rgb(var(--oui-gradient-brand-end))\" />\n <stop offset=\"1\" stopColor=\"rgb(var(--oui-gradient-brand-start))\" />\n </linearGradient>\n </defs>\n <path\n fill=\"url(#paint0_linear_555_7374)\"\n fillOpacity={1}\n d=\"m1.5 1.5.75 3 4.843 4.56-1.808 1.919-.63-.633-1.06 1.06.665.665-1.88 1.996-.35-.346-1.06 1.06 2.25 2.25 1.06-1.06-.348-.349 1.998-1.878.665.662 1.06-1.06-.63-.63L9 10.852l1.969 1.854-.639.639 1.06 1.06.672-.67 1.998 1.877-.358.358 1.064 1.06 2.25-2.25-1.06-1.06-.34.34-1.881-1.998.656-.657-1.06-1.06-.625.624-1.799-1.91.003-.003L9 7.03 4.5 2.25zm15 0-3 .75-3.636 3.861 2.022 2.025L15.75 4.5z\"\n />\n </Icon>\n );\n};\n\nexport const CampaignIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <path\n fill=\"currentcolor\"\n fillOpacity={1}\n d=\"m1.5 1.5.75 3 4.843 4.56-1.808 1.919-.63-.633-1.06 1.06.665.665-1.88 1.996-.35-.346-1.06 1.06 2.25 2.25 1.06-1.06-.348-.349 1.998-1.878.665.662 1.06-1.06-.63-.63L9 10.852l1.969 1.854-.639.639 1.06 1.06.672-.67 1.998 1.877-.358.358 1.064 1.06 2.25-2.25-1.06-1.06-.34.34-1.881-1.998.656-.657-1.06-1.06-.625.624-1.799-1.91.003-.003L9 7.03 4.5 2.25zm15 0-3 .75-3.636 3.861 2.022 2.025L15.75 4.5z\"\n />\n </Icon>\n );\n};\n\nexport const ArrowRightShortIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <defs>\n <linearGradient\n id=\"paint0_linear_555_7374\"\n x1=\"17.0157\"\n y1=\"9.26513\"\n x2=\"0.969849\"\n y2=\"9.26513\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"rgb(var(--oui-gradient-brand-end))\" />\n <stop offset=\"1\" stopColor=\"rgb(var(--oui-gradient-brand-start))\" />\n </linearGradient>\n </defs>\n <path\n fill=\"url(#paint0_linear_555_7374)\"\n fillOpacity={1}\n d=\"M4.509 8.995a.75.75 0 0 1 .75-.75h5.666L8.7 5.998l1.054-1.054 3.535 3.512c.147.146.22.343.22.54a.76.76 0 0 1-.22.537l-3.535 3.512L8.7 11.992l2.225-2.248H5.258a.75.75 0 0 1-.749-.75\"\n />\n </Icon>\n );\n};\n\nexport const FundIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <path\n fill=\"currentcolor\"\n fillOpacity={0.8}\n d=\"M15.694 7.087c-.788-.393-1.857-.618-2.925-.618-1.125 0-2.138.225-2.925.618-.056 0-.113.057-.113.057V3.769c0-.9-.731-1.575-1.462-1.913-.788-.394-1.857-.619-2.925-.619-1.069 0-2.25.225-3.038.62C1.575 2.193.844 2.868.844 3.768v10.519c0 .9.731 1.575 1.462 1.912.788.394 1.856.619 2.925.619s2.138-.225 2.925-.619c.281-.169.563-.337.788-.562.225.225.506.393.787.562.788.394 1.857.619 2.925.619 1.125 0 2.138-.225 2.925-.619.732-.394 1.463-1.012 1.463-1.912V9c.112-.9-.619-1.519-1.35-1.913m-7.369 7.144c0 .113-.112.45-.731.732-.563.28-1.407.506-2.363.506s-1.8-.169-2.362-.506c-.619-.282-.731-.62-.731-.732V13.5c.056 0 .112 0 .168.056.788.394 1.856.619 2.925.619s2.138-.225 2.925-.619c.056 0 .113-.056.113-.056v.731zm0-2.587c0 .112-.112.45-.731.731-.563.281-1.407.506-2.363.506s-1.8-.168-2.362-.506c-.619-.281-.731-.619-.731-.731v-.788c.056 0 .112.056.112.056.788.394 1.856.62 2.925.62s2.138-.226 2.925-.62c.056 0 .113-.056.113-.056v.788zm0-2.644c0 .112-.112.45-.731.731-.563.281-1.407.507-2.363.507s-1.8-.17-2.362-.507C2.25 9.45 2.138 9.112 2.138 9v-.788c.056 0 .112.057.112.057.788.393 1.856.618 2.925.618S7.313 8.662 8.1 8.27c.056 0 .113-.057.113-.057V9zm0-2.644c0 .113-.112.45-.731.731-.563.282-1.407.507-2.363.507s-1.8-.169-2.362-.507c-.619-.28-.731-.618-.731-.73v-.732c.056 0 .112 0 .168.056.788.394 1.856.619 2.925.619s2.138-.225 2.925-.619c.056 0 .113-.056.113-.056v.731zM7.594 4.5c-.563.281-1.407.506-2.363.506S3.488 4.781 2.925 4.5c-.619-.338-.731-.619-.731-.731 0-.113.112-.45.731-.732.563-.28 1.406-.506 2.363-.506.956 0 1.8.169 2.362.506.619.282.731.62.731.732-.056.112-.168.393-.787.731m8.212 9.731c0 .113-.112.45-.731.732-.562.28-1.406.506-2.362.506s-1.8-.169-2.363-.506c-.619-.282-.731-.62-.731-.732V13.5c.056 0 .112.056.112.056.788.394 1.857.619 2.925.619 1.125 0 2.138-.225 2.925-.619.056 0 .113-.056.113-.056v.731zm0-2.587c0 .112-.112.45-.731.731-.562.281-1.406.506-2.362.506s-1.8-.168-2.363-.506c-.619-.281-.731-.619-.731-.731v-.788c.056 0 .112.056.112.056.788.394 1.857.62 2.925.62 1.125 0 2.138-.226 2.925-.62.056 0 .113-.056.113-.056v.788zm-.675-1.913c-.562.281-1.406.507-2.362.507s-1.8-.17-2.363-.507c-.619-.281-.731-.619-.731-.731 0-.113.112-.45.731-.731.563-.282 1.406-.507 2.363-.507.956 0 1.8.17 2.362.507.619.281.732.618.732.731-.057.112-.17.45-.732.731\"\n />\n </Icon>\n );\n};\n\nexport const AnnouncementIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <path\n fill=\"currentcolor\"\n fillOpacity={0.8}\n d=\"M11.53 2.255a.745.745 0 0 0-.82.165c-.525.524-1.188.959-1.947 1.284-.77.33-2.353.757-3.508.75-2.248-.015-3.756 1.259-3.756 3.726 0 2.163 1.228 3.42 2.994 3.703l.006 1.565a2.25 2.25 0 0 0 2.25 2.247c1.142 0 2.083-.883 2.228-1.988.007-.053.022-.26.022-1.01.674.315 1.232.812 1.711 1.29.473.472 1.29.13 1.29-.538 0-.678-.004-1.906-.004-3.13.884-.327 1.503-1.165 1.503-2.115s-.585-1.81-1.496-2.129c0-1.225-.004-2.439-.004-3.117a.76.76 0 0 0-.469-.703m1.805 1.335a.73.73 0 0 0-.445.351.75.75 0 0 0 .258 1.03 3.74 3.74 0 0 1 1.851 3.233 3.74 3.74 0 0 1-1.851 3.231.76.76 0 0 0-.282 1.03.754.754 0 0 0 1.032.258 5.24 5.24 0 0 0 2.601-4.52 5.24 5.24 0 0 0-2.601-4.519.74.74 0 0 0-.563-.094m-2.832.884c0 .694-.004 1.417-.004 2.231v2.997c0 .815.003 1.508.003 2.202-1.52-.896-3.085-1.294-4.501-1.421 0-1.144-.004-3.406-.004-4.584.147-.007.318-.026.565-.06a11.2 11.2 0 0 0 2.812-.773c.43-.184.75-.35 1.129-.592m-6.005 1.55-.001 4.34c-.976-.27-1.498-.959-1.498-2.184 0-1.21.47-1.928 1.499-2.155M6 11.998c.238.008 1.098.161 1.493.261l.007 1.19a.75.75 0 0 1-1.5 0z\"\n />\n </Icon>\n );\n};\n\nexport const SecurityIcon: FC<BaseIconProps> = (props) => {\n return (\n <Icon size={18} viewBox=\"0 0 18 18\" {...props}>\n <path\n d=\"M6.563 7.678V6.603c0-1.153 1.09-2.088 2.437-2.088s2.438.935 2.438 2.088v1.075c.448 0 .812.311.812.696v3.479c0 .384-.364.696-.812.696H6.563c-.449 0-.813-.312-.813-.696v-3.48c0-.384.364-.695.813-.695m1.187-.006 1.431.006h1.07V6.564c0-.64-.504-1.104-1.25-1.104-.748 0-1.25.465-1.25 1.104zm1.956 2.14c0-.335-.317-.605-.706-.605-.39 0-.706.27-.706.604v.77c0 .335.316.605.706.605s.706-.27.706-.604z\"\n fill=\"currentcolor\"\n fillOpacity=\".8\"\n />\n <path\n d=\"M2 3.607c.003 5.606.146 11.651 6.879 13.378.078.02.164.02.242 0C15.854 15.258 15.997 9.213 16 3.607c0-.217-.14-.41-.345-.477L9.31 1.05a1 1 0 0 0-.62 0L2.345 3.13A.5.5 0 0 0 2 3.607m2.326 7.63c-.707-1.954-.81-4.33-.824-6.902L9 2.532l5.498 1.803c-.014 2.573-.117 4.948-.824 6.901-.697 1.93-1.987 3.463-4.674 4.222-2.687-.759-3.977-2.293-4.674-4.222\"\n fill=\"currentcolor\"\n fillOpacity=\".8\"\n />\n </Icon>\n );\n};\n","import { FC, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { AnnouncementType, type API } from \"@kodiak-finance/orderly-types\";\nimport {\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n Divider,\n Flex,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport {\n AnnouncementIcon,\n BattleIcon,\n FundIcon,\n SecurityIcon,\n} from \"../announcementCenter/icons\";\nimport {\n CampaignContentCard,\n DelistingContentCard,\n ListingContentCard,\n MaintenanceContentCard,\n} from \"./contentCard\";\n\nexport interface NotificationProps {\n // Define your notification props here\n className?: string;\n // children?: React.ReactNode;\n dataSource: API.AnnouncementRow[];\n onClose?: () => void;\n}\n\nexport interface NotificationItemProps {\n id: string;\n type?: \"success\" | \"error\" | \"warning\" | \"info\";\n title?: string;\n message: string;\n onClose?: () => void;\n}\n\nexport interface NotificationListProps {\n notifications: NotificationItemProps[];\n onRemove?: (id: string) => void;\n}\n\nconst NotificationHeader: FC<{\n // type: AnnouncementType;\n dataSource: API.AnnouncementRow[];\n current: number;\n expanded?: boolean;\n onExpandToggle?: () => void;\n // onClose?: () => void;\n}> = (props) => {\n const { t } = useTranslation();\n const { expanded } = props;\n const { type } = props.dataSource[props.current];\n\n const title = useMemo(() => {\n switch (type) {\n case AnnouncementType.Campaign:\n return (\n <Text\n size=\"sm\"\n className=\"oui-text-transparent oui-bg-clip-text oui-gradient-brand\"\n >\n {t(\"notification.campaign\")}\n </Text>\n );\n case AnnouncementType.Delisting:\n return <Text size=\"sm\">{t(\"notification.delistingTitle\")}</Text>;\n case AnnouncementType.Listing:\n return (\n <Text size=\"sm\" color=\"buy\">\n {t(\"notification.listing\")}\n </Text>\n );\n case AnnouncementType.Maintenance:\n return (\n <Text size=\"sm\" color=\"warning\">\n {t(\"notification.maintenanceTitle\")}\n </Text>\n );\n default:\n return (\n <Text size=\"sm\" color=\"inherit\">\n {t(\"notification.generalTitle\")}\n </Text>\n );\n }\n }, [type, t]);\n const icon = useMemo(() => {\n switch (type) {\n case AnnouncementType.Campaign:\n return <BattleIcon color=\"white\" />;\n\n case AnnouncementType.Listing:\n return <FundIcon color=\"success\" />;\n case AnnouncementType.Maintenance:\n return <SecurityIcon color=\"warning\" />;\n case AnnouncementType.Delisting:\n default:\n return <AnnouncementIcon color=\"white\" />;\n }\n }, [type]);\n return (\n <Flex itemAlign=\"center\" justify=\"between\" className=\"oui-px-4 oui-py-3\">\n <div className=\"orderly-notification-header oui-flex oui-items-center oui-gap-2\">\n {icon}\n {title}\n </div>\n <button\n onClick={props.onExpandToggle}\n className=\"oui-transition-transform oui-duration-300\"\n style={{\n transform: !expanded ? \"rotate(180deg)\" : \"rotate(0deg)\",\n }}\n >\n <ChevronDownIcon size={18} color=\"white\" />\n </button>\n </Flex>\n );\n};\n\nconst NotificationFooter: FC<{\n total: number;\n current: number;\n onCloseAll: () => void;\n onPrev: () => void;\n onNext: () => void;\n}> = (props) => {\n const { total, current, onCloseAll, onPrev, onNext } = props;\n const { t } = useTranslation();\n return (\n <Flex\n className=\"orderly-notification-footer oui-px-4 oui-py-2\"\n itemAlign=\"center\"\n justify=\"between\"\n >\n <Flex gap={2}>\n <button\n disabled={current - 1 < 0}\n onClick={onPrev}\n className=\"oui-flex oui-size-[18px] oui-items-center oui-justify-center oui-rounded-full oui-bg-base-6 hover:oui-bg-base-5 disabled:oui-opacity-50\"\n >\n <ChevronLeftIcon size={14} color=\"white\" />\n </button>\n <Text intensity={54} size=\"sm\">\n {current + 1}/{total}\n </Text>\n <button\n disabled={current + 1 >= total}\n onClick={onNext}\n className=\"oui-flex oui-size-[18px] oui-items-center oui-justify-center oui-rounded-full oui-bg-base-6 hover:oui-bg-base-5 disabled:oui-opacity-50\"\n >\n <ChevronRightIcon size={14} color=\"white\" />\n </button>\n </Flex>\n <button onClick={onCloseAll}>\n <Text size=\"xs\" color=\"primary\">\n {t(\"notification.closeAll\", { total })}\n </Text>\n </button>\n </Flex>\n );\n};\n\nconst NotificationContent: FC<{\n dataSource: (API.AnnouncementRow & {\n startTime?: number;\n endTime?: number;\n })[];\n current: number;\n onItemClick: (url: string) => void;\n}> = (props) => {\n const elements = useMemo(() => {\n return props.dataSource.map((message) => {\n const { type } = message;\n switch (type) {\n case AnnouncementType.Campaign:\n return (\n <CampaignContentCard\n message={message.message}\n coverImage={message.coverImage ?? \"\"}\n updateTime={message.updated_time ?? 0}\n url={message.url ?? \"\"}\n onItemClick={props.onItemClick}\n />\n );\n case AnnouncementType.Maintenance:\n return (\n <MaintenanceContentCard\n message={message.message}\n startTime={message.startTime ?? 0}\n endTime={message.endTime ?? 0}\n />\n );\n case AnnouncementType.Delisting:\n return (\n <DelistingContentCard\n message={message.message}\n updateTime={message.updated_time ?? 0}\n />\n );\n default:\n return (\n <ListingContentCard\n message={message.message}\n updateTime={message.updated_time ?? 0}\n />\n );\n }\n });\n }, [props.dataSource]);\n return <>{elements[props.current]}</>;\n};\n\nexport const NotificationUI: FC<\n NotificationProps & {\n maintenanceMessage?: string;\n onItemClick: (url: string) => void;\n }\n> = (props) => {\n const [expanded, setExpanded] = useState(true);\n\n const [current, setCurrent] = useState(0);\n const len = useMemo(() => props.dataSource?.length ?? 0, [props.dataSource]);\n\n if (len === 0) {\n return null;\n }\n\n return (\n <div className=\"orderly-notification oui-w-full \">\n <NotificationHeader\n dataSource={props.dataSource ?? []}\n current={current}\n expanded={expanded}\n onExpandToggle={() => {\n setExpanded(!expanded);\n }}\n />\n <Divider className=\"oui-mx-4\" />\n <div\n className=\"oui-grid oui-transition-all oui-duration-300 oui-ease-in-out\"\n style={{\n gridTemplateRows: expanded ? \"1fr\" : \"0fr\",\n }}\n >\n {/* Inner div needs overflow-hidden and min-height-0 for grid animation to work */}\n <div className=\"oui-min-h-0 oui-overflow-hidden \">\n <div className=\"oui-px-4 oui-py-3\">\n <NotificationContent\n dataSource={props.dataSource ?? []}\n current={current}\n onItemClick={props.onItemClick}\n />\n </div>\n </div>\n </div>\n\n <NotificationFooter\n total={len}\n current={current}\n onCloseAll={props.onClose ?? (() => {})}\n onPrev={() => {\n if (current - 1 < 0) {\n return;\n }\n setCurrent(current - 1);\n }}\n onNext={() => {\n if (current + 1 >= len) {\n return;\n }\n setCurrent(current + 1);\n }}\n />\n </div>\n );\n};\n","import { FC, useMemo } from \"react\";\nimport { UTCDate } from \"@date-fns/utc\";\nimport { format, differenceInHours, differenceInMinutes } from \"date-fns\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { Flex, Text } from \"@kodiak-finance/orderly-ui\";\nimport { ArrowRightShortIcon } from \"../announcementCenter/icons\";\n\nexport const CampaignContentCard: FC<{\n message: string;\n coverImage: string;\n updateTime: number;\n url?: string | null;\n onItemClick: (url: string) => void;\n}> = ({ message, coverImage, url, onItemClick }) => {\n const { t } = useTranslation();\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-5\">\n <Text size=\"sm\" weight=\"bold\">\n {message}\n </Text>\n <div\n className=\"oui-rounded-xl oui-bg-base-9 oui-bg-cover oui-bg-center oui-bg-no-repeat\"\n style={{\n backgroundImage: `url(${coverImage})`,\n height: \"100px\",\n }}\n ></div>\n {typeof url === \"string\" &&\n url !== \"\" &&\n typeof onItemClick === \"function\" && (\n <button\n className=\"oui-flex oui-items-center oui-gap-1\"\n onClick={() => onItemClick(url)}\n >\n <Text\n size=\"xs\"\n color=\"buy\"\n className=\"oui-bg-clip-text oui-text-transparent oui-gradient-brand\"\n >\n {t(\"notification.joinNow\")}\n </Text>\n <ArrowRightShortIcon size={18} color=\"success\" />\n </button>\n )}\n </div>\n );\n};\n\nexport const MaintenanceContentCard: FC<{\n message: string;\n startTime: number;\n endTime: number;\n}> = ({ message, startTime, endTime }) => {\n const { t } = useTranslation();\n const formattedMessage = useMemo(() => {\n // Calculate duration in hours\n const hours = differenceInHours(endTime, startTime);\n\n const minutes = differenceInMinutes(endTime, startTime) - hours * 60;\n\n // Convert timestamps to UTC dates\n const startUtc = new UTCDate(startTime);\n const endUtc = new UTCDate(endTime);\n\n // Format start time as HH:mm (24-hour format) in UTC\n const startTimeFormatted = format(startUtc, \"HH:mm\");\n\n // Format end time as hh:mm a (12-hour format with AM/PM) in UTC\n const endTimeFormatted = format(endUtc, \"hh:mm a\");\n\n if (hours > 0) {\n return t(\"notification.maintenanceDuration.hours\", {\n hours: minutes > 0 ? (hours + minutes / 60).toFixed(1) : hours,\n startTimeFormatted,\n endTimeFormatted,\n });\n }\n\n return t(\"notification.maintenanceDuration.minutes\", {\n minutes,\n startTimeFormatted,\n endTimeFormatted,\n });\n }, [startTime, endTime, t]);\n\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-1\">\n <Text size=\"xs\" intensity={54}>\n {t(\"notification.recentlyUpdated\")}\n </Text>\n <Flex itemAlign={\"center\"}>\n <Text size=\"xs\" weight=\"bold\">\n {formattedMessage}\n </Text>\n </Flex>\n {message && (\n <Text size=\"2xs\" intensity={80} as=\"div\" className=\"oui-mt-2\">\n {message}\n </Text>\n )}\n </div>\n );\n};\n\nexport const DelistingContentCard: FC<{\n message: string;\n updateTime: number;\n}> = ({ message, updateTime }) => {\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-1\">\n <Text.formatted\n rule=\"date\"\n intensity={54}\n formatString=\"yyyy-MM-dd HH:mm:ss\"\n size=\"xs\"\n >\n {updateTime}\n </Text.formatted>\n <Text size=\"sm\" weight=\"bold\">\n {message}\n </Text>\n </div>\n );\n};\n\nexport const ListingContentCard: FC<{\n message: string;\n updateTime: number;\n}> = ({ message, updateTime }) => {\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-1\">\n <Text.formatted\n rule=\"date\"\n intensity={54}\n formatString=\"yyyy-MM-dd HH:mm:ss\"\n size=\"xs\"\n >\n {updateTime}\n </Text.formatted>\n <Text size=\"sm\" weight=\"bold\">\n {message}\n </Text>\n </div>\n );\n};\n","import { FC, useCallback } from \"react\";\nimport { useAnnouncementCenterScript } from \"./announcementCenter.script\";\nimport { AnnouncementCenterUI } from \"./announcementCenter.ui\";\n\nexport const AnnouncementCenterWidget: FC<{\n onRouteChange: (url: string) => void;\n}> = (props) => {\n const { dataSource, current, setCurrent } = useAnnouncementCenterScript();\n const onItemClick = useCallback(\n (url: string) => {\n if (!url) return;\n props.onRouteChange(url);\n },\n [props.onRouteChange],\n );\n return (\n <AnnouncementCenterUI\n dataSource={dataSource}\n current={current}\n setCurrent={setCurrent}\n onItemClick={onItemClick}\n />\n );\n};\n","import { useState } from \"react\";\nimport { useAnnouncement } from \"../hooks/useAnnouncement\";\n\nexport const useAnnouncementCenterScript = () => {\n const { tips } = useAnnouncement();\n const [current, setCurrent] = useState<string | number | null>(null);\n\n return {\n dataSource: tips,\n current,\n setCurrent,\n };\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport { UTCDateMini } from \"@date-fns/utc\";\nimport { format } from \"date-fns\";\nimport { produce } from \"immer\";\nimport {\n MaintenanceStatus,\n useLocalStorage,\n useMaintenanceStatus,\n useOrderlyContext,\n useQuery,\n useWS,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport {\n AnnouncementType,\n API,\n EMPTY_LIST,\n WSMessage,\n} from \"@kodiak-finance/orderly-types\";\nimport { getTimestamp } from \"@kodiak-finance/orderly-utils\";\n\nconst oneDay = 1000 * 60 * 60 * 24;\n\nconst maintentanceId = \"-1\";\n\nexport type AnnouncementOptions = {\n hideTips?: boolean;\n};\n\ninterface AnnouncementStore {\n show?: boolean;\n lastUpdateTime?: number | null;\n}\n\nconst ORDERLY_ANNOUNCEMENT_KEY = \"orderly_announcement\";\n\nconst getTimeString = (timestamp: number) => {\n const date = format(new UTCDateMini(timestamp), \"MMM dd\");\n const time = format(new UTCDateMini(timestamp), \"h:mm aa\");\n return `${time} (UTC) on ${date}`;\n};\n\nconst sortDataByUpdatedTime = (ori: API.Announcement) => {\n return produce<API.Announcement>(ori, (draft) => {\n if (Array.isArray(draft.rows)) {\n draft.rows.sort((a, b) => {\n if (a.updated_time && b.updated_time) {\n return b.updated_time - a.updated_time;\n }\n return 0;\n });\n }\n });\n};\n\nconst useAnnouncementData = () => {\n const ws = useWS();\n\n const [announcementStore, setStore] = useLocalStorage<AnnouncementStore>(\n ORDERLY_ANNOUNCEMENT_KEY,\n {},\n );\n\n const [tips, setTips] = useState<API.Announcement>({});\n\n const [maintenanceDialogInfo, setMaintenanceDialogInfo] = useState<string>();\n\n const { startTime, endTime, status, brokerName } = useMaintenanceStatus();\n\n const { t } = useTranslation();\n\n const { data: announcements } = useQuery<API.Announcement>(\n `/v2/public/announcement`,\n {\n revalidateOnFocus: false,\n refreshInterval: 60 * 60 * 1000, // refresh every 1 hour\n formatter: (data) => data,\n },\n );\n\n const getMaintentTipsContent = (\n brokerName: string,\n startDate: string,\n endDate: string,\n ) => t(\"maintenance.tips.description\", { brokerName, startDate, endDate });\n\n const getMaintentDialogContent = (brokerName: string, endDate: string) =>\n t(\"maintenance.dialog.description\", { brokerName, endDate });\n\n useEffect(() => {\n const unsubscribe = ws.subscribe(\"announcement\", {\n onMessage(message: WSMessage.Announcement) {\n if (message) {\n setTips((prev) => {\n return produce(prev, (draft) => {\n // Make sure draft.rows is an array\n if (!Array.isArray(draft.rows)) {\n draft.rows = [];\n }\n const idx = draft.rows.findIndex(\n (tip) => tip.announcement_id === message.announcement_id,\n );\n // Filter out old tips with the same id\n if (idx !== -1) {\n draft.rows.splice(idx, 1);\n }\n // Add the latest tip\n draft.rows.push({\n announcement_id: message.announcement_id,\n message: message.message,\n url: message.url,\n i18n: message.i18n,\n type: message.type,\n updated_time: message.updated_time,\n });\n });\n });\n // @ts-ignore\n setStore((prev) => ({ ...prev, show: true }));\n }\n },\n onError(err) {\n if (err instanceof Error) {\n console.error(\"Error receiving announcement:\", err.message);\n }\n },\n });\n return () => {\n unsubscribe?.();\n };\n }, [ws]);\n\n useEffect(() => {\n if (!announcements?.rows) {\n return;\n }\n const apiTime = announcements.last_updated_time ?? 0;\n const cachedTime = announcementStore.lastUpdateTime ?? 0;\n if (cachedTime < apiTime) {\n setTips((prev) => ({ ...prev, rows: announcements?.rows }));\n setStore({ show: true, lastUpdateTime: apiTime });\n } else {\n setTips((prev) => {\n return produce<API.Announcement>(prev, (draft) => {\n if (announcements?.rows?.length) {\n // If there are announcement rows available, create a Set to store IDs of existing tips\n const existingIds = new Set<string | number>(\n prev.rows?.map((tip) => tip.announcement_id),\n );\n // Find the maintenance tip in previous tips (if any)\n const maintenanceTip = prev.rows?.find(\n (tip) => tip.announcement_id === maintentanceId,\n );\n // Clear the draft’s rows array to refill it\n draft.rows = [];\n announcements.rows.forEach((item) => {\n if (!existingIds.has(item.announcement_id)) {\n // If the item’s ID is not in existingIds, push it into the draft\n draft.rows?.push(item);\n }\n });\n if (maintenanceTip) {\n // If a maintenance tip existed before, unshift it to the front\n draft.rows.unshift(maintenanceTip);\n }\n } else {\n // Find the index of the maintenance tip in draft rows\n const idx = draft.rows?.findIndex(\n (tip) => tip.announcement_id === maintentanceId,\n );\n if (idx !== undefined && idx !== -1) {\n // Remove the maintenance tip from draft rows\n draft.rows?.splice(idx, 1);\n }\n }\n });\n });\n }\n }, [announcements]);\n\n useEffect(() => {\n const startDate = startTime ? getTimeString(startTime) : \"-\";\n const endDate = endTime ? getTimeString(endTime) : \"-\";\n if (status === MaintenanceStatus.Maintenance) {\n setMaintenanceDialogInfo(getMaintentDialogContent(brokerName, endDate));\n return;\n }\n setMaintenanceDialogInfo(undefined);\n\n if (startTime && endTime) {\n // if (startTime < getTimestamp() + oneDay) {\n setTips((prev) =>\n produce<API.Announcement>(prev, (draft) => {\n // Make sure draft.rows is an array\n if (!Array.isArray(draft.rows)) {\n draft.rows = [];\n }\n // Rebuild rows: insert the latest maintenance tip first, then put the old non-maintenance ones at the end\n draft.rows = [\n {\n announcement_id: maintentanceId,\n type: AnnouncementType.Maintenance,\n /** @ts-ignore */\n startTime: startTime,\n /** @ts-ignore */\n endTime: endTime,\n message: getMaintentTipsContent(brokerName, startDate, endDate),\n },\n ...draft.rows.filter(\n (tip) => tip.type !== AnnouncementType.Maintenance,\n ),\n ];\n }),\n );\n } else {\n setTips((prev) => {\n return produce<API.Announcement>(prev, (draft) => {\n const index = draft.rows?.findIndex(\n (tip) => tip.announcement_id === maintentanceId,\n );\n if (index !== undefined && index !== -1) {\n draft.rows?.splice(index, 1);\n }\n });\n });\n }\n }, [startTime, endTime, status, brokerName, t]);\n\n const { customAnnouncements } = useAppContext();\n\n // Merge custom announcements with API announcements\n const mergedTips = useMemo(() => {\n const tipsCopy = { ...tips };\n if (customAnnouncements && customAnnouncements.length > 0) {\n // Custom announcements appear first (higher priority)\n tipsCopy.rows = [...customAnnouncements, ...(tips.rows || [])];\n }\n return sortDataByUpdatedTime(tipsCopy);\n }, [tips, customAnnouncements]);\n\n return {\n tips: mergedTips,\n maintenanceDialogInfo: maintenanceDialogInfo,\n };\n};\n\nexport type AnnouncementReturn = ReturnType<typeof useAnnouncement>;\n\nexport const useAnnouncement = (options?: AnnouncementOptions) => {\n const { showAnnouncement, setShowAnnouncement } = useAppContext();\n const { dataAdapter } = useOrderlyContext();\n\n const { tips: mergedTips, maintenanceDialogInfo } = useAnnouncementData();\n\n const memoizedTips = useMemo<API.AnnouncementRow[]>(() => {\n if (typeof dataAdapter?.announcementList === \"function\") {\n return dataAdapter.announcementList(\n mergedTips?.rows ?? (EMPTY_LIST as API.AnnouncementRow[]),\n );\n }\n return mergedTips?.rows ?? (EMPTY_LIST as API.AnnouncementRow[]);\n }, [dataAdapter?.announcementList, mergedTips?.rows]);\n\n const [announcementStore, setStore] = useLocalStorage<AnnouncementStore>(\n ORDERLY_ANNOUNCEMENT_KEY,\n {},\n );\n\n const closeTips = () => {\n // @ts-ignore\n setStore((prev) => ({ ...prev, show: false }));\n };\n\n useEffect(() => {\n const len = memoizedTips.length;\n setShowAnnouncement(\n Boolean(len) && announcementStore.show && !options?.hideTips,\n );\n }, [\n memoizedTips,\n announcementStore.show,\n options?.hideTips,\n setShowAnnouncement,\n ]);\n\n return {\n maintenanceDialogInfo,\n tips: memoizedTips,\n closeTips: closeTips,\n showAnnouncement: showAnnouncement,\n };\n};\n","import { FC } from \"react\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { AnnouncementContent } from \"../components/announcementCenter/announcementCenter.ui\";\n\nexport const AnnouncementCenterUI: FC<{\n dataSource: API.AnnouncementRow[];\n current: string | number | null;\n setCurrent: (current: string | number | null) => void;\n onItemClick: (url: string) => void;\n}> = (props) => {\n const { dataSource, current, setCurrent, onItemClick } = props;\n return (\n <div className=\"oui-m-1 oui-rounded-xl oui-bg-base-9 oui-p-2\">\n <AnnouncementContent\n dataSource={dataSource}\n current={current}\n onExpandToggle={setCurrent}\n onItemClick={onItemClick}\n showDivider\n />\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { RouterAdapter } from \"@kodiak-finance/orderly-types\";\nimport { AnnouncementCenterWidget } from \"./announcementCenter.widget\";\n\nexport const AnnouncementCenterPage: FC<{ routerAdapter?: RouterAdapter }> = (\n props,\n) => {\n return (\n <AnnouncementCenterWidget\n onRouteChange={(url: string) => {\n if (!url) return;\n props.routerAdapter?.onRouteChange({\n href: url,\n name: url,\n });\n }}\n />\n );\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kodiak-finance/orderly-ui-notification",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.20",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -18,12 +18,12 @@
|
|
|
18
18
|
"@date-fns/utc": "1.2.0",
|
|
19
19
|
"date-fns": "^3.6.0",
|
|
20
20
|
"immer": "^10.1.1",
|
|
21
|
-
"@kodiak-finance/orderly-i18n": "2.8.
|
|
22
|
-
"@kodiak-finance/orderly-hooks": "2.8.
|
|
23
|
-
"@kodiak-finance/orderly-types": "2.8.
|
|
24
|
-
"@kodiak-finance/orderly-
|
|
25
|
-
"@kodiak-finance/orderly-
|
|
26
|
-
"@kodiak-finance/orderly-utils": "2.8.
|
|
21
|
+
"@kodiak-finance/orderly-i18n": "2.8.20",
|
|
22
|
+
"@kodiak-finance/orderly-hooks": "2.8.20",
|
|
23
|
+
"@kodiak-finance/orderly-types": "2.8.20",
|
|
24
|
+
"@kodiak-finance/orderly-ui": "2.8.20",
|
|
25
|
+
"@kodiak-finance/orderly-react-app": "2.8.20",
|
|
26
|
+
"@kodiak-finance/orderly-utils": "2.8.20"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@swc/cli": "^0.3.12",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"react-dom": "^18.2.0",
|
|
35
35
|
"tailwindcss": "^3.4.4",
|
|
36
36
|
"tsup": "^7.1.0",
|
|
37
|
-
"tsconfig": "0.11.
|
|
37
|
+
"tsconfig": "0.11.19"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
40
|
"react": ">=18",
|