Skip to content

Commit 708ea75

Browse files
philibeachambo-e
andauthored
feat(segment): add segment hooks (#587)
* feat(segment): add segment hooks * feat: generic segment (#590) * chore: generic segment * fix: fmt * fix: correcty infer types * fix(segment): add cdn variable * fix(segment): remove log * test: add missing test + update doc * fix: correct lint * docs(segment): add segment to global readme * docs(readme): change description Co-authored-by: Manu Chambon <[email protected]> Co-authored-by: Emmanuel Chambon <[email protected]>
1 parent bd1643e commit 708ea75

File tree

11 files changed

+1229
-13
lines changed

11 files changed

+1229
-13
lines changed

.eslintignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# From .gitignore
22
node_modules/
33
dist/
4-
build/
4+
build/
5+

.gitignore

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# dependencies
12
node_modules
23
.yarn/*
34
!.yarn/patches
@@ -7,10 +8,31 @@ node_modules
78
!.yarn/versions
89
.pnp.*
910

11+
# we are using yarn here
12+
package-lock.json
13+
14+
# misc
15+
.DS_Store
16+
.env
17+
/.vscode
18+
.idea/
1019
.eslintcache
1120
dist
1221
coverage
13-
*.log
1422
.reports
15-
.env
16-
build
23+
24+
25+
# VSCode extension "Local History"
26+
.history
27+
28+
# Npm/Yarn debug
29+
npm-debug.log*
30+
yarn-debug.log*
31+
yarn-error.log*
32+
*.log
33+
34+
35+
36+
# Yalc
37+
yalc.lock
38+
.yalc/

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,13 @@ scaleway-lib is a set of NPM packages used at Scaleway.
6565
![npm bundle size](https://img.shields.io/bundlephobia/min/@scaleway/use-query-params)
6666
![npm](https://img.shields.io/npm/v/@scaleway/use-query-params)
6767

68+
- [`@scaleway/use-segment`](./packages/use-segment/README.md):
69+
A tiny hooks to handle segment events.
70+
71+
![npm](https://img.shields.io/npm/dm/@scaleway/use-segment)
72+
![npm bundle size](https://img.shields.io/bundlephobia/min/@scaleway/use-segment)
73+
![npm](https://img.shields.io/npm/v/@scaleway/use-segment)
74+
6875
- [`@scaleway/use-i18n`](./packages/use-i18n/README.md):
6976
A tiny hook to handle i18n.
7077

packages/use-segment/.eslintrc.cjs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
const { join } = require('path')
2+
3+
module.exports = {
4+
rules: {
5+
'import/no-extraneous-dependencies': [
6+
'error',
7+
{ packageDir: [__dirname, join(__dirname, '../../')] },
8+
],
9+
},
10+
}

packages/use-segment/.npmignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
**/__tests__/**
2+
examples/
3+
src
4+
.eslintrc.cjs
5+
!.npmignore

packages/use-segment/README.md

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
# `@scaleway/use-segment`
2+
3+
## A tiny hooks to handle segment events
4+
5+
use [@segment/analytics-next](https://github.com/segmentio/analytics-next)
6+
7+
## Install
8+
9+
```bash
10+
$ yarn add @scaleway/use-segment
11+
```
12+
13+
## Usage
14+
15+
### Event directory
16+
17+
Create an events directory with all you specific events.
18+
19+
```
20+
events
21+
┣ pageTypes
22+
┃ ┗ index.ts
23+
┣ 📂loginEvent
24+
┃ ┗ index.ts
25+
┃ index.ts ( export all you functions )
26+
27+
```
28+
29+
Each event will have a format like this:
30+
31+
```typescript
32+
const pageVisited =
33+
(analytics?: Analytics) =>
34+
async (args: Args): Promise<void> => {
35+
// here do what you have to do with analytics
36+
await analytics?.page(args)
37+
}
38+
39+
export default pageVisited
40+
```
41+
42+
43+
44+
```typescript
45+
46+
import pageTypes from './pageTypes'
47+
import testEvents from './testEvents'
48+
49+
export default {
50+
pageTypes,
51+
testEvents,
52+
}
53+
54+
```
55+
56+
57+
### Context Load
58+
59+
Inside you global app you have to use our Segment Provider to allow loading of segment from your settting app.
60+
This will trigger a load and return analitycs function inside you provider.
61+
62+
```javascript
63+
import SegmentProvider from '@scaleway/use-segment'
64+
import { captureMessage } from '@sentry/browser'
65+
import events from './events'
66+
67+
const App = () => (
68+
<SegmentProvider
69+
settings={{ writeKey: 'WRITE_KEY' }} // check your segment writeKey
70+
cdn="https://cdn.url" // In case you are using a proxy cdn
71+
events={events}
72+
onError={e => captureMessage(`Error on Segment: ${e.message}`)}
73+
>
74+
<App />
75+
</SegmentProvider>
76+
)
77+
```
78+
79+
### Hook utility
80+
81+
Now you maybe want to use your events inside your app .
82+
If you are using typescript, you may
83+
84+
```typescript
85+
import { useSegment } from '@scaleway/use-segment'
86+
import type { Events } from 'types/events'
87+
import { Form, Submit } from '@scaleway/form'
88+
89+
const Login = () => {
90+
const { events } = useSegment<Events>()
91+
92+
const onSubmit = async args => {
93+
// make you api calls
94+
await events.login()
95+
}
96+
97+
return (
98+
<Form onSubmit={onSubmit}>
99+
// others fields
100+
<Submit />
101+
</Form>
102+
)
103+
}
104+
```

packages/use-segment/package.json

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
{
2+
"name": "@scaleway/use-segment",
3+
"version": "0.1.0",
4+
"description": "A small hook to handle segment",
5+
"keywords": [
6+
"react",
7+
"reactjs",
8+
"hooks",
9+
"segment"
10+
],
11+
"type": "module",
12+
"main": "dist/index.js",
13+
"module": "dist/index.js",
14+
"types": "dist/index.d.ts",
15+
"browser": {
16+
"dist/index.js": "./dist/index.browser.js"
17+
},
18+
"publishConfig": {
19+
"access": "public"
20+
},
21+
"repository": {
22+
"type": "git",
23+
"url": "https://github.com/scaleway/scaleway-lib",
24+
"directory": "packages/use-segment"
25+
},
26+
"license": "MIT",
27+
"dependencies": {
28+
"@segment/analytics-next": "^1.33.0"
29+
},
30+
"peerDependencies": {
31+
"react": "17.x"
32+
}
33+
}

0 commit comments

Comments
 (0)