Skip to content

Commit

Permalink
feat: 🎸 Multilang support for useTimetable (kolplattformen#14)
Browse files Browse the repository at this point in the history
* feat: 🎸 Multilang support for useTimetable

BREAKING CHANGE: 🧨 useTimetable now requires lang
  • Loading branch information
JohanObrink authored Apr 26, 2021
1 parent fe1729c commit be6c9d1
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 46 deletions.
6 changes: 4 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,16 @@
"redux": "^4.0.5"
},
"peerDependencies": {
"@skolplattformen/embedded-api": "^4.0.0",
"@skolplattformen/curriculum": "^1.3.0",
"@skolplattformen/embedded-api": "^5.1.0",
"react": "^16.11.0"
},
"devDependencies": {
"@babel/preset-env": "^7.13.15",
"@babel/preset-react": "^7.13.13",
"@babel/preset-typescript": "^7.13.0",
"@skolplattformen/embedded-api": "^4.0.0",
"@skolplattformen/curriculum": "^1.3.0",
"@skolplattformen/embedded-api": "^5.1.0",
"@testing-library/jest-dom": "^5.11.10",
"@testing-library/react": "^11.2.6",
"@testing-library/react-hooks": "^5.1.1",
Expand Down
2 changes: 2 additions & 0 deletions src/fake.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ describe('hooks with fake data', () => {
expect(result.current.data).toEqual({
firstName: 'Namn',
lastName: 'Namnsson',
isAuthenticated: true,
})
})
})
Expand All @@ -61,6 +62,7 @@ describe('hooks with fake data', () => {
expect(result.current.data).toEqual({
firstName: 'Namn',
lastName: 'Namnsson',
isAuthenticated: true,
})
})
})
Expand Down
9 changes: 6 additions & 3 deletions src/hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
User,
} from '@skolplattformen/embedded-api'
import { DateTime } from 'luxon'
import { Language } from '@skolplattformen/curriculum/dist/translations'
import {
ApiCall,
EntityHookResult,
Expand Down Expand Up @@ -179,12 +180,14 @@ export const useSchedule = (child: Child, from: string, to: string) => hook<Sche
(api) => () => api.getSchedule(child, DateTime.fromISO(from), DateTime.fromISO(to)),
)

