@nakamura-123/pages 0.1.45 → 0.1.47
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/component/Coin/CoinCheck.d.ts +1 -1
- package/dist/component/Coin/CoinCheck.js +19 -21
- package/dist/component/Coin/CoinFnc.d.ts +1 -1
- package/dist/component/Coin/CoinFnc.js +2 -2
- package/dist/component/Grade/ShareBtn.js +2 -2
- package/dist/component/OnlineInput/PasswardModal.js +2 -2
- package/dist/component/OnlineInput/PasswordIdModal.js +2 -2
- package/dist/functions/badgeDailyFnc.d.ts +1 -0
- package/dist/functions/badgeDailyFnc.js +21 -2
- package/dist/functions/badgeFnc.d.ts +1 -1
- package/dist/functions/badgeFnc.js +9 -9
- package/dist/functions/createQuizFncD.d.ts +4 -11
- package/dist/functions/gradeFnc.d.ts +1 -0
- package/dist/functions/gradeFnc.js +27 -8
- package/dist/functions/oldStorageFnc.js +15 -17
- package/dist/functions/questionFilterD.d.ts +4 -5
- package/dist/functions/questionFilterJ.d.ts +4 -5
- package/dist/functions/tagFncD.js +8 -8
- package/dist/functions/tagFncJ.js +3 -3
- package/dist/functions/testFnc.js +3 -4
- package/dist/page/BadgePage.js +42 -1
- package/dist/page/CoinPage.js +2 -2
- package/dist/page/GetBadgePage.js +5 -4
- package/dist/page/HomePage.js +2 -2
- package/dist/page/ReportPage.js +2 -2
- package/dist/quiz/explain/ExplainLogic.js +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Storage } from "@nakamura-123/types";
|
|
2
2
|
export declare const coinCheckFnc: import("@reduxjs/toolkit").AsyncThunk<void, string, {
|
|
3
3
|
state?: unknown;
|
|
4
|
-
dispatch?: import("redux").Dispatch
|
|
4
|
+
dispatch?: import("redux").Dispatch;
|
|
5
5
|
extra?: unknown;
|
|
6
6
|
rejectValue?: unknown;
|
|
7
7
|
serializedErrorType?: unknown;
|
|
@@ -9,8 +9,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g =
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
13
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
14
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
15
|
function step(op) {
|
|
16
16
|
if (f) throw new TypeError("Generator is already executing.");
|
|
@@ -42,26 +42,24 @@ var toolkit_1 = require("@reduxjs/toolkit");
|
|
|
42
42
|
var CoinFnc_1 = require("./CoinFnc");
|
|
43
43
|
var stores_1 = require("@nakamura-123/stores");
|
|
44
44
|
// 00.メイン関数
|
|
45
|
-
exports.coinCheckFnc = (0, toolkit_1.createAsyncThunk)("coin/check", function (
|
|
46
|
-
var
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
});
|
|
45
|
+
exports.coinCheckFnc = (0, toolkit_1.createAsyncThunk)("coin/check", function (allFreeId_1, _a) { return __awaiter(void 0, [allFreeId_1, _a], void 0, function (allFreeId, _b) {
|
|
46
|
+
var receipts, isExistedId;
|
|
47
|
+
var dispatch = _b.dispatch;
|
|
48
|
+
return __generator(this, function (_c) {
|
|
49
|
+
switch (_c.label) {
|
|
50
|
+
case 0: return [4 /*yield*/, (0, CoinFnc_1.restorePurchases)(dispatch, false)];
|
|
51
|
+
case 1:
|
|
52
|
+
receipts = _c.sent();
|
|
53
|
+
isExistedId = hasPurchasedItems(receipts, allFreeId);
|
|
54
|
+
if (!isExistedId) {
|
|
55
|
+
// 返金などをされていて、flaseの場合、このIDのアイテムを削除し、store更新
|
|
56
|
+
stores_1.coinStorage.removePurchasedItem(allFreeId);
|
|
57
|
+
dispatch({ type: "setting/updateAllFreeState", payload: "none" });
|
|
58
|
+
}
|
|
59
|
+
return [2 /*return*/];
|
|
60
|
+
}
|
|
63
61
|
});
|
|
64
|
-
});
|
|
62
|
+
}); });
|
|
65
63
|
// 91. 復元を行い、チェックが必要か判定
|
|
66
64
|
var isCheckRequired = function (allFreeState, lastCheckedDate, isCompoleteFree) {
|
|
67
65
|
if (isCompoleteFree)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import RNIap, {
|
|
1
|
+
import RNIap, { ProductPurchase } from "react-native-iap";
|
|
2
2
|
import { Storage } from "@nakamura-123/types";
|
|
3
3
|
export declare const initializeIAP: (paymentItems: string[] | undefined, setProducts: (products: RNIap.Product[]) => void, setLoading: (loading: boolean) => void) => Promise<void>;
|
|
4
4
|
export declare const handlePurchase: (productId: string, dispatch: (action: any) => void) => Promise<ProductPurchase | null>;
|
|
@@ -9,8 +9,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g =
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
13
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
14
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
15
|
function step(op) {
|
|
16
16
|
if (f) throw new TypeError("Generator is already executing.");
|
|
@@ -9,8 +9,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g =
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
13
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
14
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
15
|
function step(op) {
|
|
16
16
|
if (f) throw new TypeError("Generator is already executing.");
|
|
@@ -32,8 +32,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
32
32
|
});
|
|
33
33
|
};
|
|
34
34
|
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
35
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
36
|
-
return g =
|
|
35
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
36
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
37
37
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
38
38
|
function step(op) {
|
|
39
39
|
if (f) throw new TypeError("Generator is already executing.");
|
|
@@ -32,8 +32,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
32
32
|
});
|
|
33
33
|
};
|
|
34
34
|
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
35
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
36
|
-
return g =
|
|
35
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
36
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
37
37
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
38
38
|
function step(op) {
|
|
39
39
|
if (f) throw new TypeError("Generator is already executing.");
|
|
@@ -12,4 +12,5 @@ type DailyData = {
|
|
|
12
12
|
export declare const checkDaily: (dailyData: DailyData, info: BadgeInfo) => boolean;
|
|
13
13
|
export declare const addDailyBadgeTitleInfo: (badge: BadgeInfo, t: any) => BadgeInfo;
|
|
14
14
|
export declare const getDailyLogData: (DailyDB: RD) => DailyData;
|
|
15
|
+
export declare const getBestDailyLogData: (DailyDB: RD) => DailyData;
|
|
15
16
|
export {};
|
|
@@ -11,7 +11,7 @@ var __assign = (this && this.__assign) || function () {
|
|
|
11
11
|
return __assign.apply(this, arguments);
|
|
12
12
|
};
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.getDailyLogData = exports.addDailyBadgeTitleInfo = exports.checkDaily = void 0;
|
|
14
|
+
exports.getBestDailyLogData = exports.getDailyLogData = exports.addDailyBadgeTitleInfo = exports.checkDaily = void 0;
|
|
15
15
|
var lib_1 = require("@nakamura-123/lib");
|
|
16
16
|
var gradeFnc_1 = require("./gradeFnc");
|
|
17
17
|
// デイリーバッジの取得条件を確認
|
|
@@ -39,7 +39,7 @@ var addDailyBadgeTitleInfo = function (badge, t) {
|
|
|
39
39
|
return __assign(__assign({}, badge), { title: title, subject: "daily", category: fnc });
|
|
40
40
|
};
|
|
41
41
|
exports.addDailyBadgeTitleInfo = addDailyBadgeTitleInfo;
|
|
42
|
-
//
|
|
42
|
+
// # 今日時点のデイリーログの情報を取得
|
|
43
43
|
var getDailyLogData = function (DailyDB) {
|
|
44
44
|
// 今日の問題数取得
|
|
45
45
|
var today = lib_1.timeFnc.getToday();
|
|
@@ -61,3 +61,22 @@ var getDailyLogData = function (DailyDB) {
|
|
|
61
61
|
};
|
|
62
62
|
};
|
|
63
63
|
exports.getDailyLogData = getDailyLogData;
|
|
64
|
+
// # 過去も含めてすべてのデイリーログ情報からベストデータを取得
|
|
65
|
+
var getBestDailyLogData = function (DailyDB) {
|
|
66
|
+
// rd 1. 1日の最高問題数
|
|
67
|
+
var maxQuizCntLog = (0, gradeFnc_1.findMaxQuizCntLog)(DailyDB);
|
|
68
|
+
var maxQuizCnt = maxQuizCntLog ? maxQuizCntLog.quizCnt : 0;
|
|
69
|
+
// rd 2. 週間の最高問題数
|
|
70
|
+
var weeklyMaxQuizCnt = (0, gradeFnc_1.getMaxWeeklyQuizCnt)(DailyDB);
|
|
71
|
+
// rd 3. 通算問題数を取得
|
|
72
|
+
var totalCnt = (0, gradeFnc_1.getTotalQuizCnt)(DailyDB);
|
|
73
|
+
// rd 4. 通算学習日数を取得
|
|
74
|
+
var longestConsecutiveDays = (0, gradeFnc_1.getLongestConsecutiveStudyDays)(DailyDB);
|
|
75
|
+
return {
|
|
76
|
+
today: maxQuizCnt,
|
|
77
|
+
weekly: weeklyMaxQuizCnt,
|
|
78
|
+
total: totalCnt,
|
|
79
|
+
consecutive: longestConsecutiveDays,
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
exports.getBestDailyLogData = getBestDailyLogData;
|
|
@@ -11,5 +11,5 @@ type Selected = QSelected.Selected;
|
|
|
11
11
|
type BadgeInfo = badgeSet.BadgeInfo;
|
|
12
12
|
export declare const checkBasicBadge: (BadgeDB: RB, MiniDB: RM, selected: Selected) => BadgeInfo[];
|
|
13
13
|
export declare const checkTestBadge: (BadgeDB: RB, TestDB: RT, selected: Selected) => BadgeInfo[];
|
|
14
|
-
export declare const checkDailyLogBadge: (BadgeDB: RB, DailyLogDB: RD, t: any) => BadgeInfo[];
|
|
14
|
+
export declare const checkDailyLogBadge: (BadgeDB: RB, DailyLogDB: RD, t: any, isPast?: boolean) => BadgeInfo[];
|
|
15
15
|
export {};
|
|
@@ -51,20 +51,20 @@ var checkTestBadge = function (BadgeDB, TestDB, selected) {
|
|
|
51
51
|
};
|
|
52
52
|
exports.checkTestBadge = checkTestBadge;
|
|
53
53
|
// # 3.デイリーログのバッジを取得
|
|
54
|
-
var checkDailyLogBadge = function (BadgeDB, DailyLogDB, t) {
|
|
55
|
-
|
|
54
|
+
var checkDailyLogBadge = function (BadgeDB, DailyLogDB, t, isPast) {
|
|
55
|
+
if (isPast === void 0) { isPast = false; }
|
|
56
|
+
// rd 01.未取得のバッジinfoを配列で取得
|
|
56
57
|
var collectedBadges = (0, badgeFilter_1.filterDailyLogBadge)(BadgeDB);
|
|
57
58
|
var missingBadgeInfos = (0, badgeBasicFnc_1.getMissingDailyBadgeInfos)(collectedBadges);
|
|
58
|
-
//
|
|
59
|
-
var dailyLogData =
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
// ### 03.取得条件を満たしているバッジを判定
|
|
59
|
+
// rd 02.デイリーログの情報を取得(今日の問題数、今週の問題数、累計問題数、連続日数)
|
|
60
|
+
var dailyLogData = isPast
|
|
61
|
+
? (0, badgeDailyFnc_1.getBestDailyLogData)(DailyLogDB)
|
|
62
|
+
: (0, badgeDailyFnc_1.getDailyLogData)(DailyLogDB);
|
|
63
|
+
// rd 03.取得条件を満たしているバッジを判定
|
|
64
64
|
var eligibleBadges = missingBadgeInfos.filter(function (info) {
|
|
65
65
|
return (0, badgeDailyFnc_1.checkDaily)(dailyLogData, info);
|
|
66
66
|
});
|
|
67
|
-
//
|
|
67
|
+
// rd 04.タイトルなどの必要情報を挿入
|
|
68
68
|
eligibleBadges = eligibleBadges.map(function (badge) {
|
|
69
69
|
return (0, badgeDailyFnc_1.addDailyBadgeTitleInfo)(badge, t);
|
|
70
70
|
});
|
|
@@ -1,18 +1,11 @@
|
|
|
1
|
-
import { QuizInitial } from "@nakamura-123/stores";
|
|
1
|
+
import { CfgInitial, QuizInitial } from "@nakamura-123/stores";
|
|
2
2
|
import { Store } from "@nakamura-123/types";
|
|
3
3
|
import { QRD } from "../types/filterType";
|
|
4
|
+
type startCfg = CfgInitial["startCfg"];
|
|
4
5
|
type Selected = QuizInitial["selected"];
|
|
5
|
-
export declare const getBasicQuizList: (QuestionDB: QRD, startCfg:
|
|
6
|
-
tags: import("@nakamura-123/types/dist/types/libType").LevelNames[];
|
|
7
|
-
option: import("@nakamura-123/lib/dist/config/startOption").StoreStartOptions;
|
|
8
|
-
outOfYearRange: number[];
|
|
9
|
-
}, selected: Selected) => Store.DQInStore[];
|
|
6
|
+
export declare const getBasicQuizList: (QuestionDB: QRD, startCfg: startCfg, selected: Selected) => Store.DQInStore[];
|
|
10
7
|
export declare const getMiniTestQuestions: (QuestionDB: QRD, subjectType: "unit" | "year", key: number, cnt: number, outOfYearRange: number[]) => Store.DQInStore[];
|
|
11
8
|
export declare const getTestQuestions: (QuestionDB: QRD, cnt: number) => Store.DQInStore[];
|
|
12
9
|
export declare const getTestQuestionsByUnit: (QuestionDB: QRD, cnt: number, unit: number[]) => Store.DQInStore[];
|
|
13
|
-
export declare const getBootQuestions: (QuestionDB: QRD, startCfg:
|
|
14
|
-
tags: import("@nakamura-123/types/dist/types/libType").LevelNames[];
|
|
15
|
-
option: import("@nakamura-123/lib/dist/config/startOption").StoreStartOptions;
|
|
16
|
-
outOfYearRange: number[];
|
|
17
|
-
}, outOfUnitRange: number[], outOfYearRange: number[]) => Store.DQInStore[];
|
|
10
|
+
export declare const getBootQuestions: (QuestionDB: QRD, startCfg: startCfg, outOfUnitRange: number[], outOfYearRange: number[]) => Store.DQInStore[];
|
|
18
11
|
export {};
|
|
@@ -13,5 +13,6 @@ export declare const findMaxQuizCntLog: (DailyDB: RD) => DailyLogSchema | null;
|
|
|
13
13
|
export declare const getTotalQuizCnt: (DailyLogDB: RD) => number;
|
|
14
14
|
export declare const getConsecutiveStudyDays: (DailyLogDB: RD) => number;
|
|
15
15
|
export declare const getLongestConsecutiveStudyDays: (DailyLogDB: RD) => number;
|
|
16
|
+
export declare const getMaxWeeklyQuizCnt: (DailyLogDB: RD, weeks?: number) => number;
|
|
16
17
|
export declare const promptStoreReview: () => Promise<void>;
|
|
17
18
|
export {};
|
|
@@ -32,8 +32,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
32
32
|
});
|
|
33
33
|
};
|
|
34
34
|
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
35
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
36
|
-
return g =
|
|
35
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
36
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
37
37
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
38
38
|
function step(op) {
|
|
39
39
|
if (f) throw new TypeError("Generator is already executing.");
|
|
@@ -62,10 +62,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
62
62
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
63
63
|
};
|
|
64
64
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
65
|
-
exports.promptStoreReview = exports.getLongestConsecutiveStudyDays = exports.getConsecutiveStudyDays = exports.getTotalQuizCnt = exports.findMaxQuizCntLog = exports.getWeeklyCnts = exports.formatTodayLog = void 0;
|
|
65
|
+
exports.promptStoreReview = exports.getMaxWeeklyQuizCnt = exports.getLongestConsecutiveStudyDays = exports.getConsecutiveStudyDays = exports.getTotalQuizCnt = exports.findMaxQuizCntLog = exports.getWeeklyCnts = exports.formatTodayLog = void 0;
|
|
66
66
|
var dayjs_1 = __importDefault(require("dayjs"));
|
|
67
67
|
var StoreReview = __importStar(require("expo-store-review"));
|
|
68
|
-
//
|
|
68
|
+
// # (day)指定した日の1日のログを整形して返す
|
|
69
69
|
var formatTodayLog = function (todayLog) {
|
|
70
70
|
var quizCnt = (todayLog === null || todayLog === void 0 ? void 0 : todayLog.quizCnt) || 0;
|
|
71
71
|
var targetCnt = (todayLog === null || todayLog === void 0 ? void 0 : todayLog.targetCnt) || 0;
|
|
@@ -74,7 +74,7 @@ var formatTodayLog = function (todayLog) {
|
|
|
74
74
|
return { quizCnt: quizCnt, targetCnt: targetCnt, isAchieved: isAchieved, isNotified: isNotified };
|
|
75
75
|
};
|
|
76
76
|
exports.formatTodayLog = formatTodayLog;
|
|
77
|
-
// 1週間の各日に、何問解いたかをweeklyDaysの日付から順に配列で返す。
|
|
77
|
+
// # 1週間の各日に、何問解いたかをweeklyDaysの日付から順に配列で返す。
|
|
78
78
|
var getWeeklyCnts = function (DailyLog, weeklyDays) {
|
|
79
79
|
return weeklyDays.map(function (day) {
|
|
80
80
|
var date = day.toDate();
|
|
@@ -83,20 +83,20 @@ var getWeeklyCnts = function (DailyLog, weeklyDays) {
|
|
|
83
83
|
});
|
|
84
84
|
};
|
|
85
85
|
exports.getWeeklyCnts = getWeeklyCnts;
|
|
86
|
-
// 1日の最大問題数を持つログを取得
|
|
86
|
+
// # 1日の最大問題数を持つログを取得
|
|
87
87
|
var findMaxQuizCntLog = function (DailyDB) {
|
|
88
88
|
// すべてのレコードを取得
|
|
89
89
|
var allLogs = DailyDB.sorted("quizCnt", true); // quizCntで降順にソート
|
|
90
90
|
return allLogs.length > 0 ? allLogs[0] : null; // 最初のレコードが最大値を持つ
|
|
91
91
|
};
|
|
92
92
|
exports.findMaxQuizCntLog = findMaxQuizCntLog;
|
|
93
|
-
// 全期間の問題数の通算を算出する
|
|
93
|
+
// # 全期間の問題数の通算を算出する
|
|
94
94
|
var getTotalQuizCnt = function (DailyLogDB) {
|
|
95
95
|
return DailyLogDB.reduce(function (total, log) { return total + (log.quizCnt || 0); }, 0);
|
|
96
96
|
};
|
|
97
97
|
exports.getTotalQuizCnt = getTotalQuizCnt;
|
|
98
98
|
//
|
|
99
|
-
// 連続学習日数を取得
|
|
99
|
+
// # 連続学習日数を取得
|
|
100
100
|
var getConsecutiveStudyDays = function (DailyLogDB) {
|
|
101
101
|
var today = (0, dayjs_1.default)(); // 現在の日付を取得
|
|
102
102
|
var dailyLogs = DailyLogDB.sorted("date", true); // 日付で降順にソート
|
|
@@ -141,6 +141,25 @@ var getLongestConsecutiveStudyDays = function (DailyLogDB) {
|
|
|
141
141
|
return longestStreak;
|
|
142
142
|
};
|
|
143
143
|
exports.getLongestConsecutiveStudyDays = getLongestConsecutiveStudyDays;
|
|
144
|
+
// # 指定した週数分の各週の合計問題数の最大値を返す
|
|
145
|
+
var getMaxWeeklyQuizCnt = function (DailyLogDB, weeks) {
|
|
146
|
+
if (weeks === void 0) { weeks = 20; }
|
|
147
|
+
var today = (0, dayjs_1.default)();
|
|
148
|
+
var maxCnt = 0;
|
|
149
|
+
for (var i = 0; i < weeks; i++) {
|
|
150
|
+
var weekStart = today.subtract(i, "week").startOf("week").add(1, "day");
|
|
151
|
+
var weekEnd = today.subtract(i, "week").endOf("week").add(1, "day");
|
|
152
|
+
// その週のログを抽出
|
|
153
|
+
var weekLogs = DailyLogDB.filtered("date >= $0 && date <= $1", weekStart.toDate(), weekEnd.toDate());
|
|
154
|
+
// その週のquizCnt合計
|
|
155
|
+
var weekCnt = weekLogs.reduce(function (sum, log) { return sum + (log.quizCnt || 0); }, 0);
|
|
156
|
+
if (weekCnt > maxCnt) {
|
|
157
|
+
maxCnt = weekCnt;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return maxCnt;
|
|
161
|
+
};
|
|
162
|
+
exports.getMaxWeeklyQuizCnt = getMaxWeeklyQuizCnt;
|
|
144
163
|
var promptStoreReview = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
145
164
|
var isAvailable;
|
|
146
165
|
return __generator(this, function (_a) {
|
|
@@ -9,8 +9,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g =
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
13
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
14
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
15
|
function step(op) {
|
|
16
16
|
if (f) throw new TypeError("Generator is already executing.");
|
|
@@ -194,23 +194,21 @@ var replaceOldInputData = function (realm) { return __awaiter(void 0, void 0, vo
|
|
|
194
194
|
});
|
|
195
195
|
}); };
|
|
196
196
|
// 60. inputIdの読み込み(reduxThunk)
|
|
197
|
-
var loadOldInputId = (0, toolkit_1.createAsyncThunk)("old/loadOldInputId", function (
|
|
198
|
-
var
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
if (!id)
|
|
207
|
-
return [2 /*return*/];
|
|
208
|
-
dispatch({ type: "setting/updateOldId", payload: id[0] });
|
|
197
|
+
var loadOldInputId = (0, toolkit_1.createAsyncThunk)("old/loadOldInputId", function (_1, _a) { return __awaiter(void 0, [_1, _a], void 0, function (_, _b) {
|
|
198
|
+
var id;
|
|
199
|
+
var dispatch = _b.dispatch;
|
|
200
|
+
return __generator(this, function (_c) {
|
|
201
|
+
switch (_c.label) {
|
|
202
|
+
case 0: return [4 /*yield*/, loadOldData("id")];
|
|
203
|
+
case 1:
|
|
204
|
+
id = _c.sent();
|
|
205
|
+
if (!id)
|
|
209
206
|
return [2 /*return*/];
|
|
210
|
-
|
|
211
|
-
|
|
207
|
+
dispatch({ type: "setting/updateOldId", payload: id[0] });
|
|
208
|
+
return [2 /*return*/];
|
|
209
|
+
}
|
|
212
210
|
});
|
|
213
|
-
});
|
|
211
|
+
}); });
|
|
214
212
|
// 90. 旧データの存在をMarkデータから確認
|
|
215
213
|
var existOldData = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
216
214
|
var markData;
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
+
import { CfgInitial } from "@nakamura-123/stores";
|
|
1
2
|
import { Store } from "@nakamura-123/types";
|
|
2
3
|
import { QRD } from "../types/filterType";
|
|
4
|
+
type startCfg = CfgInitial["startCfg"];
|
|
3
5
|
export declare const getUnitQuestions: (questions: QRD, unitId: number) => QRD;
|
|
4
6
|
export declare const getSubUnitQuestions: (questions: QRD, unitId: number, subUnitId: number) => QRD;
|
|
5
7
|
export declare const getYearQuestions: (questions: QRD, year: number) => QRD;
|
|
6
8
|
export declare const getSubYearQuestions: (questions: QRD, year: number, key: number) => QRD;
|
|
7
9
|
export declare const filterByOutOfYearRange: (questions: QRD, outOfYearRange: number[]) => QRD;
|
|
8
10
|
export declare const filterByOutOfUnitRange: (questions: QRD, outOfUnitRange: number[]) => QRD;
|
|
9
|
-
export declare const filterByTags: (questions: QRD, startCfg:
|
|
10
|
-
tags: import("@nakamura-123/types/dist/types/libType").LevelNames[];
|
|
11
|
-
option: import("@nakamura-123/lib/dist/config/startOption").StoreStartOptions;
|
|
12
|
-
outOfYearRange: number[];
|
|
13
|
-
}) => QRD;
|
|
11
|
+
export declare const filterByTags: (questions: QRD, startCfg: startCfg) => QRD;
|
|
14
12
|
export declare const commonFilter: (questions: Store.DQInStore[], quizCnt: number, isShuffle: boolean) => Store.DQInStore[];
|
|
13
|
+
export {};
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { QRJ } from "../types/filterType";
|
|
2
2
|
import { Db, JStore } from "@nakamura-123/types";
|
|
3
|
+
import { CfgInitial } from "@nakamura-123/stores";
|
|
4
|
+
type startCfg = CfgInitial["startCfg"];
|
|
3
5
|
export declare const getUnitQuestionsJ: (questions: QRJ, unitId: number) => QRJ;
|
|
4
6
|
export declare const getSubUnitQuestionsJ: (questions: QRJ, unitId: number, subUnitId: number) => QRJ;
|
|
5
|
-
export declare const filterByTagsJ: (questions: QRJ, startCfg:
|
|
6
|
-
tags: import("@nakamura-123/types/dist/types/libType").LevelNames[];
|
|
7
|
-
option: import("@nakamura-123/lib/dist/config/startOption").StoreStartOptions;
|
|
8
|
-
outOfYearRange: number[];
|
|
9
|
-
}, tagName: Db.SubjectTag) => QRJ;
|
|
7
|
+
export declare const filterByTagsJ: (questions: QRJ, startCfg: startCfg, tagName: Db.SubjectTag) => QRJ;
|
|
10
8
|
export declare const commonFilterJ: (questions: JStore.JQInStore[], quizCnt: number, isShuffle: boolean) => JStore.JQInStore[];
|
|
9
|
+
export {};
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// helpers.ts
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.
|
|
4
|
+
exports.getBootTagLevelCnts = exports.getSubTagLevelCnts = void 0;
|
|
5
|
+
exports.getCategoryTagLevelCntsD = getCategoryTagLevelCntsD;
|
|
6
|
+
exports.getUnitSubTagLevelCnts = getUnitSubTagLevelCnts;
|
|
7
|
+
exports.getYearSubTagLevelCnts = getYearSubTagLevelCnts;
|
|
8
|
+
exports.getCompletedTagRate = getCompletedTagRate;
|
|
9
|
+
exports.countTagsByLevel = countTagsByLevel;
|
|
10
|
+
exports.getCategoryRate = getCategoryRate;
|
|
11
|
+
exports.countTagsByLevelSelected = countTagsByLevelSelected;
|
|
5
12
|
var lib_1 = require("@nakamura-123/lib");
|
|
6
13
|
var questionFilterD_1 = require("./questionFilterD");
|
|
7
14
|
// 01_大単元のTagのレベルを取得
|
|
@@ -16,7 +23,6 @@ function getCategoryTagLevelCntsD(QuestionDB, category, type, outOfYearRange) {
|
|
|
16
23
|
: (0, questionFilterD_1.getYearQuestions)(returnQuestions, category);
|
|
17
24
|
return returnQuestions.map(function (question) { return question.tag.level; });
|
|
18
25
|
}
|
|
19
|
-
exports.getCategoryTagLevelCntsD = getCategoryTagLevelCntsD;
|
|
20
26
|
// 02_Unitの小単元のTagのレベルを取得
|
|
21
27
|
function getUnitSubTagLevelCnts(QuestionDB, unitId, subUnitId, outOfYearRange) {
|
|
22
28
|
var returnQuestions = QuestionDB;
|
|
@@ -26,12 +32,10 @@ function getUnitSubTagLevelCnts(QuestionDB, unitId, subUnitId, outOfYearRange) {
|
|
|
26
32
|
returnQuestions = (0, questionFilterD_1.getSubUnitQuestions)(returnQuestions, unitId, subUnitId);
|
|
27
33
|
return returnQuestions.map(function (question) { return question.tag.level; });
|
|
28
34
|
}
|
|
29
|
-
exports.getUnitSubTagLevelCnts = getUnitSubTagLevelCnts;
|
|
30
35
|
// 03_Yearの小単元のTagのレベルを取得
|
|
31
36
|
function getYearSubTagLevelCnts(QuestionDB, year, key) {
|
|
32
37
|
return (0, questionFilterD_1.getSubYearQuestions)(QuestionDB, year, key).map(function (question) { return question.tag.level; });
|
|
33
38
|
}
|
|
34
|
-
exports.getYearSubTagLevelCnts = getYearSubTagLevelCnts;
|
|
35
39
|
// 11_5Tagのレベルを取得。Unit(大・小単元) 、Year(大・小単元) どちらでも可。
|
|
36
40
|
var getSubTagLevelCnts = function (QuestionDB, selected, outOfYearRange) {
|
|
37
41
|
// QuestionDB をフィルタリング(共通処理)
|
|
@@ -78,7 +82,6 @@ function getCompletedTagRate(tags, onlyCnt) {
|
|
|
78
82
|
var completedTagRate = Math.round((completedTagCnt / tags.length) * 100);
|
|
79
83
|
return completedTagRate;
|
|
80
84
|
}
|
|
81
|
-
exports.getCompletedTagRate = getCompletedTagRate;
|
|
82
85
|
// 22_タグをレベル別に集計し、色と数を返す
|
|
83
86
|
function countTagsByLevel(tags) {
|
|
84
87
|
var tagInfos = lib_1.tagLevels.map(function (_a) {
|
|
@@ -88,7 +91,6 @@ function countTagsByLevel(tags) {
|
|
|
88
91
|
});
|
|
89
92
|
return tagInfos;
|
|
90
93
|
}
|
|
91
|
-
exports.countTagsByLevel = countTagsByLevel;
|
|
92
94
|
// 23_タグをレベルごとに点数化し、到達度を%で返す
|
|
93
95
|
function getCategoryRate(tags) {
|
|
94
96
|
var tagCnt = tags.length;
|
|
@@ -96,7 +98,6 @@ function getCategoryRate(tags) {
|
|
|
96
98
|
var tagPoint = tags.reduce(function (acc, tag) { return acc + POINT_LIST[tag]; }, 0);
|
|
97
99
|
return (tagPoint / (tagCnt * 5)) * 100;
|
|
98
100
|
}
|
|
99
|
-
exports.getCategoryRate = getCategoryRate;
|
|
100
101
|
// タグをレベル別に集計し、色と数を返す。また、選択すると色が変わる
|
|
101
102
|
function countTagsByLevelSelected(tags, tagActives) {
|
|
102
103
|
var tagInfos = lib_1.tagLevels.map(function (_a) {
|
|
@@ -111,4 +112,3 @@ function countTagsByLevelSelected(tags, tagActives) {
|
|
|
111
112
|
});
|
|
112
113
|
return tagInfos;
|
|
113
114
|
}
|
|
114
|
-
exports.countTagsByLevelSelected = countTagsByLevelSelected;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getTagNameFilterJ = exports.getSubTagLevelCntsJ =
|
|
3
|
+
exports.getTagNameFilterJ = exports.getSubTagLevelCntsJ = void 0;
|
|
4
|
+
exports.getCategoryTagLevelCntsJ = getCategoryTagLevelCntsJ;
|
|
5
|
+
exports.getUnitSubTagLevelCntsJ = getUnitSubTagLevelCntsJ;
|
|
4
6
|
var questionFilterJ_1 = require("./questionFilterJ");
|
|
5
7
|
// 01_大単元のTagのレベルを取得
|
|
6
8
|
function getCategoryTagLevelCntsJ(QuestionDB, category, tag) {
|
|
@@ -8,7 +10,6 @@ function getCategoryTagLevelCntsJ(QuestionDB, category, tag) {
|
|
|
8
10
|
var returnQuestions = (0, questionFilterJ_1.getUnitQuestionsJ)(QuestionDB, category);
|
|
9
11
|
return returnQuestions.map(function (question) { return question[tag].level; });
|
|
10
12
|
}
|
|
11
|
-
exports.getCategoryTagLevelCntsJ = getCategoryTagLevelCntsJ;
|
|
12
13
|
// 02_Unitの小単元のTagのレベルを取得
|
|
13
14
|
function getUnitSubTagLevelCntsJ(QuestionDB, unitId, subUnitId, tag) {
|
|
14
15
|
if (tag === void 0) { tag = "basicTag"; }
|
|
@@ -16,7 +17,6 @@ function getUnitSubTagLevelCntsJ(QuestionDB, unitId, subUnitId, tag) {
|
|
|
16
17
|
returnQuestions = (0, questionFilterJ_1.getSubUnitQuestionsJ)(returnQuestions, unitId, subUnitId);
|
|
17
18
|
return returnQuestions.map(function (question) { return question[tag].level; });
|
|
18
19
|
}
|
|
19
|
-
exports.getUnitSubTagLevelCntsJ = getUnitSubTagLevelCntsJ;
|
|
20
20
|
// 11_5Tagのレベルを取得。Unit(大・小単元) 、Year(大・小単元) どちらでも可。
|
|
21
21
|
var getSubTagLevelCntsJ = function (QuestionDB, selected) {
|
|
22
22
|
// QuestionDB をフィルタリング(共通処理)
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.getMiniTestLevelCnts = getMiniTestLevelCnts;
|
|
4
|
+
exports.getTestLevelCnts = getTestLevelCnts;
|
|
5
|
+
exports.countByLevel = countByLevel;
|
|
4
6
|
var lib_1 = require("@nakamura-123/lib");
|
|
5
7
|
function getMiniTestLevelCnts(MiniTestDB, subject, key) {
|
|
6
8
|
return MiniTestDB.filtered("subject == $0 && categoryKey == $1", subject, String(key)).map(function (item) { return item.level; });
|
|
7
9
|
}
|
|
8
|
-
exports.getMiniTestLevelCnts = getMiniTestLevelCnts;
|
|
9
10
|
function getTestLevelCnts(TestDB, subject) {
|
|
10
11
|
return TestDB.filtered("subject == $0", subject).map(function (item) { return item.level; });
|
|
11
12
|
}
|
|
12
|
-
exports.getTestLevelCnts = getTestLevelCnts;
|
|
13
13
|
// タグをレベル別に集計し、色と数を返す
|
|
14
14
|
function countByLevel(levels) {
|
|
15
15
|
var levelInfos = lib_1.scoreLevels.map(function (_a) {
|
|
@@ -19,4 +19,3 @@ function countByLevel(levels) {
|
|
|
19
19
|
});
|
|
20
20
|
return levelInfos;
|
|
21
21
|
}
|
|
22
|
-
exports.countByLevel = countByLevel;
|
package/dist/page/BadgePage.js
CHANGED
|
@@ -1,9 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
27
|
};
|
|
5
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
var react_1 =
|
|
29
|
+
var react_1 = __importStar(require("react"));
|
|
7
30
|
var react_native_1 = require("react-native");
|
|
8
31
|
var react_native_gesture_handler_1 = require("react-native-gesture-handler");
|
|
9
32
|
var common_1 = require("@nakamura-123/common");
|
|
@@ -11,10 +34,28 @@ var Badge5s_1 = __importDefault(require("../component/Basic/Badge5s"));
|
|
|
11
34
|
var lib_1 = require("@nakamura-123/lib");
|
|
12
35
|
var BasicBadge_1 = __importDefault(require("../component/Grade/BasicBadge"));
|
|
13
36
|
var react_i18next_1 = require("react-i18next");
|
|
37
|
+
var react_2 = require("@realm/react");
|
|
38
|
+
var db_1 = require("@nakamura-123/db");
|
|
39
|
+
var badgeFnc_1 = require("../functions/badgeFnc");
|
|
40
|
+
var react_redux_1 = require("react-redux");
|
|
14
41
|
// メインコンポーネント
|
|
15
42
|
var BadgePage = function (_a) {
|
|
16
43
|
var basicBadgeInfos = _a.basicBadgeInfos, testBadgeInfos = _a.testBadgeInfos;
|
|
17
44
|
var t = (0, react_i18next_1.useTranslation)().t;
|
|
45
|
+
// ## デイリーバッジの取得条件を再度確認する
|
|
46
|
+
var realm = (0, react_2.useRealm)();
|
|
47
|
+
var dispatch = (0, react_redux_1.useDispatch)();
|
|
48
|
+
var BadgeDB = (0, react_2.useQuery)(db_1.BadgeSchema);
|
|
49
|
+
var DailyLogDB = (0, react_2.useQuery)(db_1.DailyLogSchema);
|
|
50
|
+
(0, react_1.useEffect)(function () {
|
|
51
|
+
// yl 取得条件を満たしており、未取得のバッジ
|
|
52
|
+
var dailyLogBadges = (0, badgeFnc_1.checkDailyLogBadge)(BadgeDB, DailyLogDB, t, true);
|
|
53
|
+
// yl バッジをScore Storeへ保存
|
|
54
|
+
if (dailyLogBadges.length > 0) {
|
|
55
|
+
dispatch({ type: "score/replaceNotification", payload: dailyLogBadges });
|
|
56
|
+
db_1.BadgeModel.createBadge(realm, dailyLogBadges);
|
|
57
|
+
}
|
|
58
|
+
}, []);
|
|
18
59
|
return (<react_native_gesture_handler_1.ScrollView style={styles.page} contentContainerStyle={styles.container}>
|
|
19
60
|
{basicBadgeInfos.map(function (info) { return (<BasicBadge_1.default info={info} key={info.name}/>); })}
|
|
20
61
|
{testBadgeInfos.map(function (info) { return (<TestBadge5s info={info} key={info.subject}/>); })}
|
package/dist/page/CoinPage.js
CHANGED
|
@@ -32,8 +32,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
32
32
|
});
|
|
33
33
|
};
|
|
34
34
|
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
35
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
36
|
-
return g =
|
|
35
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
36
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
37
37
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
38
38
|
function step(op) {
|
|
39
39
|
if (f) throw new TypeError("Generator is already executing.");
|