Skip to content

Instantly share code, notes, and snippets.

View jussikinnula's full-sized avatar

Jussi Kinnula jussikinnula

View GitHub Profile
@jussikinnula
jussikinnula / expo-update-app-version.sh
Created December 2, 2022 06:20
Update Android and iOS app versions for Expo
#!/bin/sh
VERSION="$npm_package_version"
PLIST_BUDDY="/usr/libexec/PlistBuddy"
INFO_PLIST_PATH="./ios/epshpmobileapp/Info.plist"
APP_BUILD_GRADLE_PATH="./android/app/build.gradle"
# Ensure that PlistBuddy exists and set iOS APPLICATION_NAME
if [ -f "$PLIST_BUDDY" ]; then
if [ -f "$INFO_PLIST_PATH" ]; then
@jussikinnula
jussikinnula / useVisible.js
Created March 3, 2022 12:51
React hook to determine browser/WebView being visible or not
import { useState, useEffect } from 'react';
const isVisible = () => typeof document !== 'undefined' && document.visibilityState === 'visible';
export const useVisible = () => {
const [visible, setVisible] = useState(isVisible); // Focus for first render
useEffect(() => {
setVisible(isVisible()); // Focus for additional renders
@jussikinnula
jussikinnula / SplashScreen.java
Created February 17, 2022 15:32
Custom Capacitor (v3+) SplashScreen
package com.noona.application;
import android.app.Activity;
import android.app.Dialog;
import androidx.appcompat.app.AppCompatActivity;
import java.lang.ref.WeakReference;
public class SplashScreen {
@jussikinnula
jussikinnula / gist:ff2564d3ae3560b63fded46b8520aba6
Created August 25, 2021 05:47
LocalStorage with basic types & JSON support
const setItem = (key: string, value: any) => {
const payload: any = {};
if (!value) {
payload.nullValue = true;
} else if (typeof value === 'number') {
payload.numberValue = Number(value);
} else if (typeof value === 'string') {
payload.stringValue = String(value);
} else {
@jussikinnula
jussikinnula / create.ts
Last active August 10, 2020 06:24
MongoClient possible memory leak
import faker from 'faker';
import mongo from './mongo';
const [collectionName = 'items', size = 1] = process.argv.slice(2);
(async function create() {
const db = await mongo();
if (!db) {
throw new Error('No database connection');
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BackgroundMusicPlayer : MonoBehaviour
{
private AudioSource Empty;
private AudioSource PartAAmbience;
private AudioSource PartABass;
private AudioSource PartAFemaleSinger;
@jussikinnula
jussikinnula / hello-7n-from-angular-finland.html
Created September 16, 2018 08:40
Angular Finland x 7N meetup T-shirt (in code)
<!DOCTYPE html>
<html>
<head>
<script src="https://npmcdn.com/core-js/client/shim.min.js"></script>
<script src="https://npmcdn.com/zone.js@0.6.21"></script>
<script src="https://npmcdn.com/reflect-metadata@0.1.3"></script>
<script src="https://npmcdn.com/rxjs@5.0.0-beta.12/bundles/Rx.min.js"></script>
<script src="https://npmcdn.com/@angular/core@2.0.0"></script>
<script src="https://npmcdn.com/@angular/common@2.0.0"></script>
<script src="https://npmcdn.com/@angular/compiler@2.0.0"></script>
@jussikinnula
jussikinnula / postcss-modules-fix-import-styles-loader.ts
Created July 9, 2018 12:35
postcss-modules generates JSON's for the styles, which need to be used in React components
// Use in React components like:
// const styles = require('./styles.css');
export default function loader(source, sourceMap) {
const newSource = source.replace(/^const +[a-zA-Z]+ += +require\((.*)\.[css|sass|scss|less|styl]\'\);$/gm, input => {
const variable = input.split(' ')[1];
const file = input.match(/\(\'(.*)\'\)/)[1];
const output = `import '${file}';` + '\n' + `const ${variable} = require('${file}.json');`;
return output;
});
@jussikinnula
jussikinnula / patchUser.ts
Last active April 25, 2018 13:54
Auth0 update E-mail and phone number for Passwordless user
import * as express from 'express';
import { UpdateUserData, ObjectWithId } from 'auth0';
const AUTH0_INVALID_EMAIL_ERROR = `Object didn't pass validation for format email`;
const managementClient = new ManagementClient({
domain: process.env.AUTH0_DOMAIN,
clientId: process.env.AUTH0_CLIENT_ID,
clientSecret: process.env.AUTH0_CLIENT_SECRET,
scope: 'read:users create:users update:users'
const fooFn = jest.fn().mockImplementation(() => Promise.resolve('bar'));
const barFn = jest.fn();
jest.mock('./foo', () => ({ foo: fooFn, bar: barFn });
import Foo from './foo';
describe('foo module tests', () => {
it('runs foo', () => {
const foo = Foo();
expect(fooFn).toHaveBeenCalled();
expect(barFn).toHaveBeenCalledTimes(0);