123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- import { fetchList, fetchStatistic } from '@api/statistics';
- import { StoreType, storage } from 'src/storage';
- const NAMESPACE = 'statistics';
- function saveData<T>(key: string, data: T) {
- const namespacedKey = `${NAMESPACE}:${key}`;
- const jsonData = JSON.stringify(data);
- storage.set(namespacedKey, jsonData);
- }
- function loadData<T>(key: string): T | null {
- const namespacedKey = `${NAMESPACE}:${key}`;
- const jsonData = storage.get(namespacedKey, StoreType.STRING) as string;
- return jsonData ? JSON.parse(jsonData) : null;
- }
- function structureList(listData: Sublist[]) {
- const structuredData: StructuredData = {};
- const baseCategoryName = 'NOMADS STATISTICS';
- const list = [];
- listData.forEach((category) => {
- const categoryName = category.name.split('<br/>')[0];
- if (categoryName === baseCategoryName) {
- if (!structuredData[baseCategoryName]) {
- structuredData[baseCategoryName] = {
- name: baseCategoryName,
- sublists: []
- };
- }
- const descriptor = category.name.split('<br/>')[1].replace(/<[^>]*>?/gm, '');
- const sublist: Sublist | null =
- structuredData[baseCategoryName].sublists?.find((el) => el.name === descriptor) || null;
- if (!sublist) {
- structuredData[baseCategoryName].sublists?.push({
- name: descriptor,
- list: category.list.map((item) => ({
- name: item.name,
- url1: item.url1,
- url2: item.url2 || null
- }))
- });
- }
- } else {
- list.push(category);
- }
- });
- structuredData[baseCategoryName] && list.push(structuredData[baseCategoryName]);
- saveData('list', list);
- }
- export async function fetchAndSaveStatistics(token: string) {
- const list = await fetchList(token);
- if (list && list.result === 'OK') {
- structureList(list.data);
- for (const category of list.data) {
- for (const item of category.list) {
- const statsData = await fetchStatistic(token, item.url1, item.url2 ?? 'null');
- if (statsData && statsData.result === 'OK') {
- const statsKey = item.url2
- ? `stats_${item.url1}_${item.url2}`
- : `stats_${item.url1}`;
- saveData(statsKey, JSON.stringify(statsData.data));
- }
- }
- }
- }
- }
- export function getStatistic(url1: string, url2?: string | null): Statistic | null {
- const statsKey = `stats_${url1}${url2 ? `_${url2}` : ''}`;
- return loadData<Statistic>(statsKey);
- }
- export function getList(): List | null {
- return loadData<List>('list');
- }
- interface ListData {
- name: string;
- url1: string;
- url2?: string | null;
- }
- interface List {
- name: string;
- list?: ListData[];
- sublists?: Sublist[];
- }
- interface Sublist {
- name: string;
- list: ListData[];
- }
- interface StructuredData {
- [key: string]: List;
- }
- interface Statistic {
- data: {
- url1: string;
- url2: string;
- type: number;
- name: string;
- comment: string;
- ranking: Type1[] | Type2[] | Type3[];
- }[];
- }
- interface Type1 {
- region_id: number;
- cnt: number;
- region_name: string;
- country: string;
- flag: string;
- }
- interface Type2 {
- cnt: number;
- mega_id: number;
- mega_name: string;
- dare_name: string;
- dare_flag: string;
- dare_id: number;
- }
- interface Type3 {
- year: number;
- user: number;
- cnt: number;
- first_name: string;
- last_name: string;
- flag: string;
- }
|