Readyish for prod!

This commit is contained in:
gib
2025-06-13 16:53:33 -05:00
parent 55fdeb23b3
commit 0ba218e521
4 changed files with 119 additions and 93 deletions
+1 -1
View File
@@ -53,7 +53,7 @@
"@types/node": "^20.19.0",
"@types/react": "^19.1.8",
"@types/react-dom": "^19.1.6",
"eslint": "^9.28.0",
"eslint": "^9.29.0",
"eslint-config-next": "^15.3.3",
"eslint-config-prettier": "^10.1.5",
"eslint-plugin-prettier": "^5.4.1",
+65 -65
View File
@@ -112,17 +112,17 @@ importers:
specifier: ^19.1.6
version: 19.1.6(@types/[email protected])
eslint:
specifier: ^9.28.0
version: 9.28.0([email protected])
specifier: ^9.29.0
version: 9.29.0([email protected])
eslint-config-next:
specifier: ^15.3.3
version: 15.3.3([email protected]8.0([email protected]))([email protected])
version: 15.3.3([email protected]9.0([email protected]))([email protected])
eslint-config-prettier:
specifier: ^10.1.5
version: 10.1.5([email protected]8.0([email protected]))
version: 10.1.5([email protected]9.0([email protected]))
eslint-plugin-prettier:
specifier: ^5.4.1
version: 5.4.1(@types/[email protected])([email protected]([email protected]8.0([email protected])))([email protected]8.0([email protected]))([email protected])
version: 5.4.1(@types/[email protected])([email protected]([email protected]9.0([email protected])))([email protected]9.0([email protected]))([email protected])
import-in-the-middle:
specifier: ^1.14.2
version: 1.14.2
@@ -152,7 +152,7 @@ importers:
version: 5.8.3
typescript-eslint:
specifier: ^8.34.0
version: 8.34.0([email protected]8.0([email protected]))([email protected])
version: 8.34.0([email protected]9.0([email protected]))([email protected])
packages:
@@ -266,8 +266,8 @@ packages:
resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/[email protected]8.0':
resolution: {integrity: sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==}
'@eslint/[email protected]9.0':
resolution: {integrity: sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/[email protected]':
@@ -2235,8 +2235,8 @@ packages:
resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
[email protected]8.0:
resolution: {integrity: sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==}
[email protected]9.0:
resolution: {integrity: sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
hasBin: true
peerDependencies:
@@ -3720,9 +3720,9 @@ snapshots:
tslib: 2.8.1
optional: true
'@eslint-community/[email protected]([email protected]8.0([email protected]))':
'@eslint-community/[email protected]([email protected]9.0([email protected]))':
dependencies:
eslint: 9.28.0([email protected])
eslint: 9.29.0([email protected])
eslint-visitor-keys: 3.4.3
'@eslint-community/[email protected]': {}
@@ -3759,7 +3759,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@eslint/[email protected]8.0': {}
'@eslint/[email protected]9.0': {}
'@eslint/[email protected]': {}
@@ -5071,15 +5071,15 @@ snapshots:
dependencies:
'@types/node': 20.19.0
'@typescript-eslint/[email protected](@typescript-eslint/[email protected]([email protected]8.0([email protected]))([email protected]))([email protected]8.0([email protected]))([email protected])':
'@typescript-eslint/[email protected](@typescript-eslint/[email protected]([email protected]9.0([email protected]))([email protected]))([email protected]9.0([email protected]))([email protected])':
dependencies:
'@eslint-community/regexpp': 4.12.1
'@typescript-eslint/parser': 8.34.0([email protected]8.0([email protected]))([email protected])
'@typescript-eslint/parser': 8.34.0([email protected]9.0([email protected]))([email protected])
'@typescript-eslint/scope-manager': 8.34.0
'@typescript-eslint/type-utils': 8.34.0([email protected]8.0([email protected]))([email protected])
'@typescript-eslint/utils': 8.34.0([email protected]8.0([email protected]))([email protected])
'@typescript-eslint/type-utils': 8.34.0([email protected]9.0([email protected]))([email protected])
'@typescript-eslint/utils': 8.34.0([email protected]9.0([email protected]))([email protected])
'@typescript-eslint/visitor-keys': 8.34.0
eslint: 9.28.0([email protected])
eslint: 9.29.0([email protected])
graphemer: 1.4.0
ignore: 7.0.5
natural-compare: 1.4.0
@@ -5088,14 +5088,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/[email protected]([email protected]8.0([email protected]))([email protected])':
'@typescript-eslint/[email protected]([email protected]9.0([email protected]))([email protected])':
dependencies:
'@typescript-eslint/scope-manager': 8.34.0
'@typescript-eslint/types': 8.34.0
'@typescript-eslint/typescript-estree': 8.34.0([email protected])
'@typescript-eslint/visitor-keys': 8.34.0
debug: 4.4.1
eslint: 9.28.0([email protected])
eslint: 9.29.0([email protected])
typescript: 5.8.3
transitivePeerDependencies:
- supports-color
@@ -5118,12 +5118,12 @@ snapshots:
dependencies:
typescript: 5.8.3
'@typescript-eslint/[email protected]([email protected]8.0([email protected]))([email protected])':
'@typescript-eslint/[email protected]([email protected]9.0([email protected]))([email protected])':
dependencies:
'@typescript-eslint/typescript-estree': 8.34.0([email protected])
'@typescript-eslint/utils': 8.34.0([email protected]8.0([email protected]))([email protected])
'@typescript-eslint/utils': 8.34.0([email protected]9.0([email protected]))([email protected])
debug: 4.4.1
eslint: 9.28.0([email protected])
eslint: 9.29.0([email protected])
ts-api-utils: 2.1.0([email protected])
typescript: 5.8.3
transitivePeerDependencies:
@@ -5147,13 +5147,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/[email protected]([email protected]8.0([email protected]))([email protected])':
'@typescript-eslint/[email protected]([email protected]9.0([email protected]))([email protected])':
dependencies:
'@eslint-community/eslint-utils': 4.7.0([email protected]8.0([email protected]))
'@eslint-community/eslint-utils': 4.7.0([email protected]9.0([email protected]))
'@typescript-eslint/scope-manager': 8.34.0
'@typescript-eslint/types': 8.34.0
'@typescript-eslint/typescript-estree': 8.34.0([email protected])
eslint: 9.28.0([email protected])
eslint: 9.29.0([email protected])
typescript: 5.8.3
transitivePeerDependencies:
- supports-color
@@ -5734,19 +5734,19 @@ snapshots:
[email protected]: {}
[email protected]([email protected]8.0([email protected]))([email protected]):
[email protected]([email protected]9.0([email protected]))([email protected]):
dependencies:
'@next/eslint-plugin-next': 15.3.3
'@rushstack/eslint-patch': 1.11.0
'@typescript-eslint/eslint-plugin': 8.34.0(@typescript-eslint/[email protected]([email protected]8.0([email protected]))([email protected]))([email protected]8.0([email protected]))([email protected])
'@typescript-eslint/parser': 8.34.0([email protected]8.0([email protected]))([email protected])
eslint: 9.28.0([email protected])
'@typescript-eslint/eslint-plugin': 8.34.0(@typescript-eslint/[email protected]([email protected]9.0([email protected]))([email protected]))([email protected]9.0([email protected]))([email protected])
'@typescript-eslint/parser': 8.34.0([email protected]9.0([email protected]))([email protected])
eslint: 9.29.0([email protected])
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.10.1([email protected])([email protected]8.0([email protected]))
eslint-plugin-import: 2.31.0(@typescript-eslint/[email protected]([email protected]8.0([email protected]))([email protected]))([email protected])([email protected]8.0([email protected]))
eslint-plugin-jsx-a11y: 6.10.2([email protected]8.0([email protected]))
eslint-plugin-react: 7.37.5([email protected]8.0([email protected]))
eslint-plugin-react-hooks: 5.2.0([email protected]8.0([email protected]))
eslint-import-resolver-typescript: 3.10.1([email protected])([email protected]9.0([email protected]))
eslint-plugin-import: 2.31.0(@typescript-eslint/[email protected]([email protected]9.0([email protected]))([email protected]))([email protected])([email protected]9.0([email protected]))
eslint-plugin-jsx-a11y: 6.10.2([email protected]9.0([email protected]))
eslint-plugin-react: 7.37.5([email protected]9.0([email protected]))
eslint-plugin-react-hooks: 5.2.0([email protected]9.0([email protected]))
optionalDependencies:
typescript: 5.8.3
transitivePeerDependencies:
@@ -5754,9 +5754,9 @@ snapshots:
- eslint-plugin-import-x
- supports-color
[email protected]([email protected]8.0([email protected])):
[email protected]([email protected]9.0([email protected])):
dependencies:
eslint: 9.28.0([email protected])
eslint: 9.29.0([email protected])
[email protected]:
dependencies:
@@ -5766,33 +5766,33 @@ snapshots:
transitivePeerDependencies:
- supports-color
[email protected]([email protected])([email protected]8.0([email protected])):
[email protected]([email protected])([email protected]9.0([email protected])):
dependencies:
'@nolyfill/is-core-module': 1.0.39
debug: 4.4.1
eslint: 9.28.0([email protected])
eslint: 9.29.0([email protected])
get-tsconfig: 4.10.1
is-bun-module: 2.0.0
stable-hash: 0.0.5
tinyglobby: 0.2.14
unrs-resolver: 1.9.0
optionalDependencies:
eslint-plugin-import: 2.31.0(@typescript-eslint/[email protected]([email protected]8.0([email protected]))([email protected]))([email protected])([email protected]8.0([email protected]))
eslint-plugin-import: 2.31.0(@typescript-eslint/[email protected]([email protected]9.0([email protected]))([email protected]))([email protected])([email protected]9.0([email protected]))
transitivePeerDependencies:
- supports-color
[email protected](@typescript-eslint/[email protected]([email protected]8.0([email protected]))([email protected]))([email protected])([email protected])([email protected]8.0([email protected])):
[email protected](@typescript-eslint/[email protected]([email protected]9.0([email protected]))([email protected]))([email protected])([email protected])([email protected]9.0([email protected])):
dependencies:
debug: 3.2.7
optionalDependencies:
'@typescript-eslint/parser': 8.34.0([email protected]8.0([email protected]))([email protected])
eslint: 9.28.0([email protected])
'@typescript-eslint/parser': 8.34.0([email protected]9.0([email protected]))([email protected])
eslint: 9.29.0([email protected])
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.10.1([email protected])([email protected]8.0([email protected]))
eslint-import-resolver-typescript: 3.10.1([email protected])([email protected]9.0([email protected]))
transitivePeerDependencies:
- supports-color
[email protected](@typescript-eslint/[email protected]([email protected]8.0([email protected]))([email protected]))([email protected])([email protected]8.0([email protected])):
[email protected](@typescript-eslint/[email protected]([email protected]9.0([email protected]))([email protected]))([email protected])([email protected]9.0([email protected])):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.9
@@ -5801,9 +5801,9 @@ snapshots:
array.prototype.flatmap: 1.3.3
debug: 3.2.7
doctrine: 2.1.0
eslint: 9.28.0([email protected])
eslint: 9.29.0([email protected])
eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.12.0(@typescript-eslint/[email protected]([email protected]8.0([email protected]))([email protected]))([email protected])([email protected])([email protected]8.0([email protected]))
eslint-module-utils: 2.12.0(@typescript-eslint/[email protected]([email protected]9.0([email protected]))([email protected]))([email protected])([email protected])([email protected]9.0([email protected]))
hasown: 2.0.2
is-core-module: 2.16.1
is-glob: 4.0.3
@@ -5815,13 +5815,13 @@ snapshots:
string.prototype.trimend: 1.0.9
tsconfig-paths: 3.15.0
optionalDependencies:
'@typescript-eslint/parser': 8.34.0([email protected]8.0([email protected]))([email protected])
'@typescript-eslint/parser': 8.34.0([email protected]9.0([email protected]))([email protected])
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
- supports-color
[email protected]([email protected]8.0([email protected])):
[email protected]([email protected]9.0([email protected])):
dependencies:
aria-query: 5.3.2
array-includes: 3.1.9
@@ -5831,7 +5831,7 @@ snapshots:
axobject-query: 4.1.0
damerau-levenshtein: 1.0.8
emoji-regex: 9.2.2
eslint: 9.28.0([email protected])
eslint: 9.29.0([email protected])
hasown: 2.0.2
jsx-ast-utils: 3.3.5
language-tags: 1.0.9
@@ -5840,21 +5840,21 @@ snapshots:
safe-regex-test: 1.1.0
string.prototype.includes: 2.0.1
[email protected](@types/[email protected])([email protected]([email protected]8.0([email protected])))([email protected]8.0([email protected]))([email protected]):
[email protected](@types/[email protected])([email protected]([email protected]9.0([email protected])))([email protected]9.0([email protected]))([email protected]):
dependencies:
eslint: 9.28.0([email protected])
eslint: 9.29.0([email protected])
prettier: 3.5.3
prettier-linter-helpers: 1.0.0
synckit: 0.11.8
optionalDependencies:
'@types/eslint': 9.6.1
eslint-config-prettier: 10.1.5([email protected]8.0([email protected]))
eslint-config-prettier: 10.1.5([email protected]9.0([email protected]))
[email protected]([email protected]8.0([email protected])):
[email protected]([email protected]9.0([email protected])):
dependencies:
eslint: 9.28.0([email protected])
eslint: 9.29.0([email protected])
[email protected]([email protected]8.0([email protected])):
[email protected]([email protected]9.0([email protected])):
dependencies:
array-includes: 3.1.9
array.prototype.findlast: 1.2.5
@@ -5862,7 +5862,7 @@ snapshots:
array.prototype.tosorted: 1.1.4
doctrine: 2.1.0
es-iterator-helpers: 1.2.1
eslint: 9.28.0([email protected])
eslint: 9.29.0([email protected])
estraverse: 5.3.0
hasown: 2.0.2
jsx-ast-utils: 3.3.5
@@ -5890,15 +5890,15 @@ snapshots:
[email protected]: {}
[email protected]8.0([email protected]):
[email protected]9.0([email protected]):
dependencies:
'@eslint-community/eslint-utils': 4.7.0([email protected]8.0([email protected]))
'@eslint-community/eslint-utils': 4.7.0([email protected]9.0([email protected]))
'@eslint-community/regexpp': 4.12.1
'@eslint/config-array': 0.20.1
'@eslint/config-helpers': 0.2.3
'@eslint/core': 0.14.0
'@eslint/eslintrc': 3.3.1
'@eslint/js': 9.28.0
'@eslint/js': 9.29.0
'@eslint/plugin-kit': 0.3.2
'@humanfs/node': 0.16.6
'@humanwhocodes/module-importer': 1.0.1
@@ -7128,12 +7128,12 @@ snapshots:
possible-typed-array-names: 1.1.0
reflect.getprototypeof: 1.0.10
[email protected]([email protected]8.0([email protected]))([email protected]):
[email protected]([email protected]9.0([email protected]))([email protected]):
dependencies:
'@typescript-eslint/eslint-plugin': 8.34.0(@typescript-eslint/[email protected]([email protected]8.0([email protected]))([email protected]))([email protected]8.0([email protected]))([email protected])
'@typescript-eslint/parser': 8.34.0([email protected]8.0([email protected]))([email protected])
'@typescript-eslint/utils': 8.34.0([email protected]8.0([email protected]))([email protected])
eslint: 9.28.0([email protected])
'@typescript-eslint/eslint-plugin': 8.34.0(@typescript-eslint/[email protected]([email protected]9.0([email protected]))([email protected]))([email protected]9.0([email protected]))([email protected])
'@typescript-eslint/parser': 8.34.0([email protected]9.0([email protected]))([email protected])
'@typescript-eslint/utils': 8.34.0([email protected]9.0([email protected]))([email protected])
eslint: 9.29.0([email protected])
typescript: 5.8.3
transitivePeerDependencies:
- supports-color
+39 -27
View File
@@ -15,15 +15,14 @@ import { toast } from 'sonner';
import { HistoryDrawer } from '@/components/status';
import type { Profile } from '@/utils/supabase';
import type { RealtimeChannel } from '@supabase/supabase-js';
import { makeConditionalClassName } from '@/lib/utils';
type TechTableProps = {
initialStatuses: UserWithStatus[];
className?: string;
};
export const TechTable = ({
initialStatuses = [],
className = 'w-full max-w-7xl mx-auto px-4',
}: TechTableProps) => {
const { isAuthenticated } = useAuth();
const { tvMode } = useTVMode();
@@ -116,15 +115,8 @@ export const TechTable = ({
useEffect(() => {
if (!isAuthenticated) return;
//if (channelRef.current) {
//const supabase = createClient();
//supabase.removeChannel(channelRef.current).catch((error) => {
//console.error(`Error unsubscribing from status updates: ${error}`);
//});
//channelRef.current = null;
//}
const supabase = createClient();
const supabase = createClient();
const channel = supabase
.channel('status_updates', {
config: { broadcast: { self: true }}
@@ -197,34 +189,54 @@ export const TechTable = ({
);
}
const containerClassName = makeConditionalClassName({
context: tvMode,
defaultClassName: 'mx-auto',
on: 'lg:w-11/12 w-full mt-15',
off: 'w-5/6',
});
const thClassName = makeConditionalClassName({
context: tvMode,
defaultClassName: 'py-3 px-4 border font-semibold',
on: 'lg:text-6xl',
off: 'lg:text-5xl',
});
const tdClassName = makeConditionalClassName({
context: tvMode,
defaultClassName: 'py-3 px-4 border',
on: 'lg:text-5xl',
off: 'lg:text-4xl',
});
const tCheckboxClassName = `py-3 px-4 border`;
const checkBoxClassName = `lg:scale-200 cursor-pointer`;
return (
<div className={className}>
<table
className={`w-full text-center border-collapse \
${tvMode ? 'text-4xl lg:text-5xl' : 'text-base lg:text-lg'}`}
>
<div className={containerClassName}>
<table className='w-full text-center rounded-md'>
<thead>
<tr className='bg-muted'>
{!tvMode && (
<th className='py-3 px-3 border'>
<th className={tCheckboxClassName}>
<input
type='checkbox'
className='scale-125 cursor-pointer'
className={checkBoxClassName}
checked={selectAll}
onChange={handleSelectAllChange}
/>
</th>
)}
<th className='py-3 px-4 border font-semibold'>Name</th>
<th className='py-3 px-4 border font-semibold'>
<th className={thClassName}>Name</th>
<th className={thClassName}>
<Drawer>
<DrawerTrigger className='hover:underline'>
<DrawerTrigger
className='hover:text-foreground/60 cursor-pointer'
>
Status
</DrawerTrigger>
<HistoryDrawer />
</Drawer>
</th>
<th className='py-3 px-4 border font-semibold'>Updated At</th>
<th className={thClassName}>Updated At</th>
</tr>
</thead>
<tbody>
@@ -237,10 +249,10 @@ export const TechTable = ({
`}
>
{!tvMode && (
<td className='py-2 px-3 border'>
<td className={tCheckboxClassName}>
<input
type='checkbox'
className='scale-125 cursor-pointer'
className={checkBoxClassName}
checked={selectedIds.includes(userWithStatus.user.id)}
onChange={() =>
handleCheckboxChange(userWithStatus.user.id)
@@ -248,13 +260,13 @@ export const TechTable = ({
/>
</td>
)}
<td className='py-3 px-4 border font-medium'>
<td className={tdClassName}>
{userWithStatus.user.full_name ?? 'Unknown User'}
</td>
<td className='py-3 px-4 border'>
<td className={tdClassName}>
<Drawer>
<DrawerTrigger
className='text-left w-full p-2 rounded hover:bg-muted transition-colors'
className='text-center w-full p-2 rounded-md hover:bg-muted transition-colors'
onClick={() => setSelectedHistoryUser(userWithStatus.user)}
>
{userWithStatus.status}
@@ -264,7 +276,7 @@ export const TechTable = ({
)}
</Drawer>
</td>
<td className='py-3 px-4 border text-muted-foreground'>
<td className={tdClassName}>
{formatTime(userWithStatus.created_at)}
</td>
</tr>
+14
View File
@@ -4,3 +4,17 @@ import { twMerge } from 'tailwind-merge';
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
export const makeConditionalClassName = ({
context,
defaultClassName,
on = '',
off = '',
}: {
context: boolean;
defaultClassName: string;
on?: string;
off?: string;
}) => {
return defaultClassName + ' ' + (context ? on : off);
};