Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Search page alerts #1182

Open
wants to merge 145 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 100 commits
Commits
Show all changes
145 commits
Select commit Hold shift + click to select a range
4364c13
Current services still filtered when changing pages
kuck1 Mar 13, 2024
9b9875c
Warnings added at certain levels per state
kuck1 Mar 22, 2024
ac4221b
Tweaks to color system and design for search alert banner
kuck1 Mar 22, 2024
40598eb
Merge conflict
kuck1 Mar 22, 2024
4f834a3
Cleanup
kuck1 Mar 22, 2024
b531d61
Design updates
kuck1 Mar 23, 2024
18e8976
Color updates and USA check
kuck1 Mar 24, 2024
aa9b9dc
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Mar 25, 2024
a6def0e
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Mar 25, 2024
3541264
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Mar 25, 2024
cb38c78
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Mar 25, 2024
981d651
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Mar 26, 2024
f0f4a3b
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Mar 26, 2024
1fc8cdb
Merge branch 'dev' into search-page-alerts
JoeKarow Mar 26, 2024
abafc40
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Mar 26, 2024
8faeb20
Alert banner components
kuck1 Mar 27, 2024
03023a9
Merge branch 'search-page-alerts' of https://github.com/weareinreach/…
kuck1 Mar 27, 2024
7b71fbd
create LocationAlert table
JoeKarow Mar 27, 2024
a2338f0
update freeText generator
JoeKarow Mar 27, 2024
18b2915
add alert level field
JoeKarow Mar 27, 2024
ea37be5
create api route & mock data
JoeKarow Mar 27, 2024
171f56a
fix component & story
JoeKarow Mar 27, 2024
0812bc5
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Mar 28, 2024
db6503f
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Mar 28, 2024
1270e46
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Mar 28, 2024
288705a
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Mar 29, 2024
6d1b9f3
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 1, 2024
98205f3
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 1, 2024
3d64306
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 2, 2024
22f43da
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 2, 2024
c51d503
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 3, 2024
7d86903
Merge branch 'dev' into search-page-alerts
JoeKarow Apr 3, 2024
e8d0c24
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 3, 2024
fa78947
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 3, 2024
c6a4d78
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 3, 2024
045b747
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 3, 2024
563259b
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 3, 2024
50223a9
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 3, 2024
62441be
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 4, 2024
f1a45d9
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 4, 2024
9ae63e3
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 9, 2024
640193f
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 9, 2024
7841e80
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 9, 2024
4dcb3ab
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 10, 2024
c0a24cb
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 10, 2024
91c5d39
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 11, 2024
1f3c3a0
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 11, 2024
c367eb7
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 11, 2024
85a65e3
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 11, 2024
a650d1d
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 11, 2024
1fa9cd0
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 11, 2024
529d029
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 12, 2024
914c4a9
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 12, 2024
0ebad05
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 15, 2024
1792e3d
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 15, 2024
8e93bd1
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 15, 2024
40d2433
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 15, 2024
f62ade6
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 15, 2024
3193b46
remove overrides
JoeKarow Apr 15, 2024
6744e14
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 15, 2024
f4ef6a8
Merge branch 'dev' into search-page-alerts
JoeKarow Apr 15, 2024
9172728
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 15, 2024
dd58a33
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 17, 2024
ba5257b
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 17, 2024
e7f2264
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 18, 2024
b90e7d8
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 19, 2024
2ceae23
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 19, 2024
f7e16dd
Merge branch 'dev' into search-page-alerts
JoeKarow Apr 22, 2024
69c1452
chore: lint & format
InReach-svc Apr 22, 2024
ff59167
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 22, 2024
0d4b97e
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 22, 2024
3968a3e
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 22, 2024
9995efe
fix: social media saving (#1238)
JoeKarow Apr 22, 2024
b05e0d0
fix(db): update all non-major dependencies (#1237)
renovate[bot] Apr 23, 2024
bc0941f
chore(workflows): update github actions (#1239)
renovate[bot] Apr 23, 2024
419c039
chore(db): update all non-major dependencies (#1242)
renovate[bot] Apr 23, 2024
a43ef77
fix: misc sonarlint issues (#1240)
JoeKarow Apr 23, 2024
3ff8f60
fix: sonarlint issues - api (#1245)
JoeKarow Apr 24, 2024
5ba4e46
Merge branch 'dev' into search-page-alerts
JoeKarow Apr 24, 2024
aa8f4f8
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 24, 2024
d4f2875
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 24, 2024
f1e34a2
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 25, 2024
6ebfd7c
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 25, 2024
14f43d4
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 26, 2024
4db914d
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 26, 2024
7acf791
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 29, 2024
38928ea
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Apr 29, 2024
4a7f4ba
Merge branch 'dev' into search-page-alerts
JoeKarow Apr 30, 2024
72cb89b
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 1, 2024
0b1aeec
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 2, 2024
a9a1d6e
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 2, 2024
4308735
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 3, 2024
475030d
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 3, 2024
39415d0
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 3, 2024
f4e9277
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 3, 2024
a3307cb
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 6, 2024
e7b56bb
Merge branch 'dev' into search-page-alerts
JoeKarow May 6, 2024
9969e7f
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 6, 2024
bf83dcb
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 7, 2024
4a157dc
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 7, 2024
74c1ee8
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 7, 2024
d1660ff
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 7, 2024
d7ce6d4
Integrating frontend and backend messaging
kuck1 May 8, 2024
807bf0d
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 9, 2024
83fe74d
Merge branch 'search-page-alerts' of https://github.com/weareinreach/…
kuck1 May 14, 2024
8e701ff
Pair programming updates with Joe to move logic to component
kuck1 May 14, 2024
61aa216
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 20, 2024
bc80afe
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 20, 2024
6c10984
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 20, 2024
d464dd7
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 20, 2024
9cf88ea
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 20, 2024
151173e
Pair programming results
kuck1 May 20, 2024
812c70e
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 21, 2024
44a327a
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 22, 2024
1529af8
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 24, 2024
d8a1abd
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 28, 2024
8f01aea
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 28, 2024
84b92d5
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 28, 2024
985da6d
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 29, 2024
069f289
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] May 29, 2024
da6ffe7
Polishing the UI
kuck1 Jun 5, 2024
96fcb78
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Jun 5, 2024
72544ba
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Jun 5, 2024
ea79917
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Jun 5, 2024
78d5e46
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Jun 6, 2024
65e1822
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Jun 6, 2024
fd69305
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Jun 6, 2024
7523f56
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Jun 6, 2024
40ad26e
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Jun 6, 2024
b59aa69
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Jun 10, 2024
7c00132
Merge branch 'dev' into search-page-alerts
JoeKarow Jun 10, 2024
bd277b1
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Jun 10, 2024
767f42a
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Jun 10, 2024
5da34e4
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Jun 10, 2024
c9569c0
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Jun 10, 2024
1f10b4c
Merge branch 'dev' into search-page-alerts
kodiakhq[bot] Jun 12, 2024
7a84f8b
polishing margins
kuck1 Jun 12, 2024
9dea1f2
Merge branch 'search-page-alerts' of https://github.com/weareinreach/…
kuck1 Jun 12, 2024
a4020aa
remove duplicate and unneeded code
kuck1 Jun 12, 2024
ee042d7
remove unneeded code
kuck1 Jun 12, 2024
f82ea3b
Update packages/ui/components/core/SearchBox.tsx
kuck1 Jun 12, 2024
271dba9
deep source updates
kuck1 Jun 12, 2024
eb67e6d
Merge branch 'search-page-alerts' of https://github.com/weareinreach/…
kuck1 Jun 12, 2024
3d6cdab
self closing
kuck1 Jun 12, 2024
8ee780c
sonar cloud fixes
kuck1 Jun 12, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 6 additions & 1 deletion apps/app/public/locales/en/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,12 @@
"alert-message-instructions": "Enter the alert message",
"alert-title-instructions": "Enter a title for the message...",
"alerts": {
"search-page-legislative-map": "This <ATLink>anti-trans legislative risk map</ATLink> shows the 2-year risk for anti-trans laws in all 50 states and D.C."
"search-page-legislative-map": "This <ATLink>anti-trans legislative risk map</ATLink> shows the 2-year risk for anti-trans laws in all 50 states and D.C.",
"search-page-do-not-fly-florida": "Please be aware there is a <ATLink>travel advisory alert</ATLink> for the LGBTQ+ community in Florida.",
"search-page-high-risk-state": "This state is a <ATLink>high-risk state</ATLink> for anti-trans legislation. Contact providers for more information.",
"search-page-med-risk-state": "This state is a <ATLink>moderate-risk state</ATLink> for anti-trans legislation. Contact providers for more information.",
"search-page-low-risk-state": "This state is a <ATLink>low-risk state</ATLink> for anti-trans legislation.",
"search-page-most-protective-state": "This state is <ATLink>one of the most protective states</ATLink> for transgender, nonbinary and gender non-conforming people."
},
"all-service-category": "All {{serviceCategory}}",
"anti-hate": {
Expand Down
67 changes: 46 additions & 21 deletions apps/app/src/pages/search/[...params]/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ import { z } from 'zod'

import { SearchParamsSchema } from '@weareinreach/api/schemas/routes/search'
import { type ApiOutput, trpcServerClient } from '@weareinreach/api/trpc'
import { CountryAlertBanner } from '@weareinreach/ui/components/core/AlertBanner/CountryAlertBanner.stories'
import { StateAlertBanner } from '@weareinreach/ui/components/core/AlertBanner/StateAlertBanner.stories'
kuck1 marked this conversation as resolved.
Show resolved Hide resolved
import { Pagination } from '@weareinreach/ui/components/core/Pagination'
import { SearchBox } from '@weareinreach/ui/components/core/SearchBox'
import { SearchResultCard } from '@weareinreach/ui/components/core/SearchResultCard'
Expand Down Expand Up @@ -177,6 +179,16 @@ const SearchResults = () => {
}
}, [data, loadingPage])

const [stateInUS, setStateInUS] = useState<string>('')

useEffect(() => {
if (searchState.searchTerm?.slice(-3) == 'USA') {
setStateInUS(searchState.searchTerm?.split(', ')[1] || '')
} else {
setStateInUS('')
}
}, [searchState.searchTerm])

JoeKarow marked this conversation as resolved.
Show resolved Hide resolved
kuck1 marked this conversation as resolved.
Show resolved Hide resolved
useEffect(
() => {
if (typeof router.query.page === 'string' && searchState.page !== router.query.page) {
Expand Down Expand Up @@ -227,31 +239,20 @@ const SearchResults = () => {
<Head>
<title>{t('page-title.base', { ns: 'common', title: '$t(page-title.search-results)' })}</title>
</Head>
{showAlertMessage && (
<Box className={classes.banner}>
<Text variant={variants.Text.utility1white}>
<Trans
i18nKey='alerts.search-page-legislative-map'
ns='common'
components={{
ATLink: (
<Link
external
variant={variants.Link.inheritStyle}
href='https://www.erininthemorning.com/p/anti-trans-legislative-risk-assessment-43a'
target='_blank'
></Link>
),
}}
/>
</Text>
</Box>
{showCountryAlertMessage && (
<CountryAlertBanner
variant={variants.Text.utility1white}
variantInheritStyle={variants.Link.inheritStyle}
></CountryAlertBanner>
)}

kuck1 marked this conversation as resolved.
Show resolved Hide resolved
<Grid.Col
xs={12}
sm={12}
pb={30}
{...(showAlertMessage ? { mt: { base: 80, xs: 80, sm: 20, md: 20, lg: 20, xl: 40 } } : {})}
{...(showCountryAlertMessage || showStateAlertMessage
? { mt: { base: 80, xs: 80, sm: 20, md: 20, lg: 20, xl: 40 } }
: {})}
>
<Group spacing={20} w='100%' className={classes.searchControls}>
<Group maw={{ md: '50%', base: '100%' }} w='100%'>
Expand All @@ -263,7 +264,11 @@ const SearchResults = () => {
/>
</Group>
<Group noWrap w={{ base: '100%', md: '50%' }}>
<ServiceFilter resultCount={resultCount} isFetching={searchIsFetching} />
<ServiceFilter
resultCount={resultCount}
isFetching={searchIsFetching}
current={searchState.services}
/>
{/* @ts-expect-error `component` prop not needed.. */}
<MoreFilter resultCount={resultCount} isFetching={searchIsFetching}>
{t('more.filters')}
Expand All @@ -287,6 +292,26 @@ const SearchResults = () => {
loadingManager={{ setLoading: setLoadingPage, isLoading: loadingPage }}
/>
</Grid.Col>
<>
<Grid.Col xs={12} sm={8} md={8}>
{data?.resultCount === 0 && crisisResults ? (
<NoResults crisisData={crisisResults} />
) : (
<>
<StateAlertBanner
stateInUS={stateInUS}
variantInheritStyle={variants.Link.inheritStyle}
variantBlack={variants.Text.utility1}
variantWhite={variants.Text.utility1white}
infoColor={theme.other.colors.secondary.cornflower}
warningColor={theme.fn.lighten(theme.other.colors.tertiary.pink, 0.3)}
></StateAlertBanner>
{resultDisplay}
<Pagination total={getSearchResultPageCount(data?.resultCount)} />
</>
)}
</Grid.Col>
</>
<Grid.Col xs={12} sm={8} md={8}>
{data?.resultCount === 0 && crisisResults ? (
<NoResults crisisData={crisisResults} />
Expand Down
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@
"pnpm": {
"peerDependencyRules": {
"allowedVersions": {
"react": "18",
"react-dom": "18",
"typescript": "5",
"webpack": "5"
}
Expand Down
9 changes: 9 additions & 0 deletions packages/api/router/component/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,15 @@ export const componentRouter = defineRouter({
)
return handler(opts)
}),
LocationBasedAlertBanner: publicProcedure
.input(schema.ZLocationBasedAlertBannerSchema)
.query(async (opts) => {
const handler = await importHandler(
namespaced('LocationBasedAlertBanner'),
() => import('./query.LocationBasedAlertBanner.handler')
)
return handler(opts)
}),
AttributeEditWrapper: permissionedProcedure('updateOrgService')
.input(schema.ZAttributeEditWrapperSchema)
.mutation(async (opts) => {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { prisma, Prisma } from '@weareinreach/db'
import { handleError } from '~api/lib/errorHandler'
import { type TRPCHandlerParams } from '~api/types/handler'

import { type TLocationBasedAlertBannerSchema } from './query.LocationBasedAlertBanner.schema'

export const LocationBasedAlertBanner = async ({
input,
}: TRPCHandlerParams<TLocationBasedAlertBannerSchema>) => {
try {
const { lat, lon } = input
const matchedAreas = await prisma.$queryRaw<MatchedAreaResults>(Prisma.sql`
SELECT id from "GeoData" g WHERE ST_CoveredBy(ST_Point(${lon}, ${lat}, 4326), g.geo)
`)
const geoIds = matchedAreas.map(({ id }) => id)

const alerts = await prisma.locationAlert.findMany({
where: {
active: true,
OR: [{ country: { geoDataId: { in: geoIds } } }, { govDist: { geoDataId: { in: geoIds } } }],
},
select: {
id: true,
level: true,
text: { select: { tsKey: { select: { ns: true, key: true, text: true } } } },
},
})

const formatted = alerts.map(
({
id,
level,
text: {
tsKey: { key, ns, text },
},
}) => ({ id, level, i18nKey: key, ns, defaultText: text })
)
return formatted
} catch (error) {
handleError(error)
}
}
export default LocationBasedAlertBanner

type MatchedAreaResults = {
id: string
}[]
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { z } from 'zod'

export const ZLocationBasedAlertBannerSchema = z.object({
lat: z.number(),
lon: z.number(),
})
export type TLocationBasedAlertBannerSchema = z.infer<typeof ZLocationBasedAlertBannerSchema>
1 change: 1 addition & 0 deletions packages/api/router/component/schemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ export * from './mutation.EditModeBarDelete.schema'
export * from './mutation.EditModeBarPublish.schema'
export * from './mutation.EditModeBarReverify.schema'
export * from './query.EditModeBar.schema'
export * from './query.LocationBasedAlertBanner.schema'
export * from './query.serviceModal.schema'
// codegen:end
48 changes: 24 additions & 24 deletions packages/db/lib/generateFreeText.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,33 +9,40 @@ import { slug } from './slugGen'
const createKey = (parts: string[]) =>
parts.map((part) => slug(part, { remove: /[^\w\s$*+~.()'"!\-:@]+/g })).join('.')

export const generateFreeText = <T extends GenerateFreeTextType>({
orgId,
itemId,
text,
type,
freeTextId,
}: GenerateFreeTextParams<T>): GenerateFreeTextReturn => {
export const generateFreeText = <T extends GenerateFreeTextType>(args: GenerateFreeTextParams<T>) => {
const { text, type, freeTextId } = args
const key = (() => {
switch (type) {
case 'orgDesc': {
const { orgId } = args as GenerateFreeTextParams<'orgDesc'>
invariant(orgId)
return createKey([orgId, 'description'])
}
case 'attSupp': {
invariant(itemId)
const { orgId, itemId } = args as GenerateFreeTextParams<'attSupp'>
invariant(itemId && orgId)
return createKey([orgId, 'attribute', itemId])
}
case 'svcName': {
invariant(itemId)
const { orgId, itemId } = args as GenerateFreeTextParams<'svcName'>
invariant(itemId && orgId)
return createKey([orgId, itemId, 'name'])
}
case 'websiteDesc':
case 'phoneDesc':
case 'emailDesc':
case 'svcDesc': {
invariant(itemId)
const { orgId, itemId } = args as GenerateFreeTextParams<
'websiteDesc' | 'phoneDesc' | 'emailDesc' | 'svcDesc'
>
invariant(itemId && orgId)
return createKey([orgId, itemId, 'description'])
}
case 'locationAlert': {
const { itemId } = args as GenerateFreeTextParams<'locationAlert'>
invariant(itemId)
return createKey(['locationBasedAlert', itemId])
}
Comment on lines +12 to +45
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Refactor to improve type safety and readability.

Consider simplifying the switch-case structure by separating concerns and possibly using a map or factory pattern for key generation. Also, address the static analysis issues regarding the use of {} as a type.

- (T extends 'locationAlert' ? {} : { orgId: string }) &
- (T extends 'orgDesc' ? {} : { itemId: string })
+ (T extends 'locationAlert' ? { orgId?: never } : { orgId: string }) &
+ (T extends 'orgDesc' ? { itemId?: never } : { itemId: string })
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export const generateFreeText = <T extends GenerateFreeTextType>(args: GenerateFreeTextParams<T>) => {
const { text, type, freeTextId } = args
const key = (() => {
switch (type) {
case 'orgDesc': {
const { orgId } = args as GenerateFreeTextParams<'orgDesc'>
invariant(orgId)
return createKey([orgId, 'description'])
}
case 'attSupp': {
invariant(itemId)
const { orgId, itemId } = args as GenerateFreeTextParams<'attSupp'>
invariant(itemId && orgId)
return createKey([orgId, 'attribute', itemId])
}
case 'svcName': {
invariant(itemId)
const { orgId, itemId } = args as GenerateFreeTextParams<'svcName'>
invariant(itemId && orgId)
return createKey([orgId, itemId, 'name'])
}
case 'websiteDesc':
case 'phoneDesc':
case 'emailDesc':
case 'svcDesc': {
invariant(itemId)
const { orgId, itemId } = args as GenerateFreeTextParams<
'websiteDesc' | 'phoneDesc' | 'emailDesc' | 'svcDesc'
>
invariant(itemId && orgId)
return createKey([orgId, itemId, 'description'])
}
case 'locationAlert': {
const { itemId } = args as GenerateFreeTextParams<'locationAlert'>
invariant(itemId)
return createKey(['locationBasedAlert', itemId])
}
export const generateFreeText = <T extends GenerateFreeTextType>(args: GenerateFreeTextParams<T>) => {
const { text, type, freeTextId } = args
const key = (() => {
switch (type) {
case 'orgDesc': {
const { orgId } = args as GenerateFreeTextParams<'orgDesc'>
invariant(orgId)
return createKey([orgId, 'description'])
}
case 'attSupp': {
const { orgId, itemId } = args as GenerateFreeTextParams<'attSupp'>
invariant(itemId && orgId)
return createKey([orgId, 'attribute', itemId])
}
case 'svcName': {
const { orgId, itemId } = args as GenerateFreeTextParams<'svcName'>
invariant(itemId && orgId)
return createKey([orgId, itemId, 'name'])
}
case 'websiteDesc':
case 'phoneDesc':
case 'emailDesc':
case 'svcDesc': {
const { orgId, itemId } = args as GenerateFreeTextParams<
'websiteDesc' | 'phoneDesc' | 'emailDesc' | 'svcDesc'
>
invariant(itemId && orgId)
return createKey([orgId, itemId, 'description'])
}
case 'locationAlert': {
const { itemId } = args as GenerateFreeTextParams<'locationAlert'>
invariant(itemId)
return createKey(['locationBasedAlert', itemId])
}
}
})()
// Additional code here
}

default: {
return null
}
Expand Down Expand Up @@ -147,12 +154,14 @@ interface GenerateNestedFreeTextUpsertResult {
}
}

type GenerateFreeTextParams<T extends GenerateFreeTextType> = GenerateFreeTextWithItem<T>
interface GenerateFreeTextBase {
type GenerateFreeTextParams<T extends GenerateFreeTextType> = {
type: T
text: string
orgId: string
freeTextId?: string | null
}
// eslint-disable-next-line @typescript-eslint/ban-types
} & (T extends 'locationAlert' ? {} : { orgId: string }) &
// eslint-disable-next-line @typescript-eslint/ban-types
(T extends 'orgDesc' ? {} : { itemId: string })

type GenerateFreeTextType =
| 'attSupp'
Expand All @@ -162,13 +171,4 @@ type GenerateFreeTextType =
| 'phoneDesc'
| 'websiteDesc'
| 'orgDesc'

interface GenerateFreeTextWithItem<T extends GenerateFreeTextType> extends GenerateFreeTextBase {
type: T
itemId?: GenerateFreeTextItemId<T>
}
type GenerateFreeTextItemId<T extends GenerateFreeTextType> = T extends 'orgDesc' ? never : Required<string>
// interface GenerateFreeTextWithoutItem extends GenerateFreeTextBase {
// type: 'orgDesc'
// itemId?: never
// }
| 'locationAlert'
1 change: 1 addition & 0 deletions packages/db/lib/idGen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ export const idPrefix = {
govDistType: 'gdty',
internalNote: 'note',
language: 'lang',
locationAlert: 'alrt',
organization: 'orgn',
orgEmail: 'oeml',
orgHours: 'ohrs',
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
-- CreateEnum
CREATE TYPE "LocationAlertLevel" AS ENUM(
'INFO',
'WARN',
'CRITICAL'
);

-- CreateTable
CREATE TABLE "LocationAlert"(
"id" text NOT NULL,
"active" boolean NOT NULL DEFAULT TRUE,
"textId" text NOT NULL,
"level" "LocationAlertLevel" NOT NULL,
"countryId" text,
"govDistId" text,
CONSTRAINT "LocationAlert_pkey" PRIMARY KEY ("id")
);

-- CreateIndex
CREATE INDEX "LocationAlert_countryId_textId_idx" ON
"LocationAlert"("countryId", "textId");

-- CreateIndex
CREATE INDEX "LocationAlert_govDistId_textId_idx" ON
"LocationAlert"("govDistId", "textId");

-- CreateIndex
CREATE INDEX "LocationAlert_active_countryId_textId_idx" ON
"LocationAlert"("active", "countryId", "textId");

-- CreateIndex
CREATE INDEX "LocationAlert_active_govDistId_textId_idx" ON
"LocationAlert"("active", "govDistId", "textId");

-- AddForeignKey
ALTER TABLE "LocationAlert"
ADD CONSTRAINT "LocationAlert_textId_fkey" FOREIGN KEY ("textId")
REFERENCES "FreeText"("id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "LocationAlert"
ADD CONSTRAINT "LocationAlert_countryId_fkey" FOREIGN KEY ("countryId")
REFERENCES "Country"("id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "LocationAlert"
ADD CONSTRAINT "LocationAlert_govDistId_fkey" FOREIGN KEY ("govDistId")
REFERENCES "GovDist"("id") ON DELETE CASCADE ON UPDATE CASCADE;

-- Custom constraint
ALTER TABLE "LocationAlert"
ADD CONSTRAINT "LocationAlert_Location_CUSTOM" CHECK
((num_nonnulls("countryId", "govDistId") = 1));