mirror of
https://github.com/velocitatem/PHANTOM.git
synced 2026-07-16 01:53:37 +00:00
* chore: cleaning gitignore * formating and env documentation * feat: context switching of hotel/airline depndent on env var via middleware * fixed alignment and building * wrong file * prods * fixed applying style * better session cookie management * tentative session storage with maybe using airtable * migrated api of ingestion * events and products apge * fixing build * 13 create outline for research paper draft (#18) * updated outline for paper from issue * extra paper sections and some formalization of series data * algorithms and acknowledgements * updated outline for paper from issue * upadted text formating * event unification * refactor tracking to ues callbacks instead of refs * implement a pricing display api with session passing * moved middleware to proxy according to new changes in Nextjs * refactoed kafka ingestion to go via backend not web-db * Refactor docker-compose services to use individual Dockerfiles (#20) * Initial plan * Refactor services into individual Dockerfiles Co-authored-by: velocitatem <60182044+velocitatem@users.noreply.github.com> * Add EXPOSE directives to all Dockerfiles with port documentation Co-authored-by: velocitatem <60182044+velocitatem@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: velocitatem <60182044+velocitatem@users.noreply.github.com> * fixing small bugs and adding exepriments to tracking * added some doc
34 lines
817 B
TypeScript
34 lines
817 B
TypeScript
'use client';
|
|
|
|
interface RadioOpt<T extends string> {
|
|
value: T;
|
|
label: string;
|
|
}
|
|
|
|
interface RadioGrpProps<T extends string> {
|
|
name: string;
|
|
options: RadioOpt<T>[];
|
|
value: T;
|
|
onChange: (val: T) => void;
|
|
}
|
|
|
|
export default function RadioGroup<T extends string>({ name, options, value, onChange }: RadioGrpProps<T>) {
|
|
return (
|
|
<div className="flex gap-4">
|
|
{options.map((opt) => (
|
|
<label key={opt.value} className="flex items-center cursor-pointer">
|
|
<input
|
|
type="radio"
|
|
name={name}
|
|
value={opt.value}
|
|
checked={value === opt.value}
|
|
onChange={(e) => onChange(e.target.value as T)}
|
|
className="mr-2"
|
|
/>
|
|
<span className="text-sm">{opt.label}</span>
|
|
</label>
|
|
))}
|
|
</div>
|
|
);
|
|
}
|