@intoss/shared 0.0.11 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1 +1,522 @@
1
- import{createContext as ie,useContext as se,useMemo as ae}from"react";import{getOperationalEnvironment as re,getSchemeUri as ne}from"@apps-in-toss/framework";var M=re()==="sandbox"?"local":ne().startsWith("intoss-private")?"preview":"production",A={local:"http://localhost:3000",preview:"https://preview-api.intoss.app",production:"https://api.intoss.app"}[M];import{jsx as pe}from"react/jsx-runtime";var F=ie({appName:"",apiEndpoint:"http://localhost:3000",runningEnvironment:"local"}),V=({appName:e,children:o})=>{let t=ae(()=>({appName:e,apiEndpoint:A,runningEnvironment:M}),[e]);return pe(F.Provider,{value:t,children:o})},c=()=>se(F);import{createContext as ue,useCallback as I,useContext as le,useEffect as de,useMemo as ce,useState as R}from"react";import{Alert as me}from"react-native";import{jsx as fe}from"react/jsx-runtime";var b=ue({getInterstitialAdGroup:()=>({id:"ait-ad-test-interstitial-id",type:"interstitial"}),getRewardedAdGroup:()=>({id:"ait-ad-test-rewarded-id",type:"rewarded"})}),O=({initial:e,children:o})=>{let{appName:t,runningEnvironment:n}=c(),[i,s]=R(n!=="production"),[r,p]=R(e),u=I(a=>({id:r[a]??"ait-ad-test-interstitial-id",type:"interstitial"}),[r]),l=I(a=>({id:r[a]??"ait-ad-test-rewarded-id",type:"rewarded"}),[r]),d=ce(()=>({getInterstitialAdGroup:u,getRewardedAdGroup:l}),[u,l]);return de(()=>{if(i)return;let a=new AbortController,f=setTimeout(()=>a.abort(),3e3);fetch(`https://static.intoss.app/${t}/assets/adGroupList.json`,{signal:a.signal}).then(x=>x.json()).then(p).finally(()=>{clearTimeout(f),s(!0)})},[t,i]),me.alert("AdGroupProvider",`initialized: ${i}, appName: ${t}`),i?fe(b.Provider,{value:d,children:o}):null},k=()=>le(b);import{GoogleAdMob as S}from"@apps-in-toss/framework";import{useCallback as E,useEffect as N,useState as _}from"react";var W=({primaryAdGroup:e,secondaryAdGroup:o,onShowAd:t,onDissmissAd:n})=>{let[i,s]=_(!1),[r,p]=_(!1),[u,l]=_(),[d,a]=_(null),f=E(g=>new Promise(C=>{let P=S.loadAppsInTossAdMob({options:{adGroupId:g},onEvent:y=>{switch(y.type){case"loaded":C([!0,P]);break}},onError:()=>C([!1,P])})}),[]),x=E(async()=>{if(S.loadAppsInTossAdMob.isSupported()!==!0){s(!0);return}if(r)return;let[g,C]=await f(e.id);if(g){s(!0),p(!0),l(e.id),a(()=>C);return}if(C(),!o){s(!0);return}let[P,y]=await f(o.id);if(P){s(!0),p(!0),l(o.id),a(()=>y);return}y(),s(!0)},[e,o,r,f]),h=E(()=>{d?.(),p(!1),l(void 0),a(null)},[d]),oe=E(()=>{if(S.loadAppsInTossAdMob.isSupported()!==!0){t?.(),n?.();return}if(!r||!u){t?.(),n?.();return}S.showAppsInTossAdMob({options:{adGroupId:u},onEvent:g=>{switch(g.type){case"show":(u===e.id&&e.type==="interstitial"||u===o?.id&&o.type==="interstitial")&&t?.();break;case"failedToShow":t?.(),h();break;case"dismissed":n?.(),h();break;case"userEarnedReward":t?.();break}},onError:()=>{t?.(),h()}})},[r,u,e,o,t,n,h]);return N(()=>{u||x()},[u,x]),N(()=>()=>h(),[]),{initialized:i,adLoaded:r,showAd:oe}};import{useQuery as he}from"@tanstack/react-query";import{createContext as ge,useContext as Ce,useMemo as xe}from"react";import{jsx as Pe}from"react/jsx-runtime";var K=ge({isPreparing:!0,isLoggedIn:!1,retry:()=>Promise.resolve()}),L=({children:e})=>{let{data:o,isFetching:t,refetch:n}=he({queryKey:["/my/user"]}),i=xe(()=>({isPreparing:t,isLoggedIn:!!o?.user?.id,retry:n}),[o,t,n]);return Pe(K.Provider,{value:i,children:e})},v=()=>Ce(K);import{appLogin as Oe,Storage as ke}from"@apps-in-toss/framework";import{Storage as ye}from"@apps-in-toss/framework";import{camelCase as Se}from"es-toolkit/string";import{createContext as Ee,useCallback as _e,useContext as ve,useEffect as Te,useState as D}from"react";import{Alert as Me}from"react-native";import{jsx as Ae}from"react/jsx-runtime";var we="@auth/token",G=Ee({fetcher:fetch,setToken:()=>null}),w=e=>Array.isArray(e)?e.map(w):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([o,t])=>[Se(o),w(t)])):e,z=({baseUrl:e,children:o})=>{let{appName:t,apiEndpoint:n}=c(),[i,s]=D(null),[r,p]=D(!1),u=_e((l,d)=>fetch(`${e??n}/${t}${l}`,{...d,headers:{"Content-Type":"application/json",...d?.headers,...i?{Authorization:`Bearer ${i}`}:{}}}).then(a=>a.json()).then(a=>w(a)),[t,n,i,e]);return Te(()=>{ye.getItem(we).then(s).finally(()=>p(!0))},[]),Me.alert("FetcherProvider",`initialized: ${r}, apiEndpoint: ${n}`),Ae(G.Provider,{value:{fetcher:u,setToken:s},children:r?o:null})},m=()=>ve(G);import{createElement as Fe,memo as Y}from"react";var T=(e,o,t)=>{let{displayName:n}=t??{},i=Y(o),s=Y(r=>Fe(i,e(r)));return s.ViewComponent=i,n&&(s.displayName=n,s.ViewComponent.displayName=`${n}View`),s};import{QueryClientProvider as Re}from"@tanstack/react-query";import{QueryClient as Ve}from"@tanstack/react-query";import{useMemo as Ie}from"react";var $=({children:e})=>{let{fetcher:o}=m();return{queryClient:Ie(()=>new Ve({defaultOptions:{queries:{queryFn:({queryKey:n})=>o(n[0])}}}),[o]),children:e}};import{jsx as be}from"react/jsx-runtime";var Q=T($,({queryClient:e,children:o})=>be(Re,{client:e,children:o}));import{useMutation as Ne}from"@tanstack/react-query";import{useCallback as We}from"react";var Ke="@auth/token",U=({onSuccess:e})=>{let{retry:o}=v(),{fetcher:t,setToken:n}=m(),i=Ne({mutationFn:async r=>t("/my/sessions",{method:"POST",body:JSON.stringify(r)}),onSuccess:async r=>{n(r.token),await ke.setItem(Ke,r.token),await o(),e?.()}});return{signInWithToss:We(async()=>{let{authorizationCode:r,referrer:p}=await Oe();i.mutate({authorizationCode:r,referrer:p})},[i]),isLoading:i.isPending}};var q=e=>Math.floor((e+324e5)/864e5);var H=e=>(e+3)%7;var J=e=>Math.floor((e+324e5)%864e5/36e5);var j=e=>Math.floor((e+324e5)%36e5/6e4);var B=e=>Math.floor((e+3)/7);import{Storage as X}from"@apps-in-toss/framework";import{useCallback as Le,useEffect as De,useState as Z}from"react";import{DeviceEventEmitter as ee}from"react-native";var te=e=>{let[o,t]=Z(),[n,i]=Z(!0),s=Le(r=>(t(r),ee.emit(e,r),X.setItem(e,JSON.stringify({value:r}))),[e]);return De(()=>{i(!0),X.getItem(e).then(p=>{try{t(p===null?void 0:JSON.parse(p).value)}catch{t(void 0)}finally{i(!1)}});let r=ee.addListener(e,t);return()=>r.remove()},[e]),[o,s,n]};export{O as AdGroupProvider,L as AuthStateProvider,V as ConfigProvider,z as FetcherProvider,Q as QueryProvider,T as bind,q as calculateDay,H as calculateDayOfWeek,J as calculateHour,j as calculateMinute,B as calculateWeek,k as useAdGroup,W as useAdvertisement,v as useAuthState,c as useConfig,m as useFetcher,U as useSignInWithToss,te as useStorage};
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __defProps = Object.defineProperties;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
10
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11
+ var __spreadValues = (a, b) => {
12
+ for (var prop in b || (b = {}))
13
+ if (__hasOwnProp.call(b, prop))
14
+ __defNormalProp(a, prop, b[prop]);
15
+ if (__getOwnPropSymbols)
16
+ for (var prop of __getOwnPropSymbols(b)) {
17
+ if (__propIsEnum.call(b, prop))
18
+ __defNormalProp(a, prop, b[prop]);
19
+ }
20
+ return a;
21
+ };
22
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
23
+ var __export = (target, all) => {
24
+ for (var name in all)
25
+ __defProp(target, name, { get: all[name], enumerable: true });
26
+ };
27
+ var __copyProps = (to, from, except, desc) => {
28
+ if (from && typeof from === "object" || typeof from === "function") {
29
+ for (let key of __getOwnPropNames(from))
30
+ if (!__hasOwnProp.call(to, key) && key !== except)
31
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
32
+ }
33
+ return to;
34
+ };
35
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
36
+ var __async = (__this, __arguments, generator) => {
37
+ return new Promise((resolve, reject) => {
38
+ var fulfilled = (value) => {
39
+ try {
40
+ step(generator.next(value));
41
+ } catch (e) {
42
+ reject(e);
43
+ }
44
+ };
45
+ var rejected = (value) => {
46
+ try {
47
+ step(generator.throw(value));
48
+ } catch (e) {
49
+ reject(e);
50
+ }
51
+ };
52
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
53
+ step((generator = generator.apply(__this, __arguments)).next());
54
+ });
55
+ };
56
+
57
+ // src/index.ts
58
+ var index_exports = {};
59
+ __export(index_exports, {
60
+ AdGroupProvider: () => AdGroupProvider,
61
+ AuthStateProvider: () => AuthStateProvider,
62
+ ConfigProvider: () => ConfigProvider,
63
+ FetcherProvider: () => FetcherProvider,
64
+ QueryProvider: () => QueryProvider,
65
+ bind: () => bind,
66
+ calculateDay: () => calculateDay,
67
+ calculateDayOfWeek: () => calculateDayOfWeek,
68
+ calculateHour: () => calculateHour,
69
+ calculateMinute: () => calculateMinute,
70
+ calculateWeek: () => calculateWeek,
71
+ useAdGroup: () => useAdGroup,
72
+ useAdvertisement: () => useAdvertisement,
73
+ useAuthState: () => useAuthState,
74
+ useConfig: () => useConfig,
75
+ useFetcher: () => useFetcher,
76
+ useSignInWithToss: () => useSignInWithToss,
77
+ useStorage: () => useStorage
78
+ });
79
+ module.exports = __toCommonJS(index_exports);
80
+
81
+ // src/config/ConfigContext/ConfigContext.tsx
82
+ var import_react = require("react");
83
+
84
+ // src/config/ConfigContext/constant.ts
85
+ var import_framework = require("@apps-in-toss/framework");
86
+ var RUNNING_ENVIRONMENT = (0, import_framework.getOperationalEnvironment)() === "sandbox" ? "local" : (0, import_framework.getSchemeUri)().startsWith("intoss-private") ? "preview" : "production";
87
+ var API_ENDPOINT = {
88
+ local: "http://localhost:3000",
89
+ preview: "https://preview-api.intoss.app",
90
+ production: "https://api.intoss.app"
91
+ }[RUNNING_ENVIRONMENT];
92
+
93
+ // src/config/ConfigContext/ConfigContext.tsx
94
+ var import_jsx_runtime = require("react/jsx-runtime");
95
+ var ConfigContext = (0, import_react.createContext)({
96
+ appName: "",
97
+ apiEndpoint: "http://localhost:3000",
98
+ runningEnvironment: "local"
99
+ });
100
+ var ConfigProvider = ({ appName, children }) => {
101
+ const contextValue = (0, import_react.useMemo)(
102
+ () => ({
103
+ appName,
104
+ apiEndpoint: API_ENDPOINT,
105
+ runningEnvironment: RUNNING_ENVIRONMENT
106
+ }),
107
+ [appName]
108
+ );
109
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ConfigContext.Provider, { value: contextValue, children });
110
+ };
111
+ var useConfig = () => (0, import_react.useContext)(ConfigContext);
112
+
113
+ // src/advertisement/AdGroupContext/AdGroupContext.tsx
114
+ var import_react2 = require("react");
115
+ var import_jsx_runtime2 = require("react/jsx-runtime");
116
+ var AdGroupContext = (0, import_react2.createContext)({
117
+ getInterstitialAdGroup: () => ({ id: "ait-ad-test-interstitial-id", type: "interstitial" }),
118
+ getRewardedAdGroup: () => ({ id: "ait-ad-test-rewarded-id", type: "rewarded" })
119
+ });
120
+ var AdGroupProvider = ({ initial, children }) => {
121
+ const { appName, runningEnvironment } = useConfig();
122
+ const [initialized, setInitialized] = (0, import_react2.useState)(runningEnvironment !== "production");
123
+ const [adGroupList, setAdGroupList] = (0, import_react2.useState)(initial);
124
+ const getInterstitialAdGroup = (0, import_react2.useCallback)(
125
+ (key) => {
126
+ var _a;
127
+ return {
128
+ id: (_a = adGroupList[key]) != null ? _a : "ait-ad-test-interstitial-id",
129
+ type: "interstitial"
130
+ };
131
+ },
132
+ [adGroupList]
133
+ );
134
+ const getRewardedAdGroup = (0, import_react2.useCallback)(
135
+ (key) => {
136
+ var _a;
137
+ return {
138
+ id: (_a = adGroupList[key]) != null ? _a : "ait-ad-test-rewarded-id",
139
+ type: "rewarded"
140
+ };
141
+ },
142
+ [adGroupList]
143
+ );
144
+ const contextValue = (0, import_react2.useMemo)(
145
+ () => ({
146
+ getInterstitialAdGroup,
147
+ getRewardedAdGroup
148
+ }),
149
+ [getInterstitialAdGroup, getRewardedAdGroup]
150
+ );
151
+ (0, import_react2.useEffect)(() => {
152
+ if (initialized) {
153
+ return;
154
+ }
155
+ const controller = new AbortController();
156
+ const timeoutId = setTimeout(() => controller.abort(), 3e3);
157
+ fetch(`https://static.intoss.app/${appName}/assets/adGroupList.json`, {
158
+ signal: controller.signal
159
+ }).then((res) => res.json()).then(setAdGroupList).finally(() => {
160
+ clearTimeout(timeoutId);
161
+ setInitialized(true);
162
+ });
163
+ }, [appName, initialized]);
164
+ if (!initialized) {
165
+ return null;
166
+ }
167
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(AdGroupContext.Provider, { value: contextValue, children });
168
+ };
169
+ var useAdGroup = () => (0, import_react2.useContext)(AdGroupContext);
170
+
171
+ // src/advertisement/useAdvertisement/useAdvertisement.ts
172
+ var import_framework2 = require("@apps-in-toss/framework");
173
+ var import_react3 = require("react");
174
+ var useAdvertisement = ({
175
+ primaryAdGroup,
176
+ secondaryAdGroup,
177
+ onShowAd,
178
+ onDissmissAd
179
+ }) => {
180
+ const [initialized, setInitialized] = (0, import_react3.useState)(false);
181
+ const [adLoaded, setAdLoaded] = (0, import_react3.useState)(false);
182
+ const [adGroupId, setAdGroupId] = (0, import_react3.useState)();
183
+ const [adCleanup, setAdCleanup] = (0, import_react3.useState)(null);
184
+ const loadAd = (0, import_react3.useCallback)(
185
+ (adGroupId2) => new Promise((resolve) => {
186
+ const cleanup = import_framework2.GoogleAdMob.loadAppsInTossAdMob({
187
+ options: {
188
+ adGroupId: adGroupId2
189
+ },
190
+ onEvent: (event) => {
191
+ switch (event.type) {
192
+ case "loaded":
193
+ resolve([true, cleanup]);
194
+ break;
195
+ }
196
+ },
197
+ onError: () => resolve([false, cleanup])
198
+ });
199
+ }),
200
+ []
201
+ );
202
+ const loadWaterfall = (0, import_react3.useCallback)(() => __async(null, null, function* () {
203
+ if (import_framework2.GoogleAdMob.loadAppsInTossAdMob.isSupported() !== true) {
204
+ setInitialized(true);
205
+ return;
206
+ }
207
+ if (adLoaded) {
208
+ return;
209
+ }
210
+ const [primaryAdLoaded, primaryAdCleanup] = yield loadAd(primaryAdGroup.id);
211
+ if (primaryAdLoaded) {
212
+ setInitialized(true);
213
+ setAdLoaded(true);
214
+ setAdGroupId(primaryAdGroup.id);
215
+ setAdCleanup(() => primaryAdCleanup);
216
+ return;
217
+ }
218
+ primaryAdCleanup();
219
+ if (!secondaryAdGroup) {
220
+ setInitialized(true);
221
+ return;
222
+ }
223
+ const [secondaryAdLoaded, secondaryAdCleanup] = yield loadAd(secondaryAdGroup.id);
224
+ if (secondaryAdLoaded) {
225
+ setInitialized(true);
226
+ setAdLoaded(true);
227
+ setAdGroupId(secondaryAdGroup.id);
228
+ setAdCleanup(() => secondaryAdCleanup);
229
+ return;
230
+ }
231
+ secondaryAdCleanup();
232
+ setInitialized(true);
233
+ }), [primaryAdGroup, secondaryAdGroup, adLoaded, loadAd]);
234
+ const cleanupAd = (0, import_react3.useCallback)(() => {
235
+ adCleanup == null ? void 0 : adCleanup();
236
+ setAdLoaded(false);
237
+ setAdGroupId(void 0);
238
+ setAdCleanup(null);
239
+ }, [adCleanup]);
240
+ const showAd = (0, import_react3.useCallback)(() => {
241
+ if (import_framework2.GoogleAdMob.loadAppsInTossAdMob.isSupported() !== true) {
242
+ onShowAd == null ? void 0 : onShowAd();
243
+ onDissmissAd == null ? void 0 : onDissmissAd();
244
+ return;
245
+ }
246
+ if (!adLoaded || !adGroupId) {
247
+ onShowAd == null ? void 0 : onShowAd();
248
+ onDissmissAd == null ? void 0 : onDissmissAd();
249
+ return;
250
+ }
251
+ import_framework2.GoogleAdMob.showAppsInTossAdMob({
252
+ options: {
253
+ adGroupId
254
+ },
255
+ onEvent: (event) => {
256
+ switch (event.type) {
257
+ case "show":
258
+ if (adGroupId === primaryAdGroup.id && primaryAdGroup.type === "interstitial" || adGroupId === (secondaryAdGroup == null ? void 0 : secondaryAdGroup.id) && secondaryAdGroup.type === "interstitial") {
259
+ onShowAd == null ? void 0 : onShowAd();
260
+ }
261
+ break;
262
+ case "failedToShow":
263
+ onShowAd == null ? void 0 : onShowAd();
264
+ cleanupAd();
265
+ break;
266
+ case "dismissed":
267
+ onDissmissAd == null ? void 0 : onDissmissAd();
268
+ cleanupAd();
269
+ break;
270
+ case "userEarnedReward":
271
+ onShowAd == null ? void 0 : onShowAd();
272
+ break;
273
+ }
274
+ },
275
+ onError: () => {
276
+ onShowAd == null ? void 0 : onShowAd();
277
+ cleanupAd();
278
+ }
279
+ });
280
+ }, [adLoaded, adGroupId, primaryAdGroup, secondaryAdGroup, onShowAd, onDissmissAd, cleanupAd]);
281
+ (0, import_react3.useEffect)(() => {
282
+ if (!adGroupId) {
283
+ loadWaterfall();
284
+ }
285
+ }, [adGroupId, loadWaterfall]);
286
+ (0, import_react3.useEffect)(() => () => cleanupAd(), []);
287
+ return {
288
+ initialized,
289
+ adLoaded,
290
+ showAd
291
+ };
292
+ };
293
+
294
+ // src/auth-state/AuthStateContext/AuthStateContext.tsx
295
+ var import_react_query = require("@tanstack/react-query");
296
+ var import_react4 = require("react");
297
+ var import_jsx_runtime3 = require("react/jsx-runtime");
298
+ var AuthStateContext = (0, import_react4.createContext)({
299
+ isPreparing: true,
300
+ isLoggedIn: false,
301
+ retry: () => Promise.resolve()
302
+ });
303
+ var AuthStateProvider = ({ children }) => {
304
+ const { data, isFetching, refetch } = (0, import_react_query.useQuery)({
305
+ queryKey: ["/my/user"]
306
+ });
307
+ const contextValue = (0, import_react4.useMemo)(
308
+ () => {
309
+ var _a;
310
+ return {
311
+ isPreparing: isFetching,
312
+ isLoggedIn: Boolean((_a = data == null ? void 0 : data.user) == null ? void 0 : _a.id),
313
+ retry: refetch
314
+ };
315
+ },
316
+ [data, isFetching, refetch]
317
+ );
318
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(AuthStateContext.Provider, { value: contextValue, children });
319
+ };
320
+ var useAuthState = () => (0, import_react4.useContext)(AuthStateContext);
321
+
322
+ // src/auth-state/useSignInWithToss/useSignInWithToss.ts
323
+ var import_framework4 = require("@apps-in-toss/framework");
324
+
325
+ // src/query/FetcherContext/FetcherContext.tsx
326
+ var import_framework3 = require("@apps-in-toss/framework");
327
+ var import_string = require("es-toolkit/string");
328
+ var import_react5 = require("react");
329
+ var import_jsx_runtime4 = require("react/jsx-runtime");
330
+ var KEY_TOKEN = "@auth/token";
331
+ var FetcherContext = (0, import_react5.createContext)({
332
+ fetcher: fetch,
333
+ setToken: () => null
334
+ });
335
+ var camelizeKeys = (input) => {
336
+ if (Array.isArray(input)) {
337
+ return input.map(camelizeKeys);
338
+ }
339
+ if (input !== null && typeof input === "object") {
340
+ return Object.fromEntries(
341
+ Object.entries(input).map(([key, value]) => [(0, import_string.camelCase)(key), camelizeKeys(value)])
342
+ );
343
+ }
344
+ return input;
345
+ };
346
+ var FetcherProvider = ({ baseUrl, children }) => {
347
+ const { appName, apiEndpoint } = useConfig();
348
+ const [token, setToken] = (0, import_react5.useState)(null);
349
+ const [initialized, setInitialized] = (0, import_react5.useState)(false);
350
+ const fetcher = (0, import_react5.useCallback)(
351
+ (input, init) => fetch(`${baseUrl != null ? baseUrl : apiEndpoint}/${appName}${input}`, __spreadProps(__spreadValues({}, init), {
352
+ headers: __spreadValues(__spreadValues({
353
+ "Content-Type": "application/json"
354
+ }, init == null ? void 0 : init.headers), token ? { Authorization: `Bearer ${token}` } : {})
355
+ })).then((res) => res.json()).then((data) => camelizeKeys(data)),
356
+ [appName, apiEndpoint, token, baseUrl]
357
+ );
358
+ (0, import_react5.useEffect)(() => {
359
+ import_framework3.Storage.getItem(KEY_TOKEN).then(setToken).finally(() => setInitialized(true));
360
+ }, []);
361
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(FetcherContext.Provider, { value: { fetcher, setToken }, children: initialized ? children : null });
362
+ };
363
+ var useFetcher = () => (0, import_react5.useContext)(FetcherContext);
364
+
365
+ // src/view-model/bind/bind.ts
366
+ var import_react6 = require("react");
367
+ var bind = (useViewModel, ViewComponent, options) => {
368
+ const { displayName } = options != null ? options : {};
369
+ const MemoizedViewComponent = (0, import_react6.memo)(ViewComponent);
370
+ const Component = (0, import_react6.memo)(
371
+ (props) => (0, import_react6.createElement)(
372
+ MemoizedViewComponent,
373
+ useViewModel(props)
374
+ )
375
+ );
376
+ Component.ViewComponent = MemoizedViewComponent;
377
+ if (displayName) {
378
+ Component.displayName = displayName;
379
+ Component.ViewComponent.displayName = `${displayName}View`;
380
+ }
381
+ return Component;
382
+ };
383
+
384
+ // src/query/QueryProvider/QueryProvider.tsx
385
+ var import_react_query3 = require("@tanstack/react-query");
386
+
387
+ // src/query/QueryProvider/useQueryProvider.ts
388
+ var import_react_query2 = require("@tanstack/react-query");
389
+ var import_react7 = require("react");
390
+ var useQueryProvider = ({ children }) => {
391
+ const { fetcher } = useFetcher();
392
+ const queryClient = (0, import_react7.useMemo)(
393
+ () => new import_react_query2.QueryClient({
394
+ defaultOptions: {
395
+ queries: {
396
+ queryFn: ({ queryKey }) => fetcher(queryKey[0])
397
+ }
398
+ }
399
+ }),
400
+ [fetcher]
401
+ );
402
+ return {
403
+ queryClient,
404
+ children
405
+ };
406
+ };
407
+
408
+ // src/query/QueryProvider/QueryProvider.tsx
409
+ var import_jsx_runtime5 = require("react/jsx-runtime");
410
+ var QueryProvider = bind(useQueryProvider, ({ queryClient, children }) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_query3.QueryClientProvider, { client: queryClient, children }));
411
+
412
+ // src/auth-state/useSignInWithToss/useSignInWithToss.ts
413
+ var import_react_query4 = require("@tanstack/react-query");
414
+ var import_react8 = require("react");
415
+ var KEY_TOKEN2 = "@auth/token";
416
+ var useSignInWithToss = ({ onSuccess }) => {
417
+ const { retry } = useAuthState();
418
+ const { fetcher, setToken } = useFetcher();
419
+ const signInWithTossMutation = (0, import_react_query4.useMutation)({
420
+ mutationFn: (body) => __async(null, null, function* () {
421
+ return fetcher("/my/sessions", {
422
+ method: "POST",
423
+ body: JSON.stringify(body)
424
+ });
425
+ }),
426
+ onSuccess: (data) => __async(null, null, function* () {
427
+ setToken(data.token);
428
+ yield import_framework4.Storage.setItem(KEY_TOKEN2, data.token);
429
+ yield retry();
430
+ onSuccess == null ? void 0 : onSuccess();
431
+ })
432
+ });
433
+ const signInWithToss = (0, import_react8.useCallback)(() => __async(null, null, function* () {
434
+ const { authorizationCode, referrer } = yield (0, import_framework4.appLogin)();
435
+ signInWithTossMutation.mutate({
436
+ authorizationCode,
437
+ referrer
438
+ });
439
+ }), [signInWithTossMutation]);
440
+ return {
441
+ signInWithToss,
442
+ isLoading: signInWithTossMutation.isPending
443
+ };
444
+ };
445
+
446
+ // src/calendar/calculateDay/calculateDay.ts
447
+ var MS_PER_DAY = 864e5;
448
+ var KST_OFFSET_MS = 324e5;
449
+ var calculateDay = (timestamp) => Math.floor((timestamp + KST_OFFSET_MS) / MS_PER_DAY);
450
+
451
+ // src/calendar/calculateDayOfWeek/calculateDayOfWeek.ts
452
+ var KST_OFFSET_WEEKDAY = 3;
453
+ var calculateDayOfWeek = (day) => (day + KST_OFFSET_WEEKDAY) % 7;
454
+
455
+ // src/calendar/calculateHour/calculateHour.ts
456
+ var MS_PER_DAY2 = 864e5;
457
+ var MS_PER_HOUR = 36e5;
458
+ var KST_OFFSET_MS2 = 324e5;
459
+ var calculateHour = (timestamp) => Math.floor((timestamp + KST_OFFSET_MS2) % MS_PER_DAY2 / MS_PER_HOUR);
460
+
461
+ // src/calendar/calculateMinute/calculateMinute.ts
462
+ var MS_PER_HOUR2 = 36e5;
463
+ var MS_PER_MINUTE = 6e4;
464
+ var KST_OFFSET_MS3 = 324e5;
465
+ var calculateMinute = (timestamp) => Math.floor((timestamp + KST_OFFSET_MS3) % MS_PER_HOUR2 / MS_PER_MINUTE);
466
+
467
+ // src/calendar/calculateWeek/calculateWeek.ts
468
+ var KST_OFFSET_WEEKDAY2 = 3;
469
+ var calculateWeek = (day) => Math.floor((day + KST_OFFSET_WEEKDAY2) / 7);
470
+
471
+ // src/storage/useStorage/useStorage.ts
472
+ var import_framework5 = require("@apps-in-toss/framework");
473
+ var import_react9 = require("react");
474
+ var import_react_native = require("react-native");
475
+ var useStorage = (key) => {
476
+ const [stateValue, setStateValue] = (0, import_react9.useState)();
477
+ const [isLoading, setIsLoading] = (0, import_react9.useState)(true);
478
+ const updateValue = (0, import_react9.useCallback)(
479
+ (value) => {
480
+ setStateValue(value);
481
+ import_react_native.DeviceEventEmitter.emit(key, value);
482
+ return import_framework5.Storage.setItem(key, JSON.stringify({ value }));
483
+ },
484
+ [key]
485
+ );
486
+ (0, import_react9.useEffect)(() => {
487
+ setIsLoading(true);
488
+ import_framework5.Storage.getItem(key).then((item) => {
489
+ try {
490
+ setStateValue(item === null ? void 0 : JSON.parse(item).value);
491
+ } catch (e) {
492
+ setStateValue(void 0);
493
+ } finally {
494
+ setIsLoading(false);
495
+ }
496
+ });
497
+ const updateValueListener = import_react_native.DeviceEventEmitter.addListener(key, setStateValue);
498
+ return () => updateValueListener.remove();
499
+ }, [key]);
500
+ return [stateValue, updateValue, isLoading];
501
+ };
502
+ // Annotate the CommonJS export names for ESM import in node:
503
+ 0 && (module.exports = {
504
+ AdGroupProvider,
505
+ AuthStateProvider,
506
+ ConfigProvider,
507
+ FetcherProvider,
508
+ QueryProvider,
509
+ bind,
510
+ calculateDay,
511
+ calculateDayOfWeek,
512
+ calculateHour,
513
+ calculateMinute,
514
+ calculateWeek,
515
+ useAdGroup,
516
+ useAdvertisement,
517
+ useAuthState,
518
+ useConfig,
519
+ useFetcher,
520
+ useSignInWithToss,
521
+ useStorage
522
+ });
package/package.json CHANGED
@@ -1,23 +1,8 @@
1
1
  {
2
2
  "name": "@intoss/shared",
3
- "version": "0.0.11",
4
- "type": "module",
3
+ "version": "0.0.13",
5
4
  "main": "dist/index.cjs",
6
- "module": "dist/index.js",
7
5
  "types": "dist/index.d.cts",
8
- "exports": {
9
- ".": {
10
- "import": {
11
- "types": "./dist/index.d.ts",
12
- "default": "./dist/index.js"
13
- },
14
- "require": {
15
- "types": "./dist/index.d.cts",
16
- "default": "./dist/index.cjs"
17
- }
18
- },
19
- "./package.json": "./package.json"
20
- },
21
6
  "files": [
22
7
  "dist"
23
8
  ],
package/dist/index.cjs DELETED
@@ -1 +0,0 @@
1
- "use strict";var b=Object.defineProperty;var ye=Object.getOwnPropertyDescriptor;var Se=Object.getOwnPropertyNames;var Ee=Object.prototype.hasOwnProperty;var _e=(e,t)=>{for(var o in t)b(e,o,{get:t[o],enumerable:!0})},ve=(e,t,o,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Se(t))!Ee.call(e,r)&&r!==o&&b(e,r,{get:()=>t[r],enumerable:!(i=ye(t,r))||i.enumerable});return e};var Te=e=>ve(b({},"__esModule",{value:!0}),e);var Ae={};_e(Ae,{AdGroupProvider:()=>N,AuthStateProvider:()=>L,ConfigProvider:()=>k,FetcherProvider:()=>G,QueryProvider:()=>z,bind:()=>w,calculateDay:()=>$,calculateDayOfWeek:()=>Q,calculateHour:()=>U,calculateMinute:()=>q,calculateWeek:()=>H,useAdGroup:()=>W,useAdvertisement:()=>K,useAuthState:()=>T,useConfig:()=>h,useFetcher:()=>g,useSignInWithToss:()=>Y,useStorage:()=>B});module.exports=Te(Ae);var x=require("react");var I=require("@apps-in-toss/framework"),O=(0,I.getOperationalEnvironment)()==="sandbox"?"local":(0,I.getSchemeUri)().startsWith("intoss-private")?"preview":"production",X={local:"http://localhost:3000",preview:"https://preview-api.intoss.app",production:"https://api.intoss.app"}[O];var ee=require("react/jsx-runtime"),Z=(0,x.createContext)({appName:"",apiEndpoint:"http://localhost:3000",runningEnvironment:"local"}),k=({appName:e,children:t})=>{let o=(0,x.useMemo)(()=>({appName:e,apiEndpoint:X,runningEnvironment:O}),[e]);return(0,ee.jsx)(Z.Provider,{value:o,children:t})},h=()=>(0,x.useContext)(Z);var p=require("react"),te=require("react-native"),re=require("react/jsx-runtime"),oe=(0,p.createContext)({getInterstitialAdGroup:()=>({id:"ait-ad-test-interstitial-id",type:"interstitial"}),getRewardedAdGroup:()=>({id:"ait-ad-test-rewarded-id",type:"rewarded"})}),N=({initial:e,children:t})=>{let{appName:o,runningEnvironment:i}=h(),[r,s]=(0,p.useState)(i!=="production"),[n,l]=(0,p.useState)(e),d=(0,p.useCallback)(a=>({id:n[a]??"ait-ad-test-interstitial-id",type:"interstitial"}),[n]),m=(0,p.useCallback)(a=>({id:n[a]??"ait-ad-test-rewarded-id",type:"rewarded"}),[n]),f=(0,p.useMemo)(()=>({getInterstitialAdGroup:d,getRewardedAdGroup:m}),[d,m]);return(0,p.useEffect)(()=>{if(r)return;let a=new AbortController,y=setTimeout(()=>a.abort(),3e3);fetch(`https://static.intoss.app/${o}/assets/adGroupList.json`,{signal:a.signal}).then(A=>A.json()).then(l).finally(()=>{clearTimeout(y),s(!0)})},[o,r]),te.Alert.alert("AdGroupProvider",`initialized: ${r}, appName: ${o}`),r?(0,re.jsx)(oe.Provider,{value:f,children:t}):null},W=()=>(0,p.useContext)(oe);var v=require("@apps-in-toss/framework"),u=require("react"),K=({primaryAdGroup:e,secondaryAdGroup:t,onShowAd:o,onDissmissAd:i})=>{let[r,s]=(0,u.useState)(!1),[n,l]=(0,u.useState)(!1),[d,m]=(0,u.useState)(),[f,a]=(0,u.useState)(null),y=(0,u.useCallback)(E=>new Promise(_=>{let F=v.GoogleAdMob.loadAppsInTossAdMob({options:{adGroupId:E},onEvent:V=>{switch(V.type){case"loaded":_([!0,F]);break}},onError:()=>_([!1,F])})}),[]),A=(0,u.useCallback)(async()=>{if(v.GoogleAdMob.loadAppsInTossAdMob.isSupported()!==!0){s(!0);return}if(n)return;let[E,_]=await y(e.id);if(E){s(!0),l(!0),m(e.id),a(()=>_);return}if(_(),!t){s(!0);return}let[F,V]=await y(t.id);if(F){s(!0),l(!0),m(t.id),a(()=>V);return}V(),s(!0)},[e,t,n,y]),S=(0,u.useCallback)(()=>{f?.(),l(!1),m(void 0),a(null)},[f]),Pe=(0,u.useCallback)(()=>{if(v.GoogleAdMob.loadAppsInTossAdMob.isSupported()!==!0){o?.(),i?.();return}if(!n||!d){o?.(),i?.();return}v.GoogleAdMob.showAppsInTossAdMob({options:{adGroupId:d},onEvent:E=>{switch(E.type){case"show":(d===e.id&&e.type==="interstitial"||d===t?.id&&t.type==="interstitial")&&o?.();break;case"failedToShow":o?.(),S();break;case"dismissed":i?.(),S();break;case"userEarnedReward":o?.();break}},onError:()=>{o?.(),S()}})},[n,d,e,t,o,i,S]);return(0,u.useEffect)(()=>{d||A()},[d,A]),(0,u.useEffect)(()=>()=>S(),[]),{initialized:r,adLoaded:n,showAd:Pe}};var ne=require("@tanstack/react-query"),P=require("react"),se=require("react/jsx-runtime"),ie=(0,P.createContext)({isPreparing:!0,isLoggedIn:!1,retry:()=>Promise.resolve()}),L=({children:e})=>{let{data:t,isFetching:o,refetch:i}=(0,ne.useQuery)({queryKey:["/my/user"]}),r=(0,P.useMemo)(()=>({isPreparing:o,isLoggedIn:!!t?.user?.id,retry:i}),[t,o,i]);return(0,se.jsx)(ie.Provider,{value:r,children:e})},T=()=>(0,P.useContext)(ie);var R=require("@apps-in-toss/framework");var ae=require("@apps-in-toss/framework");var pe=require("es-toolkit/string"),c=require("react"),ue=require("react-native"),de=require("react/jsx-runtime"),Me="@auth/token",le=(0,c.createContext)({fetcher:fetch,setToken:()=>null}),D=e=>Array.isArray(e)?e.map(D):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,o])=>[(0,pe.camelCase)(t),D(o)])):e,G=({baseUrl:e,children:t})=>{let{appName:o,apiEndpoint:i}=h(),[r,s]=(0,c.useState)(null),[n,l]=(0,c.useState)(!1),d=(0,c.useCallback)((m,f)=>fetch(`${e??i}/${o}${m}`,{...f,headers:{"Content-Type":"application/json",...f?.headers,...r?{Authorization:`Bearer ${r}`}:{}}}).then(a=>a.json()).then(a=>D(a)),[o,i,r,e]);return(0,c.useEffect)(()=>{ae.Storage.getItem(Me).then(s).finally(()=>l(!0))},[]),ue.Alert.alert("FetcherProvider",`initialized: ${n}, apiEndpoint: ${i}`),(0,de.jsx)(le.Provider,{value:{fetcher:d,setToken:s},children:n?t:null})},g=()=>(0,c.useContext)(le);var M=require("react"),w=(e,t,o)=>{let{displayName:i}=o??{},r=(0,M.memo)(t),s=(0,M.memo)(n=>(0,M.createElement)(r,e(n)));return s.ViewComponent=r,i&&(s.displayName=i,s.ViewComponent.displayName=`${i}View`),s};var he=require("@tanstack/react-query");var ce=require("@tanstack/react-query"),me=require("react");var fe=({children:e})=>{let{fetcher:t}=g();return{queryClient:(0,me.useMemo)(()=>new ce.QueryClient({defaultOptions:{queries:{queryFn:({queryKey:i})=>t(i[0])}}}),[t]),children:e}};var ge=require("react/jsx-runtime"),z=w(fe,({queryClient:e,children:t})=>(0,ge.jsx)(he.QueryClientProvider,{client:e,children:t}));var Ce=require("@tanstack/react-query"),xe=require("react");var we="@auth/token",Y=({onSuccess:e})=>{let{retry:t}=T(),{fetcher:o,setToken:i}=g(),r=(0,Ce.useMutation)({mutationFn:async n=>o("/my/sessions",{method:"POST",body:JSON.stringify(n)}),onSuccess:async n=>{i(n.token),await R.Storage.setItem(we,n.token),await t(),e?.()}});return{signInWithToss:(0,xe.useCallback)(async()=>{let{authorizationCode:n,referrer:l}=await(0,R.appLogin)();r.mutate({authorizationCode:n,referrer:l})},[r]),isLoading:r.isPending}};var $=e=>Math.floor((e+324e5)/864e5);var Q=e=>(e+3)%7;var U=e=>Math.floor((e+324e5)%864e5/36e5);var q=e=>Math.floor((e+324e5)%36e5/6e4);var H=e=>Math.floor((e+3)/7);var J=require("@apps-in-toss/framework"),C=require("react"),j=require("react-native"),B=e=>{let[t,o]=(0,C.useState)(),[i,r]=(0,C.useState)(!0),s=(0,C.useCallback)(n=>(o(n),j.DeviceEventEmitter.emit(e,n),J.Storage.setItem(e,JSON.stringify({value:n}))),[e]);return(0,C.useEffect)(()=>{r(!0),J.Storage.getItem(e).then(l=>{try{o(l===null?void 0:JSON.parse(l).value)}catch{o(void 0)}finally{r(!1)}});let n=j.DeviceEventEmitter.addListener(e,o);return()=>n.remove()},[e]),[t,s,i]};0&&(module.exports={AdGroupProvider,AuthStateProvider,ConfigProvider,FetcherProvider,QueryProvider,bind,calculateDay,calculateDayOfWeek,calculateHour,calculateMinute,calculateWeek,useAdGroup,useAdvertisement,useAuthState,useConfig,useFetcher,useSignInWithToss,useStorage});
package/dist/index.d.cts DELETED
@@ -1,103 +0,0 @@
1
- import * as react from 'react';
2
- import { FC, PropsWithChildren } from 'react';
3
- import * as _tanstack_query_core from '@tanstack/query-core';
4
-
5
- type Props$5 = PropsWithChildren<{
6
- initial: Record<string, string>;
7
- }>;
8
- declare const AdGroupProvider: FC<Props$5>;
9
- declare const useAdGroup: () => {
10
- getInterstitialAdGroup: (key: string) => {
11
- id: string;
12
- type: "interstitial";
13
- };
14
- getRewardedAdGroup: (key: string) => {
15
- id: string;
16
- type: "rewarded";
17
- };
18
- };
19
-
20
- type Props$4 = {
21
- primaryAdGroup: {
22
- id: string;
23
- type: "rewarded" | "interstitial";
24
- };
25
- secondaryAdGroup?: {
26
- id: string;
27
- type: "rewarded" | "interstitial";
28
- };
29
- onShowAd?: () => void;
30
- onDissmissAd?: () => void;
31
- };
32
- declare const useAdvertisement: ({ primaryAdGroup, secondaryAdGroup, onShowAd, onDissmissAd, }: Props$4) => {
33
- initialized: boolean;
34
- adLoaded: boolean;
35
- showAd: () => void;
36
- };
37
-
38
- type AuthStateContextValues = {
39
- isPreparing: boolean;
40
- isLoggedIn: boolean;
41
- retry: () => Promise<unknown>;
42
- };
43
- type Props$3 = PropsWithChildren<unknown>;
44
- declare const AuthStateProvider: FC<Props$3>;
45
- declare const useAuthState: () => AuthStateContextValues;
46
-
47
- type Props$2 = {
48
- onSuccess?: () => void;
49
- };
50
- declare const useSignInWithToss: ({ onSuccess }: Props$2) => {
51
- signInWithToss: () => Promise<void>;
52
- isLoading: boolean;
53
- };
54
-
55
- declare const calculateDay: (timestamp: number) => number;
56
-
57
- declare const calculateDayOfWeek: (day: number) => number;
58
-
59
- declare const calculateHour: (timestamp: number) => number;
60
-
61
- declare const calculateMinute: (timestamp: number) => number;
62
-
63
- declare const calculateWeek: (day: number) => number;
64
-
65
- type ConfigContextValues = {
66
- appName: string;
67
- apiEndpoint: string;
68
- runningEnvironment: "local" | "preview" | "production";
69
- };
70
- type Props$1 = PropsWithChildren<Pick<ConfigContextValues, "appName">>;
71
- declare const ConfigProvider: FC<Props$1>;
72
- declare const useConfig: () => ConfigContextValues;
73
-
74
- type FetcherContextValues = {
75
- fetcher: <T = Record<string, string>>(...args: Parameters<typeof fetch>) => Promise<T>;
76
- setToken: (value: string) => void;
77
- };
78
- type Props = PropsWithChildren<{
79
- baseUrl?: string;
80
- }>;
81
- declare const FetcherProvider: FC<Props>;
82
- declare const useFetcher: () => FetcherContextValues;
83
-
84
- declare const QueryProvider: react.FC<{
85
- children?: react.ReactNode | undefined;
86
- }> & {
87
- ViewComponent: react.FC<{
88
- queryClient: _tanstack_query_core.QueryClient;
89
- children: react.ReactNode;
90
- } & Record<string, unknown>>;
91
- };
92
-
93
- declare const useStorage: <Value>(key: string) => [Value | undefined, (value: Value) => Promise<void>, boolean];
94
-
95
- type ViewModelType<ViewModelProps, ViewModelResult> = (props: ViewModelProps) => ViewModelResult;
96
- type Options = {
97
- displayName?: string;
98
- };
99
- declare const bind: <ViewModelProps extends Record<string, unknown>, ViewModelResult>(useViewModel: ViewModelType<ViewModelProps, ViewModelResult>, ViewComponent: FC<ViewModelResult>, options?: Options) => FC<ViewModelProps> & {
100
- ViewComponent: FC<ViewModelResult & Record<string, unknown>>;
101
- };
102
-
103
- export { AdGroupProvider, type AuthStateContextValues, AuthStateProvider, ConfigProvider, FetcherProvider, QueryProvider, bind, calculateDay, calculateDayOfWeek, calculateHour, calculateMinute, calculateWeek, useAdGroup, useAdvertisement, useAuthState, useConfig, useFetcher, useSignInWithToss, useStorage };