From 019918f17854a9eb4ca1b03d12533cea94854d2f Mon Sep 17 00:00:00 2001 From: Salvatore Tedde Date: Sun, 23 Feb 2020 02:11:14 +0000 Subject: [PATCH 1/2] feat(useCookie): Adding useCookie function --- README.md | 4 +- package-lock.json | 11 +++ package.json | 2 + src/components/useCookie/index.ts | 1 + .../useCookie/stories/UseCookieDemo.vue | 83 +++++++++++++++++++ src/components/useCookie/stories/useCookie.md | 23 +++++ .../useCookie/stories/useCookie.story.ts | 28 +++++++ src/components/useCookie/useCookie.spec.ts | 12 +++ src/components/useCookie/useCookie.ts | 48 +++++++++++ src/vue-use-kit.ts | 1 + 10 files changed, 212 insertions(+), 1 deletion(-) create mode 100755 src/components/useCookie/index.ts create mode 100755 src/components/useCookie/stories/UseCookieDemo.vue create mode 100755 src/components/useCookie/stories/useCookie.md create mode 100755 src/components/useCookie/stories/useCookie.story.ts create mode 100755 src/components/useCookie/useCookie.spec.ts create mode 100755 src/components/useCookie/useCookie.ts diff --git a/README.md b/README.md index 05c8f22..bd41ae1 100755 --- a/README.md +++ b/README.md @@ -104,7 +104,9 @@ Vue.use(VueCompositionAPI); [![Demo](https://img.shields.io/badge/demo-🚀-yellow.svg)](https://microcipcip.github.io/vue-use-kit/?path=/story/animations-usetimeoutfn--demo) - Side Effects - [`useBeforeUnload`](./src/components/useBeforeUnload/stories/useBeforeUnload.md) — shows browser alert when user try to reload or close the page. - [![Demo](https://img.shields.io/badge/demo-🚀-yellow.svg)](https://microcipcip.github.io/vue-use-kit/?path=/story/ui-usebeforeunload--demo) + [![Demo](https://img.shields.io/badge/demo-🚀-yellow.svg)](https://microcipcip.github.io/vue-use-kit/?path=/story/side-effects-usebeforeunload--demo) + - [`useCookie`](./src/components/useCookie/stories/useCookie.md) — provides way to read, update and delete a cookie. + [![Demo](https://img.shields.io/badge/demo-🚀-yellow.svg)](https://microcipcip.github.io/vue-use-kit/?path=/story/side-effects-usecookie--demo) - UI - [`useClickAway`](./src/components/useClickAway/stories/useClickAway.md) — triggers callback when user clicks outside target area. [![Demo](https://img.shields.io/badge/demo-🚀-yellow.svg)](https://microcipcip.github.io/vue-use-kit/?path=/story/ui-useclickaway--demo) diff --git a/package-lock.json b/package-lock.json index 6735421..b512594 100755 --- a/package-lock.json +++ b/package-lock.json @@ -3720,6 +3720,12 @@ "integrity": "sha512-Q5hTcfdudEL2yOmluA1zaSyPbzWPmJ3XfSWeP3RyoYvS9hnje1ZyagrZOuQ6+1nQC1Gw+7gap3pLNL3xL6UBug==", "dev": true }, + "@types/js-cookie": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.4.tgz", + "integrity": "sha512-WTfSE1Eauak/Nrg6cA9FgPTFvVawejsai6zXoq0QYTQ3mxONeRtGhKxa7wMlUzWWmzrmTeV+rwLjHgsCntdrsA==", + "dev": true + }, "@types/json-schema": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", @@ -12571,6 +12577,11 @@ "nopt": "~4.0.1" } }, + "js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", diff --git a/package.json b/package.json index 3d69244..fcd920a 100755 --- a/package.json +++ b/package.json @@ -93,6 +93,7 @@ "@storybook/theming": "^5.3.13", "@storybook/vue": "^5.3.13", "@types/jest": "^23.3.2", + "@types/js-cookie": "^2.2.4", "@types/node": "^10.11.0", "@types/throttle-debounce": "^2.1.0", "@typescript-eslint/eslint-plugin": "^2.18.0", @@ -138,6 +139,7 @@ "vue-template-compiler": "^2.6.11" }, "dependencies": { + "js-cookie": "^2.2.1", "throttle-debounce": "^2.1.0" } } diff --git a/src/components/useCookie/index.ts b/src/components/useCookie/index.ts new file mode 100755 index 0000000..cb8a8a9 --- /dev/null +++ b/src/components/useCookie/index.ts @@ -0,0 +1 @@ +export * from './useCookie' diff --git a/src/components/useCookie/stories/UseCookieDemo.vue b/src/components/useCookie/stories/UseCookieDemo.vue new file mode 100755 index 0000000..1111cd6 --- /dev/null +++ b/src/components/useCookie/stories/UseCookieDemo.vue @@ -0,0 +1,83 @@ + + + diff --git a/src/components/useCookie/stories/useCookie.md b/src/components/useCookie/stories/useCookie.md new file mode 100755 index 0000000..a54767e --- /dev/null +++ b/src/components/useCookie/stories/useCookie.md @@ -0,0 +1,23 @@ +# useCookie + +Vue function that provides way to read, update and delete a cookie. + +## Reference + +```typescript +// function useCookie() +``` + +### Parameters + +- `value: string` lorem ipsa + +### Returns + +- `value: Ref` lorem ipsa + +## Usage + +```html + +``` diff --git a/src/components/useCookie/stories/useCookie.story.ts b/src/components/useCookie/stories/useCookie.story.ts new file mode 100755 index 0000000..b972f34 --- /dev/null +++ b/src/components/useCookie/stories/useCookie.story.ts @@ -0,0 +1,28 @@ +import { storiesOf } from '@storybook/vue' +import path from 'path' +import StoryTitle from '@src/helpers/StoryTitle.vue' +import UseCookieDemo from './UseCookieDemo.vue' + +const functionName = 'useCookie' +const functionPath = path.resolve(__dirname, '..') +const notes = require(`./${functionName}.md`).default + +const basicDemo = () => ({ + components: { StoryTitle, demo: UseCookieDemo }, + template: ` +
+ + + + + +
` +}) + +storiesOf('side effects|useCookie', module) + .addParameters({ notes }) + .add('Demo', basicDemo) diff --git a/src/components/useCookie/useCookie.spec.ts b/src/components/useCookie/useCookie.spec.ts new file mode 100755 index 0000000..e534b76 --- /dev/null +++ b/src/components/useCookie/useCookie.spec.ts @@ -0,0 +1,12 @@ +// import { mount } from '@src/helpers/test' +// import { useCookie } from '@src/vue-use-kit' + +afterEach(() => { + jest.clearAllMocks() +}) + +describe('useCookie', () => { + it('should do something', () => { + // Add test here + }) +}) diff --git a/src/components/useCookie/useCookie.ts b/src/components/useCookie/useCookie.ts new file mode 100755 index 0000000..577f544 --- /dev/null +++ b/src/components/useCookie/useCookie.ts @@ -0,0 +1,48 @@ +import Cookies from 'js-cookie' +import { ref, Ref } from '@vue/composition-api' + +type CookieValueType = string | JSON + +const tryParse = (val: string, enableParsing: boolean) => { + if (!enableParsing) return val + try { + return JSON.parse(val) + } catch (err) { + return val + } +} + +const tryStringify = (val: CookieValueType, enableParsing: boolean) => { + if (!enableParsing) return val + try { + return JSON.stringify(val) + } catch (err) { + return val + } +} + +export function useCookie(cookieName: string, enableParseJSON = false) { + const getCookie = () => { + const cookieVal = Cookies.get(cookieName) + if (typeof cookieVal === 'undefined') return null + return tryParse(cookieVal, enableParseJSON) + } + + const cookie = ref(getCookie()) + + const updateCookie = ( + newVal: CookieValueType, + options?: Cookies.CookieAttributes + ) => { + const newCookieValue = tryStringify(newVal, enableParseJSON) + Cookies.set(cookieName, newCookieValue, options) + cookie.value = newVal + } + + const deleteCookie = (options?: Cookies.CookieAttributes) => { + Cookies.remove(cookieName, options) + cookie.value = null + } + + return { cookie, updateCookie, deleteCookie } +} diff --git a/src/vue-use-kit.ts b/src/vue-use-kit.ts index 7b42b77..abe589e 100755 --- a/src/vue-use-kit.ts +++ b/src/vue-use-kit.ts @@ -24,3 +24,4 @@ export * from './components/useTimeoutFn' export * from './components/useTimeout' // Site Effects export * from './components/useBeforeUnload' +export * from './components/useCookie' From 95eeb1cead3541b745962275da480c0c75b0d823 Mon Sep 17 00:00:00 2001 From: Salvatore Tedde Date: Tue, 25 Feb 2020 01:17:50 +0000 Subject: [PATCH 2/2] improvement(useCookie): Adding tests and documentation, and also adding the @src/api file --- package-lock.json | 28 +++--- package.json | 3 +- src/api.ts | 2 + .../stories/UseBeforeUnloadDemo.vue | 2 +- .../stories/useBeforeUnload.md | 2 +- .../useBeforeUnload/useBeforeUnload.spec.ts | 2 +- .../useBeforeUnload/useBeforeUnload.ts | 2 +- .../useClickAway/stories/UseClickAwayDemo.vue | 2 +- .../useClickAway/stories/useClickAway.md | 2 +- .../useClickAway/useClickAway.spec.ts | 2 +- src/components/useClickAway/useClickAway.ts | 2 +- .../useCookie/stories/UseCookieDemo.vue | 59 ++++++----- src/components/useCookie/stories/useCookie.md | 55 ++++++++++- src/components/useCookie/useCookie.spec.ts | 97 ++++++++++++++++++- src/components/useCookie/useCookie.ts | 60 +++++------- .../stories/UseFullscreenDemo.vue | 2 +- .../useFullscreen/stories/useFullscreen.md | 2 +- .../useFullscreen/useFullscreen.spec.ts | 2 +- src/components/useFullscreen/useFullscreen.ts | 2 +- .../useGeolocation/useGeolocation.ts | 2 +- .../useHover/stories/UseHoverDemo.vue | 2 +- src/components/useHover/stories/useHover.md | 2 +- src/components/useHover/useHover.spec.ts | 2 +- src/components/useHover/useHover.ts | 2 +- .../useIdle/stories/UseIdleDemo.vue | 2 +- src/components/useIdle/useIdle.ts | 2 +- .../stories/UseIntersectionElementDemo.vue | 2 +- .../stories/useIntersection.md | 2 +- .../useIntersection/useIntersection.spec.ts | 2 +- .../useIntersection/useIntersection.ts | 2 +- src/components/useInterval/useInterval.ts | 2 +- .../stories/UseIntervalFnDemo.vue | 2 +- .../useIntervalFn/stories/useIntervalFn.md | 2 +- .../useIntervalFn/useIntervalFn.spec.ts | 2 +- src/components/useIntervalFn/useIntervalFn.ts | 2 +- src/components/useLocation/useLocation.ts | 2 +- .../useMedia/stories/UseMediaAdvancedDemo.vue | 2 +- src/components/useMedia/useMedia.ts | 2 +- .../useMediaDevices/useMediaDevices.ts | 2 +- .../useMouse/stories/UseMouseAdvancedDemo.vue | 2 +- src/components/useMouse/useMouse.ts | 2 +- .../stories/UseMouseElementDemo.vue | 2 +- .../useMouseElement/useMouseElement.spec.ts | 2 +- .../useMouseElement/useMouseElement.ts | 2 +- .../useMouseLeavePage/useMouseLeavePage.ts | 2 +- src/components/useRaf/stories/UseRafDemo.vue | 2 +- src/components/useRaf/useRaf.ts | 2 +- .../useRafFn/stories/UseRafFnAdvancedDemo.vue | 2 +- .../useRafFn/stories/UseRafFnDemo.vue | 2 +- src/components/useRafFn/stories/useRafFn.md | 2 +- src/components/useRafFn/useRafFn.spec.ts | 2 +- src/components/useRafFn/useRafFn.ts | 9 +- .../useSampleComponent/useSampleComponent.ts | 2 +- .../stories/UseSearchParamsDemo.vue | 2 +- .../useSearchParams/useSearchParams.ts | 3 +- .../useTimeout/stories/UseTimeoutDemo.vue | 2 +- src/components/useTimeout/useTimeout.spec.ts | 2 +- src/components/useTimeout/useTimeout.ts | 2 +- .../useTimeoutFn/stories/UseTimeoutFnDemo.vue | 2 +- .../useTimeoutFn/stories/useTimeoutFn.md | 2 +- .../useTimeoutFn/useTimeoutFn.spec.ts | 2 +- src/components/useTimeoutFn/useTimeoutFn.ts | 2 +- src/helpers/test.ts | 2 +- tsconfig.json | 1 + 64 files changed, 271 insertions(+), 154 deletions(-) create mode 100755 src/api.ts diff --git a/package-lock.json b/package-lock.json index b512594..984c754 100755 --- a/package-lock.json +++ b/package-lock.json @@ -3690,6 +3690,11 @@ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, + "@types/cookie": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz", + "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==" + }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", @@ -3720,12 +3725,6 @@ "integrity": "sha512-Q5hTcfdudEL2yOmluA1zaSyPbzWPmJ3XfSWeP3RyoYvS9hnje1ZyagrZOuQ6+1nQC1Gw+7gap3pLNL3xL6UBug==", "dev": true }, - "@types/js-cookie": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.4.tgz", - "integrity": "sha512-WTfSE1Eauak/Nrg6cA9FgPTFvVawejsai6zXoq0QYTQ3mxONeRtGhKxa7wMlUzWWmzrmTeV+rwLjHgsCntdrsA==", - "dev": true - }, "@types/json-schema": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", @@ -6664,8 +6663,7 @@ "cookie": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" }, "cookie-signature": { "version": "1.0.6", @@ -6673,6 +6671,15 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, + "cookie-universal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cookie-universal/-/cookie-universal-2.1.1.tgz", + "integrity": "sha512-WolLEtABR5E6NLIgpgP0LT53C85iJmxqTF3YAx4tCIWl0mkwivzjQaVbXDQbUxKz4HRwiYLW1D8vh1SJIAkl8A==", + "requires": { + "@types/cookie": "^0.3.3", + "cookie": "^0.4.0" + } + }, "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", @@ -12577,11 +12584,6 @@ "nopt": "~4.0.1" } }, - "js-cookie": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", - "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" - }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", diff --git a/package.json b/package.json index fcd920a..3d2955d 100755 --- a/package.json +++ b/package.json @@ -93,7 +93,6 @@ "@storybook/theming": "^5.3.13", "@storybook/vue": "^5.3.13", "@types/jest": "^23.3.2", - "@types/js-cookie": "^2.2.4", "@types/node": "^10.11.0", "@types/throttle-debounce": "^2.1.0", "@typescript-eslint/eslint-plugin": "^2.18.0", @@ -139,7 +138,7 @@ "vue-template-compiler": "^2.6.11" }, "dependencies": { - "js-cookie": "^2.2.1", + "cookie-universal": "^2.1.1", "throttle-debounce": "^2.1.0" } } diff --git a/src/api.ts b/src/api.ts new file mode 100755 index 0000000..9787866 --- /dev/null +++ b/src/api.ts @@ -0,0 +1,2 @@ +export * from '@vue/composition-api' +export { default } from '@vue/composition-api' diff --git a/src/components/useBeforeUnload/stories/UseBeforeUnloadDemo.vue b/src/components/useBeforeUnload/stories/UseBeforeUnloadDemo.vue index ada7bbe..7ce2394 100755 --- a/src/components/useBeforeUnload/stories/UseBeforeUnloadDemo.vue +++ b/src/components/useBeforeUnload/stories/UseBeforeUnloadDemo.vue @@ -31,7 +31,7 @@