bwbr / people

https://bwbr.github.io/people
GNU General Public License v3.0
0 stars 0 forks source link

Criar ObjectStore em TypeScript através do IndexedDB #57

Closed Th2y closed 3 years ago

Th2y commented 3 years ago

Em js, o código seria esse:

var stores = ['formacoes'];
var version = 1;
var dbName = 'Thayane'

class ConnectionFactory{
    constructor(){
        throw new Error("Não é possível criar instâncias de ConnectionFactory!");        
    }

    static getConnection(){
        return new Promise((resolve, reject) => {
            let openRequest = window.indexedDB.open(dbName, version);

            openRequest.onupgradeneeded = e => {
                ConnectionFactory._criarStores(e.target.result);
            };

            openRequest.onsuccess = e => {
                resolve(e.target.result);
            };

            openRequest.onerror = e => {
                console.log(e.target.error);

                reject(e.target.error.name);
            };
        })
    }

    static _criarStores(connection){        
        stores.forEach(store => {
            if(connection.objectStoreNames.contains(store)){
                connection.deleteObjectStore(store);
                console.log("Apagando pois já existe...");
            }

            connection.createObjectStore(store, {autoIncrement: true});
        })

    }
}

Porém, em ts ele diz que as propriedades "result" e "error" não existem no tipo EventTarget (do "e.target"), tentei contornar utilizando o let target: any = e.target;, substituindo os locais onde tem "e.target" por "target" porém apenas deixa de dar erro no VSCode e quando compila, passa a dar erro no console

Th2y commented 3 years ago

No ts, o código está assim:

var stores = ['formacoes'];
var version = 2;
var dbName = 'Thayane'

export class ConnectionFactory{
    constructor(){
        throw new Error("Não é possível criar instâncias de ConnectionFactory!");        
    }

    static getConnection(){
        return new Promise((resolve, reject) => {
            let openRequest = window.indexedDB.open(dbName, version);

            openRequest.onupgradeneeded = e => {
                let target: any = e.target;
                ConnectionFactory._criarStores(target.result);
            };

            openRequest.onsuccess = e => {
                let target: any = e.target;
                resolve(target.result);
            };

            openRequest.onerror = e => {
                let target: any = e.target;
                console.log(target.error);

                reject(target.error.name);
            };
        })
    }

    private static _criarStores(connection: any){        
        stores.forEach(store => {
            if(connection.objectStoreNames.contains(store)){
                connection.deleteObjectStore(store);
                console.log("Apagando pois já existe...");
            }

            connection.createObjectStore(store, {autoIncrement: true});
        })        
    }
}
josimarsts commented 3 years ago

Thay depois coloca o erro que aparece no terminal ou console.

Th2y commented 3 years ago

Erro quando uso esse ts:

Uncaught ReferenceError: ConnectionFactory is not defined
    at <anonymous>:1:1

Erros quando tento usar o ts da mesma forma que o js:

 Property 'result' does not exist on type 'EventTarget'.
 Property 'error' does not exist on type 'EventTarget'.
Th2y commented 3 years ago

Consegui resolver o problema, para isso, fiz:

var ConnectionFactory = (function(){
    //var stores = ['formacoes', 'skills']
    var stores = ['formacoes'];
    var version = 2;
    var dbName = 'Thayane';

    var connection:any = null;

    return class ConnectionFactory{
        constructor(){
            throw new Error("Não é possível criar instâncias de ConnectionFactory!");        
        }

        static getConnection(){
            return new Promise((resolve, reject) => {
                if (!window.indexedDB)
                    window.alert("Seu navegador não suporta uma versão estável do IndexedDB. Alguns recursos não estarão disponíveis.");

                let openRequest = window.indexedDB.open(dbName, version);

                openRequest.onupgradeneeded = e => {
                    let target: any = e.target;
                    ConnectionFactory._criarStores(target.result);
                };

                openRequest.onsuccess = e => {
                    let target: any = e.target;

                    if(!connection)
                        connection = target.result;

                    resolve(connection);
                };

                openRequest.onerror = e => {
                    let target: any = e.target;
                    alert("Não usa IndexedDB?!");
                    console.log(target.error);
                    reject(target.error.name);
                };
            })
        }

        private static _criarStores(connection: any){        
            stores.forEach(store => {
                if(connection.objectStoreNames.contains(store)){
                    connection.deleteObjectStore(store);
                    console.log("Apagando pois já existe...");
                }

                connection.createObjectStore(store, {autoIncrement: true});
            })        
        }
    }
})();