thwDev

Hello, I have been working with web and application development since 2017. This site is a portfolio reference for different projects I have worked on, personal and professional.

Some of my projects are listed on my portfolio page. I also have a couple projects on my GitHub repo and I'm hoping to add more repositories soon.

I currently work as a freelance developer, on a variety of different projects, leveraging AI through use of python programming with OpenAI python libraries as well as general automation of tasks involved in project development, using mostly a mix of python and bash scripting to achieve desired outcomes. I have experience with HTML, CSS, JavaScript, NodeJS, TypeScript, Angular, Vue, Electron, Wordpress, PHP, JAVA, Python, Django, Bash Scripting and Linux Terminal.

If you would like to contact me with any question, please feel free to send me a message via my LinkedIn.


let t1 = document.querySelector("#p1");
let t2 = document.querySelector("#p2");
let t3 = document.querySelector("#p3");
let t4 = document.querySelector("#p4");

let w1 = t1.innerText;
t1.innerText="";
let w2 = t2.innerText;
t2.innerText="";
let w3 = t3.innerText;
t3.innerText="";
let w4 = t4.innerText;
t4.innerText="";

$('.type-text').show();

function scrollToBottom(element) {
    $(element).scrollTop($(element)[0].scrollHeight);
}

var observeElement = "main"

var observer = new MutationObserver(function(mutations) {
    mutations.forEach(function(mutation) {
        if (mutation.type === "characterData" || mutation.target.nodeType === 3) {
            scrollToBottom(observeElement);
        }
    });
});

observer.observe($(observeElement)[0], { characterData: true, childList: true, subtree: true });

let p = (words, target) => {
    return new Promise(resolve => {
        let i = 0;

        let textNode = target.firstChild && target.firstChild.nodeType === 3
            ? target.firstChild
            : target.appendChild(document.createTextNode(''));

        let typeLetter = (w, t) => {
            let ws = w.split("");
            if (i < ws.length) {
                let time = 50;
                i == 0 || ws[i - 1] == "." ? time = 500 : null;
                ws[i - 1] == "," ? time = 250 : null;
                setTimeout(() => {
                    textNode.nodeValue += ws[i];
                    i++;
                    typeLetter(w, t);
                }, time);
            } else {
                resolve(true);
            }
        }
        typeLetter(words, target);
    });
};
let replaceNth = (target, searchterm, replacement, occurence) => {
    i = 0;
    target.innerHTML = target.innerHTML.replace(RegExp(searchterm, 'g'), (match) => {
        i++
        return (i === occurence ? replacement : match)
    })
}
p(w1, t1)
    .then(() => p(w2, t2))
    .then(() => p(w3, t3))
    .then(() => p(w4, t4))
    .then(() => {
        return new Promise(resolve => {
            replaceNth(p2, 'portfolio', `portfolio`, 1);
            replaceNth(p2, 'GitHub', `GitHub`, 1);
            resolve(true);
        })
    })
    .then(() => {
        return new Promise(resolve => {
            replaceNth(p4, 'contact', `contact`, 2);
            replaceNth(p4, 'LinkedIn', `LinkedIn`, 1);
            resolve(true);
        })
    })`