Skip to content

Instantly share code, notes, and snippets.

View wobsoriano's full-sized avatar
🏠
Working from home

Robert Soriano wobsoriano

🏠
Working from home
View GitHub Profile
@wobsoriano
wobsoriano / theme.ts
Last active July 4, 2021 04:31
Svelte Theme Store
import { writable } from 'svelte/store'
const html = document.querySelector('html')
const storedTheme = localStorage.getItem('theme')
function isSystemThemeDark() {
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
}
function createThemeStore() {
@wobsoriano
wobsoriano / ThemeProvider.tsx
Created July 5, 2021 09:11
Solid Theme Provider for Tailwind/Windi
import { createContext, createEffect, createSignal, useContext } from 'solid-js'
const themeName = 'theme'
const html = document.querySelector('html')
function getInitialTheme() {
const isDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
const storageTheme = localStorage.getItem(themeName)
if (storageTheme) return storageTheme
@wobsoriano
wobsoriano / store.ts
Last active July 6, 2021 18:51
Solid + Zustand for global state
import { onCleanup } from 'solid-js'
import { createStore, reconcile, Store } from 'solid-js/store'
import create, { SetState, State, StoreApi } from 'zustand/vanilla'
interface CounterStore {
count: number
increment: () => void
decrement: () => void
}
@wobsoriano
wobsoriano / useCreateMessage.ts
Last active July 14, 2021 06:46
React Query useMutation and TypeScript
import { InfiniteData, useMutation, useQueryClient } from 'react-query';
import { ExtendPayload } from '../globals';
import { useAuthStore } from '../store';
import { MessageListItem, MessageListResponse } from './useMessageList';
import { httpClient, stringifyQuery } from './utils';
interface CreateMessageBody {
to: string;
message: string;
@wobsoriano
wobsoriano / query-key-factory.ts
Created July 14, 2021 08:54
react-query Query Key Factory
export const todoKeys = {
all: ['todos'] as const,
lists: () => [...todoKeys.all, 'list'] as const,
list: (filters: string) => [...todoKeys.lists(), { filters }] as const,
details: () => [...todoKeys.all, 'detail'] as const,
detail: (id: number) => [...todoKeys.details(), id] as const,
}
@wobsoriano
wobsoriano / open-file-dialog.ts
Last active July 17, 2021 14:17
Vue 3 File Picker composable
export default function openFileDialog(
accept: string,
multiple: boolean,
callback: (arg: Event) => void
) {
// this function must be called from a user
// activation event (ie an onclick event)
// Create an input element
const inputElement = document.createElement('input');
@wobsoriano
wobsoriano / DialogProvider.vue
Last active December 19, 2024 13:25
Vuetify + Composition API Dialog component that can be used globally
<template>
<div v-frag>
<slot />
<v-dialog
v-model="isOpen"
:max-width="options.width"
:persistent="options.persistent"
>
<v-card>
<v-card-title>{{ title }}</v-card-title>
@wobsoriano
wobsoriano / SnackbarProvider.vue
Created July 19, 2021 07:36
Vuetify + Composition API Snackbar component that can be used globally
<template>
<div v-frag>
<slot />
<v-snackbar v-model="show" :timeout="options.timeout" bottom right>
{{ text }}
<template v-if="options.showCloseButton" #action="{ attrs }">
<v-btn
:color="options.closeButtonColor"
text
v-bind="attrs"
@wobsoriano
wobsoriano / App.vue
Last active November 23, 2022 17:13
Vue 3 Infinite Scroll Component
<script setup lang="ts">
import { ref } from 'vue';
import InfiniteScroll from '~/components/InfiniteScroll.vue';
import SkeletonPostItem from '~/components/SkeletonPostItem.vue';
interface State {
loaded: () => void;
complete: () => void;
}
@wobsoriano
wobsoriano / EmojiPicker.vue
Last active July 23, 2021 06:37
Vue 2 and 3 Emoji Picker Component using emoji-picker-element
<template>
<emoji-picker ref="picker"></emoji-picker>
</template>
<script>
import { defineComponent, ref, onMounted, onUnmounted } from 'vue';
// https://github.com/nolanlawson/emoji-picker-element
import 'emoji-picker-element/picker';
export default defineComponent({