Skip to content

Instantly share code, notes, and snippets.

View tpjnorton's full-sized avatar

Tom Norton tpjnorton

View GitHub Profile
export const swapLightForDark = (appearance: string) => {
switch (appearance) {
case 'light':
return 'dark';
case 'dark':
return 'light';
default:
throw new Error('Unknown appearance');
}
};
import { useEffect, useCallback } from 'react';
import { StatusBar } from 'react-native';
import { useFocusEffect } from '@react-navigation/native'
const useStatusBar = ({ style, backgroundColor, translucent, hidden }) => {
useFocusEffect(
useCallback(() => {
style && StatusBar.setBarStyle(style, true);
backgroundColor && StatusBar.setBackgroundColor(backgroundColor, true);
translucent && StatusBar.setTranslucent(translucent);
@tpjnorton
tpjnorton / exampleWithLoading.tsx
Last active October 23, 2020 09:00
useLoading Example
import {asyncA, asyncB} from './api'
const ComponentWithLoading = () => {
const [doA, aLoading] = useLoading(asyncA);
const [doB, bLoading] = useLoading(asyncB);
useEffect(() => {
doA();
doB();
}, []);
@tpjnorton
tpjnorton / useLoading.ts
Created October 23, 2020 08:55
useLoading.ts
import { useState } from "react";
const useLoading = (action) => {
const [loading, setLoading] = useState(false);
const doAction = (...args) => {
setLoading(true);
return action(...args).finally(() => setLoading(false));
};
const animation = useSharedValue(0);
const animateCircle = (breathing) => {
if (!breathing) animation.value = 0;
else {
animation.value = withRepeat(
withTiming(1, {
duration: 5000,
reverse: true,
easing: Easing.inOut(Easing.ease),
progress.value = withTiming(100, { duration: 1000 });
const MovingBox = () => {
const progress = useSharedValue(0);
useEffect(() => {
setTimeout(() => {
progress.value = 100;
}, 1000);
}, []);
const style = useAnimatedStyle(() => ({
const mult = (a, b) => {
'worklet';
return a * b;
}
useCode(
() => [
cond(and(not(breathing), clockRunning(clock)), stopClock(clock)),
cond(
and(not(not(breathing)), not(clockRunning(clock))),
startClock(clock)
),
set(animation, [
loop({
duration: 5000,
@tpjnorton
tpjnorton / chatView.tsx
Last active October 1, 2020 12:06
An example of using the useWebSocket hook.
const ChatView = () = {
const wsRef = useWebSocket(
'wss://example.com/chat',
null,
(message) => alert(message),
() => alert('error!')
);
return (