package Ġnl . law ik . p oc . multi platform . react . input Ċ Ċ import Ġio . kon form . validation . Validation Result Ċ import Ġkotlinx . html . InputType Ċ import Ġorg . w 3 c . dom . HTML InputElement Ċ import Ġreact .* Ċ import Ġkotlin . reflect . K Property Ċ Ċ interface ĠInt Input Props Ġ: ĠR Props Ġ{ ĊĠĠĠ Ġvar Ġlabel : ĠString ? ĊĠĠĠ Ġvar Ġvalue : ĠInt ĊĠĠĠ Ġvar Ġsubmitted : ĠBoolean ĊĠĠĠ Ġvar ĠonChange : Ġ( Int ) Ġ-> ĠUnit ĊĠĠĠ Ġvar Ġfield : ĠK Property < *> ĊĠĠĠ Ġvar Ġvalidator : Ġ() Ġ-> ĠValidation Result < *> Ċ } Ċ Ċ interface ĠInt Input State Ġ: ĠR State Ġ{ ĊĠĠĠ Ġvar Ġref : ĠR Readable Ref < HTML InputElement > ĊĠĠĠ Ġvar Ġstart : ĠInt ĊĠĠĠ Ġvar Ġend : ĠInt Ċ } Ċ Ċ class ĠInt Input Ġ: ĠR Component < Int Input Props , ĠInt Input State >() Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠR Builder . render () Ġ{ ĊĠĠĠĠĠĠĠ Ġinput Wrapper ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . tel , Ġ// Ġtel Ġbecause Ġnumber Ġdoesn 't Ġsupport Ġselection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( props . value Ġ!= Ġundefined ) Ġprops . value . toString () Ġelse Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprops . submitted , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprops . field , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprops . validator , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprops . label ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġevent , Ġref Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġ( event . target Ġas ĠHTML InputElement ). value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprops . onChange ( undefined . as Dynamic ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( value Ġ== Ġ"- ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprops . onChange ("- ". as Dynamic ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġint Ġ= Ġvalue . toInt OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( int Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprops . onChange ( int ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetState Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġref . current !!. selection Start !! Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġref . current !!. selection End !! Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . ref Ġ= Ġref ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠcomponentDid Update ( prev Props : ĠInt Input Props , Ġprev State : ĠInt Input State , Ġsnapshot : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( props . value Ġ!= Ġundefined Ġ&& Ġprops . value Ġ== Ġprev Props . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . ref . current !!. setSelection Range ( state . start , Ġstate . end ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ fun ĠR Builder . int Input ( ĊĠĠĠ Ġvalue : ĠInt , ĊĠĠĠ Ġfield : ĠK Property <* >, ĊĠĠĠ Ġsubmitted : ĠBoolean , ĊĠĠĠ Ġvalidator : Ġ() Ġ-> ĠValidation Result <* >, ĊĠĠĠ Ġlabel : ĠString ? Ġ= Ġnull , ĊĠĠĠ ĠonChange : Ġ( Int ) Ġ-> ĠUnit Ċ ) Ġ= Ġchild ( Int Input :: class ) Ġ{ ĊĠĠĠ Ġattrs . label Ġ= Ġlabel ĊĠĠĠ Ġattrs . value Ġ= Ġvalue ĊĠĠĠ Ġattrs . submitted Ġ= Ġsubmitted ĊĠĠĠ Ġattrs . onChange Ġ= ĠonChange ĊĠĠĠ Ġattrs . field Ġ= Ġfield ĊĠĠĠ Ġattrs . validator Ġ= Ġvalidator Ċ }