1
0
Fork 0
mirror of https://codeberg.org/MarkusThielker/next-ory.git synced 2025-04-19 00:51:18 +00:00

NORY-15: add identity search

This commit is contained in:
Markus Thielker 2024-12-05 18:28:15 +01:00
parent 0ac5c67dfe
commit 59ed13b2cc
No known key found for this signature in database
2 changed files with 61 additions and 6 deletions

View file

@ -2,12 +2,25 @@ import React, { Suspense } from 'react';
import { DataTableFallback } from '@/components/ui/data-table-fallback'; import { DataTableFallback } from '@/components/ui/data-table-fallback';
import { IdentityDataTable } from '@/app/user/data-table'; import { IdentityDataTable } from '@/app/user/data-table';
import { getIdentityApi } from '@/ory/sdk/server'; import { getIdentityApi } from '@/ory/sdk/server';
import { SearchInput } from '@/components/search-input';
export default async function UserPage() { export default async function UserPage(
{
searchParams,
}: {
searchParams: Promise<{ [key: string]: string | string[] | undefined }>
},
) {
const identityApi = await getIdentityApi(); const identityApi = await getIdentityApi();
const { data } = await identityApi.listIdentities(); const params = await searchParams;
const query = params.query ? params.query as string : '';
const data = await identityApi.listIdentities({
pageSize: 100,
previewCredentialsIdentifierSimilar: query,
}).then(response => response.data);
return ( return (
<div className="flex flex-col space-y-4"> <div className="flex flex-col space-y-4">
@ -16,10 +29,12 @@ export default async function UserPage() {
<p className="text-lg font-light">See and manage all identities registered with your Ory Kratos <p className="text-lg font-light">See and manage all identities registered with your Ory Kratos
instance</p> instance</p>
</div> </div>
<div className="flex flex-col space-y-2">
<SearchInput queryParamKey="query" placeholder="Search"/>
<Suspense fallback={<DataTableFallback columnCount={5} rowCount={20}/>}> <Suspense fallback={<DataTableFallback columnCount={5} rowCount={20}/>}>
<IdentityDataTable data={data}/> <IdentityDataTable data={data}/>
</Suspense> </Suspense>
</div> </div>
</div>
); );
} }

View file

@ -0,0 +1,40 @@
'use client';
import { Input } from '@/components/ui/input';
import { useRouter, useSearchParams } from 'next/navigation';
import { ChangeEvent, HTMLInputTypeAttribute } from 'react';
interface SearchInputProps {
placeholder: string;
queryParamKey: string;
type?: HTMLInputTypeAttribute;
className?: string;
}
export function SearchInput({ placeholder, queryParamKey, type, className }: SearchInputProps) {
const router = useRouter();
const params = useSearchParams();
const onSearchChange = (event: ChangeEvent<HTMLInputElement>) => {
const value = event.target.value;
const newParams = new URLSearchParams(params.toString());
if (value.length < 1) {
newParams.delete(queryParamKey);
} else {
newParams.set(queryParamKey, value);
}
router.replace('?' + newParams.toString());
};
return (
<Input
type={type ?? 'text'}
placeholder={placeholder}
className={className}
onChange={onSearchChange}/>
);
}