export const useTimetable = (child: Skola24Child, week: number, year: number) => hook<TimetableEntry[]>(
export const useTimetable = (
child: Skola24Child, week: number, year: number, lang: Language,
) => hook<TimetableEntry[]>(
'TIMETABLE',
`timetable_${child.personGuid}_${week}_${year}`,
`timetable_${child.personGuid}_${week}_${year}_${lang}`,
[],
(s) => s.timetable,
(api) => () => api.getTimetable(child, week, year),
(api) => () => api.getTimetable(child, week, year, lang),
)

export const useUser = () => hook<User>(
Expand Down
40 changes: 21 additions & 19 deletions src/useTimetable.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,14 @@ import reporter from './__mocks__/reporter'

const pause = (ms = 0) => new Promise((r) => setTimeout(r, ms))

describe('useTimetable(child, week, year)', () => {
describe('useTimetable(child, week, year, lang)', () => {
let api
let storage
let response
let child
let week
let year
let lang
const wrapper = ({ children }) => (
<ApiProvider
api={api}
Expand All @@ -35,11 +36,12 @@ describe('useTimetable(child, week, year)', () => {
})
))
storage = createStorage({
'123_timetable_10_15_2021': [{ id: 2 }],
'123_timetable_10_15_2021_sv': [{ id: 2 }],
}, 2)
child = { personGuid: '10' }
week = 15
year = 2021
lang = 'sv'
})
afterEach(async () => {
await act(async () => {
Expand All @@ -48,14 +50,14 @@ describe('useTimetable(child, week, year)', () => {
})
})
it('returns correct initial value', () => {
const { result } = renderHook(() => useTimetable(child, week, year), { wrapper })
const { result } = renderHook(() => useTimetable(child, week, year, lang), { wrapper })

expect(result.current.status).toEqual('pending')
})
it('calls api', async () => {
await act(async () => {
api.isLoggedIn = true
const { waitForNextUpdate } = renderHook(() => useTimetable(child, week, year), { wrapper })
const { waitForNextUpdate } = renderHook(() => useTimetable(child, week, year, lang), { wrapper })

await waitForNextUpdate()
await waitForNextUpdate()
Expand All @@ -66,16 +68,16 @@ describe('useTimetable(child, week, year)', () => {
it('only calls api once', async () => {
await act(async () => {
api.isLoggedIn = true
renderHook(() => useTimetable(child, week, year), { wrapper })
const { waitForNextUpdate } = renderHook(() => useTimetable(child, week, year), { wrapper })
renderHook(() => useTimetable(child, week, year, lang), { wrapper })
const { waitForNextUpdate } = renderHook(() => useTimetable(child, week, year, lang), { wrapper })

await waitForNextUpdate()
renderHook(() => useTimetable(child, week, year), { wrapper })
renderHook(() => useTimetable(child, week, year, lang), { wrapper })
await waitForNextUpdate()
renderHook(() => useTimetable(child, week, year), { wrapper })
renderHook(() => useTimetable(child, week, year, lang), { wrapper })
await waitForNextUpdate()

const { result } = renderHook(() => useTimetable(child, week, year), { wrapper })
const { result } = renderHook(() => useTimetable(child, week, year, lang), { wrapper })

expect(api.getTimetable).toHaveBeenCalledTimes(1)
expect(result.current.status).toEqual('loaded')
Expand All @@ -84,7 +86,7 @@ describe('useTimetable(child, week, year)', () => {
it('calls cache', async () => {
await act(async () => {
api.isLoggedIn = true
const { result, waitForNextUpdate } = renderHook(() => useTimetable(child, week, year), { wrapper })
const { result, waitForNextUpdate } = renderHook(() => useTimetable(child, week, year, lang), { wrapper })

await waitForNextUpdate()
await waitForNextUpdate()
Expand All @@ -95,7 +97,7 @@ describe('useTimetable(child, week, year)', () => {
it('updates status to loading', async () => {
await act(async () => {
api.isLoggedIn = true
const { result, waitForNextUpdate } = renderHook(() => useTimetable(child, week, year), { wrapper })
const { result, waitForNextUpdate } = renderHook(() => useTimetable(child, week, year, lang), { wrapper })

await waitForNextUpdate()
await waitForNextUpdate()
Expand All @@ -106,7 +108,7 @@ describe('useTimetable(child, week, year)', () => {
it('updates status to loaded', async () => {
await act(async () => {
api.isLoggedIn = true
const { result, waitForNextUpdate } = renderHook(() => useTimetable(child, week, year), { wrapper })
const { result, waitForNextUpdate } = renderHook(() => useTimetable(child, week, year, lang), { wrapper })

await waitForNextUpdate()
await waitForNextUpdate()
Expand All @@ -120,28 +122,28 @@ describe('useTimetable(child, week, year)', () => {
api.isLoggedIn = true
api.isFake = false

const { waitForNextUpdate } = renderHook(() => useTimetable(child, week, year), { wrapper })
const { waitForNextUpdate } = renderHook(() => useTimetable(child, week, year, lang), { wrapper })

await waitForNextUpdate()
await waitForNextUpdate()
await waitForNextUpdate()
await pause(20)

expect(storage.cache['123_timetable_10_15_2021']).toEqual('[{"id":1}]')
expect(storage.cache['123_timetable_10_15_2021_sv']).toEqual('[{"id":1}]')
})
})
it('does not store in cache if fake', async () => {
await act(async () => {
api.isLoggedIn = true
api.isFake = true

const { waitForNextUpdate } = renderHook(() => useTimetable(child, week, year), { wrapper })
const { waitForNextUpdate } = renderHook(() => useTimetable(child, week, year, lang), { wrapper })

await waitForNextUpdate()
await waitForNextUpdate()
await pause(20)

expect(storage.cache['123_timetable_10_15_2021']).toEqual('[{"id":2}]')
expect(storage.cache['123_timetable_10_15_2021_sv']).toEqual('[{"id":2}]')
})
})
it('retries if api fails', async () => {
Expand All @@ -150,7 +152,7 @@ describe('useTimetable(child, week, year)', () => {
const error = new Error('fail')
api.getTimetable.mockRejectedValueOnce(error)

const { result, waitForNextUpdate } = renderHook(() => useTimetable(child, week, year), { wrapper })
const { result, waitForNextUpdate } = renderHook(() => useTimetable(child, week, year, lang), { wrapper })

await waitForNextUpdate()
await waitForNextUpdate()
Expand Down Expand Up @@ -178,7 +180,7 @@ describe('useTimetable(child, week, year)', () => {
api.getTimetable.mockRejectedValueOnce(error)
api.getTimetable.mockRejectedValueOnce(error)

const { result, waitForNextUpdate } = renderHook(() => useTimetable(child, week, year), { wrapper })
const { result, waitForNextUpdate } = renderHook(() => useTimetable(child, week, year, lang), { wrapper })

await waitForNextUpdate()
await waitForNextUpdate()
Expand All @@ -205,7 +207,7 @@ describe('useTimetable(child, week, year)', () => {
const error = new Error('fail')
api.getTimetable.mockRejectedValueOnce(error)

const { result, waitForNextUpdate } = renderHook(() => useTimetable(child, week, year), { wrapper })
const { result, waitForNextUpdate } = renderHook(() => useTimetable(child, week, year, lang), { wrapper })

await waitForNextUpdate()
await waitForNextUpdate()
Expand Down
33 changes: 11 additions & 22 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1304,19 +1304,23 @@
dependencies:
"@sinonjs/commons" "^1.7.0"

"@skolplattformen/embedded-api@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@skolplattformen/embedded-api/-/embedded-api-4.0.0.tgz#22ff23b12a111dbc92b20ee2017c78d417cd6e7d"
integrity sha512-leVEr1FXD2knV1K9ZT6bNcL+vCiuO+XpzASJAQOtYfgq869wF4Le5taP8N7jzxHh+Mm2hw7CaMsl5DIbL0YfFg==
"@skolplattformen/curriculum@^1.3.0":
version "1.3.0"
resolved "https://registry.yarnpkg.com/@skolplattformen/curriculum/-/curriculum-1.3.0.tgz#841e2ff0095e39e174cffdd0b8a81a17956de7ed"
integrity sha512-nuwZX45gHe5JaiYfygDP1HmbhAJOEXuuWwR04tNAnl/PaDGqJscfzKt8YD2SL+MHqi3LARjSKLa4ms4SxVQFyw==

"@skolplattformen/embedded-api@^5.1.0":
version "5.1.0"
resolved "https://registry.yarnpkg.com/@skolplattformen/embedded-api/-/embedded-api-5.1.0.tgz#924729bf82aad4e61663f54254b107cd9f6e8812"
integrity sha512-lne82FYZMx+fSJmWKA7gFtdsuL+t28HaRTGoqIZ+8Ys29ypU8uxHR7KMMo7rcykgKEe0ALWF3Vlmr66FrAG4Rg==
dependencies:
"@types/he" "^1.1.1"
camelcase-keys "^6.2.2"
change-case "^4.1.2"
events "^3.2.0"
events "^3.3.0"
h2m "^0.7.0"
he "^1.2.0"
js-htmlencode "^0.3.0"
luxon "^1.25.0"
luxon "^1.26.0"
node-html-parser "^2.1.0"

"@testing-library/dom@^7.28.1":
Expand Down Expand Up @@ -1412,11 +1416,6 @@
dependencies:
"@types/node" "*"

"@types/he@^1.1.1":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@types/he/-/he-1.1.1.tgz#19e14033c4ee8f1a702c74dcc6182664839ac2b7"
integrity sha512-jpzrsR1ns0n3kyWt92QfOUQhIuJGQ9+QGa7M62rO6toe98woQjnsnzjdMtsQXCdvjjmqjS2ZBCC7xKw0cdzU+Q==

"@types/hoist-non-react-statics@^3.3.0":
version "3.3.1"
resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz"
Expand Down Expand Up @@ -3024,11 +3023,6 @@ esutils@^2.0.2:
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==

events@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz"
integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==

events@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
Expand Down Expand Up @@ -4553,11 +4547,6 @@ lru-cache@^6.0.0:
dependencies:
yallist "^4.0.0"

luxon@^1.25.0:
version "1.25.0"
resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.25.0.tgz#d86219e90bc0102c0eb299d65b2f5e95efe1fe72"
integrity sha512-hEgLurSH8kQRjY6i4YLey+mcKVAWXbDNlZRmM6AgWDJ1cY3atl8Ztf5wEY7VBReFbmGnwQPz7KYJblL8B2k0jQ==

luxon@^1.26.0:
version "1.26.0"
resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.26.0.tgz#d3692361fda51473948252061d0f8561df02b578"
Expand Down

0 comments on commit be6c9d1

Please sign in to comment.