From 7626cea5456bc446928f7362ed18a2da15f59bec Mon Sep 17 00:00:00 2001 From: Dario Ferderber Date: Thu, 11 Apr 2024 07:08:11 +0200 Subject: [PATCH] feat: add useScriptVimeo + Vimeo component (#8) Co-authored-by: Harlan Wilton --- playground/pages/index.vue | 8 + .../pages/third-parties/vimeo-component.vue | 16 ++ playground/pages/third-parties/vimeo.vue | 20 +++ src/module.ts | 10 ++ src/runtime/components/VimeoEmbed.vue | 162 ++++++++++++++++++ src/runtime/registry/vimeo.ts | 40 +++++ 6 files changed, 256 insertions(+) create mode 100644 playground/pages/third-parties/vimeo-component.vue create mode 100644 playground/pages/third-parties/vimeo.vue create mode 100644 src/runtime/components/VimeoEmbed.vue create mode 100644 src/runtime/registry/vimeo.ts diff --git a/playground/pages/index.vue b/playground/pages/index.vue index 618e299d..7d419c38 100644 --- a/playground/pages/index.vue +++ b/playground/pages/index.vue @@ -34,6 +34,14 @@ const thirdParties = [ name: 'Segment', path: '/third-parties/segment', }, + { + name: 'Vimeo', + path: '/third-parties/vimeo', + }, + { + name: 'Vimeo component', + path: '/third-parties/vimeo-component', + }, ] const features = [ diff --git a/playground/pages/third-parties/vimeo-component.vue b/playground/pages/third-parties/vimeo-component.vue new file mode 100644 index 00000000..c5e56670 --- /dev/null +++ b/playground/pages/third-parties/vimeo-component.vue @@ -0,0 +1,16 @@ + + + \ No newline at end of file diff --git a/playground/pages/third-parties/vimeo.vue b/playground/pages/third-parties/vimeo.vue new file mode 100644 index 00000000..155301ab --- /dev/null +++ b/playground/pages/third-parties/vimeo.vue @@ -0,0 +1,20 @@ + + + \ No newline at end of file diff --git a/src/module.ts b/src/module.ts index 10a3f941..a128f9eb 100644 --- a/src/module.ts +++ b/src/module.ts @@ -1,5 +1,6 @@ import { addBuildPlugin, + addComponentsDir, addImports, addImportsDir, addPlugin, @@ -106,6 +107,10 @@ export default defineNuxtModule({ resolve('./runtime/composables'), ]) + addComponentsDir({ + path: resolve('./runtime/components') + }) + nuxt.hooks.hook('modules:done', async () => { let registry: RegistryScripts = [ { @@ -148,6 +153,11 @@ export default defineNuxtModule({ }) }, }, + { + name: 'useScriptVimeo', + from: resolve('./runtime/registry/vimeo'), + key: 'vimeo', + }, { name: 'useScriptIntercom', from: resolve('./runtime/registry/intercom'), diff --git a/src/runtime/components/VimeoEmbed.vue b/src/runtime/components/VimeoEmbed.vue new file mode 100644 index 00000000..ddedbebd --- /dev/null +++ b/src/runtime/components/VimeoEmbed.vue @@ -0,0 +1,162 @@ + + + diff --git a/src/runtime/registry/vimeo.ts b/src/runtime/registry/vimeo.ts new file mode 100644 index 00000000..35b15439 --- /dev/null +++ b/src/runtime/registry/vimeo.ts @@ -0,0 +1,40 @@ +import { type Input, object, string } from 'valibot' +import { useScript } from '#imports' +import type { NuxtUseScriptOptions } from '#nuxt-scripts' + +export interface VimeoScriptApi { + Player: any +} + +export const VimeoScriptOptions = object({}) + +export type VimeoPlayer = ((...params: any[]) => void) | undefined + +export type VimeoScriptInput = Input + +declare global { + interface Window { + Vimeo: VimeoScriptApi + } +} + +export function useScriptVimeo(options?: VimeoScriptInput, _scriptOptions?: Omit, 'beforeInit' | 'use'>) { + const scriptOptions: NuxtUseScriptOptions = _scriptOptions || {} + + return useScript({ + key: 'vimeo', + src: 'https://player.vimeo.com/api/player.js', + ...options, + }, { + ...scriptOptions, + use: () => { + let Player: VimeoPlayer + if (import.meta.client) { + Player = function (...params: any[]) { + return new window.Vimeo.Player(...params) + } + } + return { Player } + }, + }) +}