-
-

-
+
-
diff --git a/apps/saladeaula.digital/app/routes/payments.tsx b/apps/saladeaula.digital/app/routes/payments.tsx
index b850151..729a386 100644
--- a/apps/saladeaula.digital/app/routes/payments.tsx
+++ b/apps/saladeaula.digital/app/routes/payments.tsx
@@ -9,7 +9,7 @@ import {
BreadcrumbList,
BreadcrumbPage,
BreadcrumbSeparator
-} from '@/components/ui/breadcrumb'
+} from '@repo/ui/components/ui/breadcrumb'
export function meta({}: Route.MetaArgs) {
return [{ title: 'Histórico de compras' }]
diff --git a/apps/saladeaula.digital/app/routes/settings.tsx b/apps/saladeaula.digital/app/routes/settings.tsx
index 62a12e4..ceb4af2 100644
--- a/apps/saladeaula.digital/app/routes/settings.tsx
+++ b/apps/saladeaula.digital/app/routes/settings.tsx
@@ -2,6 +2,9 @@ import type { Route } from './+types'
import { Link } from 'react-router'
+import { userContext } from '@/context'
+import { request as req } from '@/lib/request'
+import type { User } from '@/middleware/auth'
import {
Breadcrumb,
BreadcrumbItem,
@@ -9,15 +12,15 @@ import {
BreadcrumbList,
BreadcrumbPage,
BreadcrumbSeparator
-} from '@/components/ui/breadcrumb'
-import { Button } from '@/components/ui/button'
+} from '@repo/ui/components/ui/breadcrumb'
+import { Button } from '@repo/ui/components/ui/button'
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle
-} from '@/components/ui/card'
+} from '@repo/ui/components/ui/card'
import {
Form,
FormControl,
@@ -25,12 +28,9 @@ import {
FormItem,
FormLabel,
FormMessage
-} from '@/components/ui/form'
-import { Input } from '@/components/ui/input'
-import { Spinner } from '@/components/ui/spinner'
-import { userContext } from '@/context'
-import { request as req } from '@/lib/request'
-import type { User } from '@/middleware/auth'
+} from '@repo/ui/components/ui/form'
+import { Input } from '@repo/ui/components/ui/input'
+import { Spinner } from '@repo/ui/components/ui/spinner'
import { useForm } from 'react-hook-form'
export function meta({}: Route.MetaArgs) {
diff --git a/apps/saladeaula.digital/package.json b/apps/saladeaula.digital/package.json
index e9c3ce3..ad124d3 100644
--- a/apps/saladeaula.digital/package.json
+++ b/apps/saladeaula.digital/package.json
@@ -12,42 +12,24 @@
"typecheck": "npm run cf-typegen && react-router typegen && tsc --noEmit"
},
"dependencies": {
- "@hookform/resolvers": "^5.2.2",
- "@radix-ui/react-avatar": "^1.1.10",
- "@radix-ui/react-dialog": "^1.1.15",
- "@radix-ui/react-dropdown-menu": "^2.1.16",
- "@radix-ui/react-label": "^2.1.7",
- "@radix-ui/react-popover": "^1.1.15",
- "@radix-ui/react-progress": "^1.1.7",
- "@radix-ui/react-select": "^2.2.6",
- "@radix-ui/react-separator": "^1.1.7",
- "@radix-ui/react-slot": "^1.2.3",
- "@radix-ui/react-tabs": "^1.1.13",
- "@react-router/dev": "^7.9.5",
+ "@repo/auth": "*",
+ "@repo/ui": "*",
"@tanstack/react-table": "^8.21.3",
- "class-variance-authority": "^0.7.1",
- "clsx": "^2.1.1",
- "cmdk": "^1.1.1",
+ "meilisearch-helper": "github:sergiors/meilisearch-helper",
"crypto-js": "^4.2.0",
"fuse.js": "^7.1.0",
"isbot": "^5.1.31",
- "jose": "^6.1.0",
- "lodash": "^4.17.21",
- "lucide-react": "^0.548.0",
"lzwcompress": "^1.1.0",
"meilisearch": "^0.54.0",
"react": "^19.2.0",
"react-dom": "^19.2.0",
- "react-hook-form": "^7.65.0",
"react-router": "^7.9.5",
- "remix-auth-oauth2": "^3.4.1",
- "remix-themes": "^2.0.4",
"rrweb": "^2.0.0-alpha.4",
"scorm-again": "^2.6.7",
- "tailwind-merge": "^3.3.1",
"zod": "^4.1.12"
},
"devDependencies": {
+ "@react-router/dev": "^7.9.5",
"@cloudflare/vite-plugin": "^1.13.17",
"@tailwindcss/vite": "^4.1.16",
"@types/crypto-js": "^4.2.2",
diff --git a/apps/saladeaula.digital/worker-configuration.d.ts b/apps/saladeaula.digital/worker-configuration.d.ts
index 51d389a..6613d27 100644
--- a/apps/saladeaula.digital/worker-configuration.d.ts
+++ b/apps/saladeaula.digital/worker-configuration.d.ts
@@ -1,5 +1,5 @@
/* eslint-disable */
-// Generated by Wrangler by running `wrangler types` (hash: e18fc2110ce73cc9f6afb0de66f703db)
+// Generated by Wrangler by running `wrangler types` (hash: a901705264ceb3e725e174d55b20e764)
// Runtime types generated with workerd@1.20251011.0 2025-04-04 nodejs_compat
declare namespace Cloudflare {
interface GlobalProps {
@@ -7,13 +7,16 @@ declare namespace Cloudflare {
}
interface Env {
CLIENT_ID: "1a5483ab-4521-4702-9115-5857ac676851";
- REDIRECT_URI: "https://scorm.eduseg.workers.dev/login";
SCOPE: "openid profile email offline_access";
API_URL: "https://bcs7fgb9og.execute-api.sa-east-1.amazonaws.com";
ISSUER_URL: "https://id.saladeaula.digital";
BUCKET_NAME: "saladeaula.digital";
BUCKET_ENDPOINT: "https://s3.sa-east-1.amazonaws.com";
MEILI_HOST: "https://search.saladeaula.digital";
+ CLIENT_SECRET: string;
+ REDIRECT_URI: string;
+ SESSION_SECRET: string;
+ MEILI_API_KEY: string;
}
}
interface Env extends Cloudflare.Env {}
@@ -21,7 +24,7 @@ type StringifyValues
> = {
[Binding in keyof EnvType]: EnvType[Binding] extends string ? EnvType[Binding] : string;
};
declare namespace NodeJS {
- interface ProcessEnv extends StringifyValues> {}
+ interface ProcessEnv extends StringifyValues> {}
}
// Begin runtime types
diff --git a/package-lock.json b/package-lock.json
index bac0b65..6ed0d21 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -25,26 +25,20 @@
"apps/admin.saladeaula.digital": {
"hasInstallScript": true,
"dependencies": {
- "@brazilian-utils/brazilian-utils": "^1.0.0-rc.12",
- "@hookform/resolvers": "^5.2.2",
"@react-router/fs-routes": "^7.9.5",
+ "@repo/auth": "*",
"@repo/ui": "*",
"@tanstack/react-table": "^8.21.3",
"date-fns": "^4.1.0",
"fuse.js": "^7.1.0",
"http-status-codes": "^2.3.0",
"isbot": "^5.1.31",
- "jose": "^6.1.0",
- "lodash": "^4.17.21",
"luxon": "^3.7.2",
"meilisearch": "^0.54.0",
"meilisearch-helper": "github:sergiors/meilisearch-helper",
"react": "^19.2.0",
"react-dom": "^19.2.0",
- "react-hook-form": "^7.66.0",
- "react-number-format": "^5.4.4",
"react-router": "^7.9.5",
- "remix-auth-oauth2": "^3.4.1",
"zod": "^4.1.12"
},
"devDependencies": {
@@ -164,43 +158,25 @@
"apps/saladeaula.digital": {
"hasInstallScript": true,
"dependencies": {
- "@hookform/resolvers": "^5.2.2",
- "@radix-ui/react-avatar": "^1.1.10",
- "@radix-ui/react-dialog": "^1.1.15",
- "@radix-ui/react-dropdown-menu": "^2.1.16",
- "@radix-ui/react-label": "^2.1.7",
- "@radix-ui/react-popover": "^1.1.15",
- "@radix-ui/react-progress": "^1.1.7",
- "@radix-ui/react-select": "^2.2.6",
- "@radix-ui/react-separator": "^1.1.7",
- "@radix-ui/react-slot": "^1.2.3",
- "@radix-ui/react-tabs": "^1.1.13",
- "@react-router/dev": "^7.9.5",
+ "@repo/auth": "*",
+ "@repo/ui": "*",
"@tanstack/react-table": "^8.21.3",
- "class-variance-authority": "^0.7.1",
- "clsx": "^2.1.1",
- "cmdk": "^1.1.1",
"crypto-js": "^4.2.0",
"fuse.js": "^7.1.0",
"isbot": "^5.1.31",
- "jose": "^6.1.0",
- "lodash": "^4.17.21",
- "lucide-react": "^0.548.0",
"lzwcompress": "^1.1.0",
"meilisearch": "^0.54.0",
+ "meilisearch-helper": "github:sergiors/meilisearch-helper",
"react": "^19.2.0",
"react-dom": "^19.2.0",
- "react-hook-form": "^7.65.0",
"react-router": "^7.9.5",
- "remix-auth-oauth2": "^3.4.1",
- "remix-themes": "^2.0.4",
"rrweb": "^2.0.0-alpha.4",
"scorm-again": "^2.6.7",
- "tailwind-merge": "^3.3.1",
"zod": "^4.1.12"
},
"devDependencies": {
"@cloudflare/vite-plugin": "^1.13.17",
+ "@react-router/dev": "^7.9.5",
"@tailwindcss/vite": "^4.1.16",
"@types/crypto-js": "^4.2.2",
"@types/node": "^24",
@@ -3961,6 +3937,10 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@repo/auth": {
+ "resolved": "packages/auth",
+ "link": true
+ },
"node_modules/@repo/ui": {
"resolved": "packages/ui",
"link": true
@@ -4605,6 +4585,13 @@
"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"license": "MIT"
},
+ "node_modules/@types/lodash": {
+ "version": "4.17.20",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz",
+ "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/luxon": {
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.7.1.tgz",
@@ -6422,19 +6409,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/remix-themes": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/remix-themes/-/remix-themes-2.0.4.tgz",
- "integrity": "sha512-S1vIx86xdsMv+ceaWGWtlVZBMhU4tmZeBOBzOiZnhbHnGBbd5YeyIlZ5EL3BSEhZq35oEcINeTrMrVju9GPYEA==",
- "license": "MIT",
- "workspaces": [
- "test-apps/*",
- "."
- ],
- "peerDependencies": {
- "react-router": ">=7.0.0"
- }
- },
"node_modules/retry": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
@@ -7155,9 +7129,9 @@
}
},
"node_modules/vite": {
- "version": "7.1.12",
- "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.12.tgz",
- "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.0.tgz",
+ "integrity": "sha512-C/Naxf8H0pBx1PA4BdpT+c/5wdqI9ILMdwjSMILw7tVIh3JsxzZqdeTLmmdaoh5MYUEOyBnM9K3o0DzoZ/fe+w==",
"license": "MIT",
"dependencies": {
"esbuild": "^0.25.0",
@@ -7966,10 +7940,40 @@
"url": "https://github.com/sponsors/colinhacks"
}
},
+ "packages/auth": {
+ "name": "@repo/auth",
+ "version": "0.0.0",
+ "dependencies": {
+ "jose": "^6.1.0",
+ "remix-auth-oauth2": "^3.4.1"
+ },
+ "devDependencies": {
+ "@types/node": "^24.9.2",
+ "@types/react": "^19.2.2",
+ "@types/react-dom": "^19.2.2",
+ "react-router": "^7.9.5",
+ "typescript": "^5.9.3"
+ }
+ },
+ "packages/auth/node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
"packages/ui": {
"name": "@repo/ui",
"version": "0.0.0",
"dependencies": {
+ "@brazilian-utils/brazilian-utils": "^1.0.0-rc.12",
"@hookform/resolvers": "^5.2.2",
"@radix-ui/react-avatar": "^1.1.10",
"@radix-ui/react-checkbox": "^1.3.3",
@@ -7989,15 +7993,23 @@
"clsx": "^2.1.1",
"cmdk": "^1.1.1",
"date-fns": "^4.1.0",
+ "lodash": "^4.17.21",
"lucide-react": "^0.548.0",
"next-themes": "^0.4.6",
"postcss": "^8.5.6",
"react-day-picker": "^9.11.1",
"react-hook-form": "^7.66.0",
+ "react-number-format": "^5.4.4",
"tailwind-merge": "^3.3.1",
"tailwindcss": "^4.1.16",
"tw-animate-css": "^1.4.0",
"zod": "^4.1.12"
+ },
+ "devDependencies": {
+ "@types/lodash": "^4.17.20",
+ "typescript": "^5.9.2",
+ "vite": "^7.2.0",
+ "vite-tsconfig-paths": "^5.1.4"
}
}
}
diff --git a/packages/auth/package.json b/packages/auth/package.json
new file mode 100644
index 0000000..1449697
--- /dev/null
+++ b/packages/auth/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "@repo/auth",
+ "version": "0.0.0",
+ "private": true,
+ "exports": {
+ "./auth": "./src/auth.ts",
+ "./session": "./src/session.ts",
+ "./context": "./src/context.ts",
+ "./middleware/*": "./src/middleware/*.ts"
+ },
+ "dependencies": {
+ "jose": "^6.1.0",
+ "remix-auth-oauth2": "^3.4.1"
+ },
+ "devDependencies": {
+ "react-router": "^7.9.5",
+ "@types/node": "^24.9.2",
+ "@types/react": "^19.2.2",
+ "@types/react-dom": "^19.2.2",
+ "typescript": "^5.9.3"
+ }
+}
diff --git a/apps/admin.saladeaula.digital/app/lib/auth.ts b/packages/auth/src/auth.ts
similarity index 96%
rename from apps/admin.saladeaula.digital/app/lib/auth.ts
rename to packages/auth/src/auth.ts
index 35bd563..1b766ef 100644
--- a/apps/admin.saladeaula.digital/app/lib/auth.ts
+++ b/packages/auth/src/auth.ts
@@ -13,7 +13,7 @@ export type User = {
refreshToken: string
}
-export function createAuth(env: Env) {
+export function createAuth(env) {
const authenticator = new Authenticator()
const strategy = new OAuth2Strategy(
{
diff --git a/packages/auth/src/context.ts b/packages/auth/src/context.ts
new file mode 100644
index 0000000..d512d04
--- /dev/null
+++ b/packages/auth/src/context.ts
@@ -0,0 +1,5 @@
+import type { User } from '@/auth'
+import { createContext } from 'react-router'
+
+export const userContext = createContext(null)
+export const requestIdContext = createContext(null)
diff --git a/apps/admin.saladeaula.digital/app/middleware/auth.ts b/packages/auth/src/middleware/auth.ts
similarity index 95%
rename from apps/admin.saladeaula.digital/app/middleware/auth.ts
rename to packages/auth/src/middleware/auth.ts
index 119c3d1..a03d57e 100644
--- a/apps/admin.saladeaula.digital/app/middleware/auth.ts
+++ b/packages/auth/src/middleware/auth.ts
@@ -1,7 +1,7 @@
import { requestIdContext, userContext } from '@/context'
-import { createSessionStorage } from '@/lib/session'
+import { createSessionStorage } from '@/session'
-import { createAuth, type User } from '@/lib/auth'
+import { createAuth, type User } from '@/auth'
import { decodeJwt } from 'jose'
import { redirect, type LoaderFunctionArgs } from 'react-router'
import type { OAuth2Strategy } from 'remix-auth-oauth2'
diff --git a/apps/admin.saladeaula.digital/app/middleware/logging.ts b/packages/auth/src/middleware/logging.ts
similarity index 100%
rename from apps/admin.saladeaula.digital/app/middleware/logging.ts
rename to packages/auth/src/middleware/logging.ts
diff --git a/apps/admin.saladeaula.digital/app/lib/session.ts b/packages/auth/src/session.ts
similarity index 87%
rename from apps/admin.saladeaula.digital/app/lib/session.ts
rename to packages/auth/src/session.ts
index ce38e93..91561c1 100644
--- a/apps/admin.saladeaula.digital/app/lib/session.ts
+++ b/packages/auth/src/session.ts
@@ -1,6 +1,6 @@
import { createCookieSessionStorage } from 'react-router'
-export function createSessionStorage(env: Env) {
+export function createSessionStorage(env) {
const sessionStorage = createCookieSessionStorage({
cookie: {
name: '__session',
diff --git a/packages/auth/tsconfig.json b/packages/auth/tsconfig.json
new file mode 100644
index 0000000..95ce42c
--- /dev/null
+++ b/packages/auth/tsconfig.json
@@ -0,0 +1,11 @@
+{
+ "compilerOptions": {
+ "moduleResolution": "bundler",
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ },
+ "include": ["src"],
+ "exclude": ["node_modules"]
+}
diff --git a/packages/ui/package.json b/packages/ui/package.json
index 3231a5d..c8955a0 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -4,8 +4,6 @@
"private": true,
"exports": {
"./globals.css": "./src/globals.css",
- "./postcss.config": "./postcss.config.js",
- "./tailwind.config": "./tailwind.config.ts",
"./lib/*": "./src/lib/*.ts",
"./hooks/*": [
"./src/hooks/*.ts",
@@ -15,6 +13,7 @@
"./components/*.svg": "./src/components/*.svg"
},
"dependencies": {
+ "@brazilian-utils/brazilian-utils": "^1.0.0-rc.12",
"@hookform/resolvers": "^5.2.2",
"@radix-ui/react-avatar": "^1.1.10",
"@radix-ui/react-checkbox": "^1.3.3",
@@ -34,14 +33,22 @@
"clsx": "^2.1.1",
"cmdk": "^1.1.1",
"date-fns": "^4.1.0",
+ "lodash": "^4.17.21",
"lucide-react": "^0.548.0",
"next-themes": "^0.4.6",
"postcss": "^8.5.6",
"react-day-picker": "^9.11.1",
"react-hook-form": "^7.66.0",
+ "react-number-format": "^5.4.4",
"tailwind-merge": "^3.3.1",
"tailwindcss": "^4.1.16",
"tw-animate-css": "^1.4.0",
"zod": "^4.1.12"
+ },
+ "devDependencies": {
+ "@types/lodash": "^4.17.20",
+ "typescript": "^5.9.2",
+ "vite": "^7.2.0",
+ "vite-tsconfig-paths": "^5.1.4"
}
}
diff --git a/apps/admin.saladeaula.digital/app/components/dark-mode.tsx b/packages/ui/src/components/dark-mode.tsx
similarity index 93%
rename from apps/admin.saladeaula.digital/app/components/dark-mode.tsx
rename to packages/ui/src/components/dark-mode.tsx
index 0eb39fb..b11c5b7 100644
--- a/apps/admin.saladeaula.digital/app/components/dark-mode.tsx
+++ b/packages/ui/src/components/dark-mode.tsx
@@ -3,15 +3,15 @@
import { Moon, Sun, SunMoon } from 'lucide-react'
import { useTheme } from 'next-themes'
-import { Button } from '@repo/ui/components/ui/button'
+import dark from './logo-dark.svg'
+import light from './logo-light.svg'
+import { Button } from './ui/button'
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger
-} from '@repo/ui/components/ui/dropdown-menu'
-import dark from './logo-dark.svg'
-import light from './logo-light.svg'
+} from './ui/dropdown-menu'
export function ModeToggle() {
const { setTheme } = useTheme()
diff --git a/apps/admin.saladeaula.digital/app/components/faceted-filter.tsx b/packages/ui/src/components/faceted-filter.tsx
similarity index 100%
rename from apps/admin.saladeaula.digital/app/components/faceted-filter.tsx
rename to packages/ui/src/components/faceted-filter.tsx
diff --git a/apps/admin.saladeaula.digital/app/components/nav-user.tsx b/packages/ui/src/components/nav-user.tsx
similarity index 67%
rename from apps/admin.saladeaula.digital/app/components/nav-user.tsx
rename to packages/ui/src/components/nav-user.tsx
index 7849887..04df52b 100644
--- a/apps/admin.saladeaula.digital/app/components/nav-user.tsx
+++ b/packages/ui/src/components/nav-user.tsx
@@ -4,12 +4,16 @@ import {
CirclePlayIcon,
DollarSignIcon,
GraduationCapIcon,
+ LayoutDashboardIcon,
+ LightbulbIcon,
LogOutIcon,
- UserIcon
+ UserIcon,
+ type LucideIcon
} from 'lucide-react'
import { Link } from 'react-router'
-import { Avatar, AvatarFallback } from '@repo/ui/components/ui/avatar'
+import { initials } from '../lib/utils'
+import { Avatar, AvatarFallback } from './ui/avatar'
import {
DropdownMenu,
DropdownMenuContent,
@@ -18,8 +22,40 @@ import {
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuTrigger
-} from '@repo/ui/components/ui/dropdown-menu'
-import { initials } from '@repo/ui/lib/utils'
+} from './ui/dropdown-menu'
+
+type NavItem = {
+ title: string
+ url: string
+ icon: LucideIcon
+ scope?: string[]
+}
+
+const apps: NavItem[] = [
+ {
+ title: 'Sala de aula',
+ url: '//scorm.eduseg.workers.dev',
+ icon: GraduationCapIcon
+ },
+ {
+ title: 'Administrador',
+ url: '//admin.saladeaula.digital',
+ icon: LayoutDashboardIcon,
+ scope: ['apps:admin']
+ },
+ {
+ title: 'EDUSEG® Estúdio',
+ url: '//studio.saladeaula.digital',
+ icon: CirclePlayIcon,
+ scope: ['apps:studio']
+ },
+ {
+ title: 'EDUSEG® Insights',
+ url: '//insights.saladeaula.digital',
+ icon: LightbulbIcon,
+ scope: ['apps:insights']
+ }
+]
export function NavUser({
user
@@ -30,7 +66,7 @@ export function NavUser({
scope: string
}
}) {
- const scopes = user.scope.split(' ')
+ const userScope = user.scope.split(' ')
return (
@@ -82,7 +118,11 @@ export function NavUser({
- {grantIfHas(['apps:admin', 'apps:studio'], scopes, 'any') && (
+ {grantIfHas(
+ ['apps:admin', 'apps:studio', 'apps:insights'],
+ userScope,
+ 'any'
+ ) && (
<>
@@ -91,26 +131,19 @@ export function NavUser({
>
)}
-
-
-
- Sala de aula
-
-
+ {apps.map(({ title, url, scope = [], icon: Icon }, idx) => {
+ if (grantIfHas(scope, userScope)) {
+ return (
+
+
+ {title}
+
+
+ )
+ }
- {grantIfHas(['apps:studio'], scopes) && (
- <>
-
-
-
- EDUSEG® Estúdio
-
-
- >
- )}
+ return <>>
+ })}
diff --git a/apps/admin.saladeaula.digital/app/components/search-form.tsx b/packages/ui/src/components/search-form.tsx
similarity index 96%
rename from apps/admin.saladeaula.digital/app/components/search-form.tsx
rename to packages/ui/src/components/search-form.tsx
index 879c633..03a1580 100644
--- a/apps/admin.saladeaula.digital/app/components/search-form.tsx
+++ b/packages/ui/src/components/search-form.tsx
@@ -9,7 +9,7 @@ import {
InputGroupInput
} from '@repo/ui/components/ui/input-group'
-import { useKeyPress } from '@/hooks/use-keypress'
+import { useKeyPress } from '@repo/ui/hooks/use-keypress'
import { cn } from '@repo/ui/lib/utils'
export function SearchForm({
diff --git a/apps/saladeaula.digital/app/components/skeleton.tsx b/packages/ui/src/components/skeleton.tsx
similarity index 89%
rename from apps/saladeaula.digital/app/components/skeleton.tsx
rename to packages/ui/src/components/skeleton.tsx
index c86dd3d..185ff5f 100644
--- a/apps/saladeaula.digital/app/components/skeleton.tsx
+++ b/packages/ui/src/components/skeleton.tsx
@@ -1,4 +1,4 @@
-import { Skeleton as XSkeleton } from '@/components/ui/skeleton'
+import { Skeleton as XSkeleton } from './ui/skeleton'
export function Skeleton() {
return (
diff --git a/apps/admin.saladeaula.digital/app/hooks/use-keypress.tsx b/packages/ui/src/hooks/use-keypress.ts
similarity index 100%
rename from apps/admin.saladeaula.digital/app/hooks/use-keypress.tsx
rename to packages/ui/src/hooks/use-keypress.ts
diff --git a/packages/ui/src/hooks/use-mobile.ts b/packages/ui/src/hooks/use-mobile.ts
index 2b0fe1d..4331d5c 100644
--- a/packages/ui/src/hooks/use-mobile.ts
+++ b/packages/ui/src/hooks/use-mobile.ts
@@ -1,4 +1,4 @@
-import * as React from "react"
+import * as React from 'react'
const MOBILE_BREAKPOINT = 768
@@ -10,9 +10,9 @@ export function useIsMobile() {
const onChange = () => {
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
}
- mql.addEventListener("change", onChange)
+ mql.addEventListener('change', onChange)
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
- return () => mql.removeEventListener("change", onChange)
+ return () => mql.removeEventListener('change', onChange)
}, [])
return !!isMobile
diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json
index d83207f..5adb4b7 100644
--- a/packages/ui/tsconfig.json
+++ b/packages/ui/tsconfig.json
@@ -1,5 +1,13 @@
{
"compilerOptions": {
+ "composite": true,
+ "strict": true,
+ "lib": ["DOM", "DOM.Iterable", "ES2022"],
+ "types": ["vite/client"],
+ "target": "ES2022",
+ "module": "ES2022",
+ "moduleResolution": "bundler",
+ "jsx": "react-jsx",
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
diff --git a/packages/ui/vite.config.ts b/packages/ui/vite.config.ts
index 0fe3652..8e47d62 100644
--- a/packages/ui/vite.config.ts
+++ b/packages/ui/vite.config.ts
@@ -1,6 +1,7 @@
import tailwindcss from '@tailwindcss/vite'
import { defineConfig } from 'vite'
+import tsconfigPaths from 'vite-tsconfig-paths'
export default defineConfig({
- plugins: [tailwindcss()]
+ plugins: [tailwindcss(), tsconfigPaths()]
})