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 / auth.js
Last active February 29, 2024 07:37
nuxtServerInit like implementation for Pinia
import { defineStore } from 'pinia'
export const useAuthStore = defineStore({
id: 'auth',
state: () => ({
isAuthenticated: false,
user: null
}),
actions: {
async nuxtServerInit() {
@wobsoriano
wobsoriano / useLocalObservable.ts
Last active August 12, 2021 12:44
mobx-react-lite in Composition API
import { observable, observe, AnnotationsMap } from "mobx"
import { getCurrentInstance, shallowRef, Ref, triggerRef, readonly, onUnmounted } from "vue"
// Composable
export function useLocalObservable<TStore extends Record<string, any>>(
initializer: () => TStore,
annotations?: AnnotationsMap<TStore, never>
): Readonly<Ref<TStore>> {
const localObservable = shallowRef(observable(initializer(), annotations, { autoBind: true }))
const dispose = observe(localObservable.value, () => {
@wobsoriano
wobsoriano / maps.spec.ts
Created August 4, 2021 06:51
Google Maps jest mock
type Suggestions = google.maps.places.AutocompletePrediction[] | null;
describe('Your Test', () => {
const getMaps = (type = 'success', data: Suggestions): any => ({
maps: {
places: {
AutocompleteService: jest.fn(() => ({
getPlacePredictions: (_: any, cb: (dataArg: Suggestions) => void) => {
setTimeout(() => {
cb(type === "success" ? data : null);
@wobsoriano
wobsoriano / h-demi.ts
Last active July 30, 2021 05:53
Make h function working with Vue 2 and 3
// https://github.com/vueuse/vue-demi/issues/65
import { h as hDemi, isVue2 } from 'vue-demi'
interface Options {
props?: Record<any, any>,
domProps?: Record<any, any>
on?: Record<any, any>
}
@wobsoriano
wobsoriano / svgToCanvas.ts
Created July 26, 2021 12:41
SVG to Canvas
export default async function svgToCanvas(svgElement: SVGElement): Promise<HTMLCanvasElement> {
return new Promise((resolve, reject) => {
const { width, height } = svgElement.getBoundingClientRect();
const blob = new Blob([svgElement.outerHTML], { type:'image/svg+xml' })
const blobURL = window.URL.createObjectURL(blob)
const image = new Image()
image.onload = () => {
window.URL.revokeObjectURL(blobURL)
@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({
@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 / 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 / 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 / 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');