What I Talk About When I Talk About Composition

Mehdi Valikhani
Mehdi ValikhaniSenior Software Engineer at Autopilot HQ
A simple <button />
It’s a composable UI component
<button onClick={callMeOnClick}>Click Me!</button>
Composition, Good old days
<button class=”btn btn--tarmac btn--large”>
Click Me!
</button>
<Button />
An enhanced <button /> component
<Button text="Click Me!" color="tarmac" />
◉ Uses the <button /> under the hood
◉ Enhances the <button /> via “color” field
<Button /> with icon
<Button /> version 1.1
<Button color="yellow" icon="edit" text="Edit" />
◉ Uses the <Icon /> under the hood
◉ Configure the icon via “icon” field
<Button /> with colored icon
<Button /> version 1.2
<Button color="yellow" icon="edit"
iconColor="black" text="Edit" />
◉ Icon color via the “iconColor” field
That’s Exactly What
We Should Not Do
!
Why not to do?
◉ Lack of composition via consumer developer
◉ Lack of separation of concerns
◉ Code duplication
◉ Maintenance overhead
◉ Test overhead
What I Talk About
When I Talk About Composition
I am Mehdi
Software Engineer at Autopilot
@mehdivk
hi@mv.id.au
Hello!
“
Front-end development at Autopilot is the
process of building sophisticated user
interfaces consisting of thousands of
small, focused, testable and composable
components.
<Button />, revised
To compose <Icon />
<Button>
<Icon size="small" color="black" symbol="edit" />
Edit
</Button>
What composition actually offers?
◉ Maximum flexibility
◉ Minimum coupling
◉ Maintainable components
◉ Testable components
Showcase Time
<Modal />
<Modal />
<Modal size={modalSize} type={modalType}>
<ModalHeader></ModalHeader>
<ModalContent></ModalContent>
<ModalFooter></ModalFooter>
<ModalClose></ModalClose>
</Modal>
<Modal />
Overlays the other elements on page
<Modal />
<Position xAxis="center" yAxis="center">
<Overlay>
<Modal>
<ModalHeader />
<ModalContent />
<ModalFooter />
</Modal>
</Overlay>
</Position>
Overlays the other elements on page
<FolderExplorer />
<FolderExplorer />
<Position anchor="someElement">
<FolderExplorer />
</Position>
<ContextMenu />
<ContextMenu />
<Position anchor="someElement">
<DropDownMenu>
<DropDownMenuOption icon="edit" onClick={onEditClick}>Edit</DropDownMenuOption>
<DropDownMenuOption icon="trash" onClick={onTrash}>Trash</DropDownMenuOption>
<DropDownMenuOption icon="folder" disabled>Move to folder</DropDownMenuOption>
</DropDownMenu>
</Position>
<ContextMenu />
Forms
Forms
<Form labelOn="top" size="large" ref={this.setFormReference}>
<Element id="goalName">
<Label text="Goal name" />
<TextBox placeholder="Type what people become who complete the goal, e.g. customer" />
<Validator>
<Required />
</Validator>
</Element>
<Elements>
<Label text="Conversion target" />
<Element id="conversionTarget" className="goal-form__conversion-target">
<TextBox placeholder="10" />
<Validator>
<Required />
{ this.state.conversionType ? <ValidConversionTarget type={this.state.conversionType} /> : null }
</Validator>
</Element>
<Element id="conversionTargetType">
<ComboBox placeholder="Please select" options={conversionTargetTypes} onChange={this.onConversionTypeChange} />
<Validator>
<Required />
</Validator>
</Element>
</Elements>
</Form>
Forms
<Form labelOn="top" size="large" ref={this.setFormReference}>
<Element id="goalName">
<Label text="Goal name" />
<TextBox placeholder="Type what people become who complete the goal, e.g. customer" />
<Validator>
<Required />
</Validator>
</Element>
<Elements>
<Label text="Conversion target" />
<Element id="conversionTarget" className="goal-form__conversion-target">
<TextBox placeholder="10" />
<Validator>
<Required />
{ this.state.conversionType ? <ValidConversionTarget type={this.state.conversionType} /> : null }
</Validator>
</Element>
<Element id="conversionTargetType">
<ComboBox placeholder="Please select" options={conversionTargetTypes} onChange={this.onConversionTypeChange} />
<Validator>
<Required />
</Validator>
</Element>
</Elements>
</Form>
Forms
<Form labelOn="top" size="large" ref={this.setFormReference}>
<Element id="goalName">
<Label text="Goal name" />
<TextBox placeholder="Type what people become who complete the goal, e.g. customer" />
<Validator>
<Required />
</Validator>
</Element>
<Elements>
<Label text="Conversion target" />
<Element id="conversionTarget" className="goal-form__conversion-target">
<TextBox placeholder="10" />
<Validator>
<Required />
{ this.state.conversionType ? <ValidConversionTarget type={this.state.conversionType} /> : null }
</Validator>
</Element>
<Element id="conversionTargetType">
<ComboBox placeholder="Please select" options={conversionTargetTypes} onChange={this.onConversionTypeChange} />
<Validator>
<Required />
</Validator>
</Element>
</Elements>
</Form>
Forms
<Form labelOn="top" size="large" ref={this.setFormReference}>
<Element id="goalName">
<Label text="Goal name" />
<TextBox placeholder="Type what people become who complete the goal, e.g. customer" />
<Validator>
<Required />
</Validator>
</Element>
<Elements>
<Label text="Conversion target" />
<Element id="conversionTarget" className="goal-form__conversion-target">
<TextBox placeholder="10" />
<Validator>
<Required />
{ this.state.conversionType ? <ValidConversionTarget type={this.state.conversionType} /> : null }
</Validator>
</Element>
<Element id="conversionTargetType">
<ComboBox placeholder="Please select" options={conversionTargetTypes} onChange={this.onConversionTypeChange} />
<Validator>
<Required />
</Validator>
</Element>
</Elements>
</Form>
Forms
<Form labelOn="top" size="large" ref={this.setFormReference}>
<Element id="goalName">
<Label text="Goal name" />
<TextBox placeholder="Type what people become who complete the goal, e.g. customer" />
<Validator>
<Required />
</Validator>
</Element>
<Elements>
<Label text="Conversion target" />
<Element id="conversionTarget" className="goal-form__conversion-target">
<TextBox placeholder="10" />
<Validator>
<Required />
{ this.state.conversionType ? <ValidConversionTarget type={this.state.conversionType} /> : null }
</Validator>
</Element>
<Element id="conversionTargetType">
<ComboBox placeholder="Please select" options={conversionTargetTypes} onChange={this.onConversionTypeChange} />
<Validator>
<Required />
</Validator>
</Element>
</Elements>
</Form>
Forms
this.goalForm.validate();
this.goalForm.isValid();
this.goalForm.value();
this.goalForm.value('conversionTarget');
Forms
<Table />
<Table />
<Table dataSource={this.props.assets} className="asset-manager__table">
<TableCell header="Status">
<TableRowStatus field="status" valueToColorMap={valueToColorMap} />
</TableCell>
<TableCell header="Name">
<TableCellValue field="name" />
</TableCell>
<TableCell header="In Journeys">
<TableCellValue field="inJourneys" />
</TableCell>
<TableCell header="Type">
<TableCellValue format="camel-case" field="type" />
</TableCell>
<TableCell header="Created By">
<TableCellValue field="createdBy" />
</TableCell>
<TableCell header="Edited">
<TableCellValue format="date" field="edited" />
</TableCell>
<TableCell header="Published">
<TableCellValue format="date" field="published" />
</TableCell>
</Table>
Any questions ?
You can find me at
◉ @mehdivk
◉ hi@mv.id.au
Thanks!
1 of 33

Recommended

04. session 04 working withformsandframes by
04. session 04   working withformsandframes04. session 04   working withformsandframes
04. session 04 working withformsandframesPhúc Đỗ
781 views24 slides
Magento 2 Customer Avatar by
Magento 2 Customer AvatarMagento 2 Customer Avatar
Magento 2 Customer AvatarTheMagicians
45 views4 slides
Cmsc 100 (web forms) by
Cmsc 100 (web forms)Cmsc 100 (web forms)
Cmsc 100 (web forms)MaeEstherMaguadMaralit
1.8K views46 slides
Html 5 Forms by
Html 5 FormsHtml 5 Forms
Html 5 FormsJim Gerland
878 views14 slides
Web Design Course - Lecture 6 - HTML form and form validation by
Web Design Course - Lecture 6 - HTML form and form validationWeb Design Course - Lecture 6 - HTML form and form validation
Web Design Course - Lecture 6 - HTML form and form validationAl-Mamun Sarkar
171 views9 slides
TechSupportCh 21 project.doc1Projects.doc Project 21-.docx by
TechSupportCh 21 project.doc1Projects.doc Project 21-.docxTechSupportCh 21 project.doc1Projects.doc Project 21-.docx
TechSupportCh 21 project.doc1Projects.doc Project 21-.docxmattinsonjanel
2 views161 slides

More Related Content

Similar to What I Talk About When I Talk About Composition

WPF - An introduction by
WPF - An introductionWPF - An introduction
WPF - An introductionSharada Gururaj
3.5K views40 slides
Unit2 by
Unit2Unit2
Unit2Abha Damani
1.4K views32 slides
jQuery Mobile Introduction ( demo on EZoapp ) by
jQuery Mobile Introduction ( demo on EZoapp )jQuery Mobile Introduction ( demo on EZoapp )
jQuery Mobile Introduction ( demo on EZoapp )EZoApp
2.6K views48 slides
HTML 5 Simple Tutorial Part 4 by
HTML 5 Simple Tutorial Part 4HTML 5 Simple Tutorial Part 4
HTML 5 Simple Tutorial Part 4Sanjeev Kumar
128 views19 slides
A comprehensive guide on developing responsive and common react filter component by
A comprehensive guide on developing responsive and common react filter componentA comprehensive guide on developing responsive and common react filter component
A comprehensive guide on developing responsive and common react filter componentKaty Slemon
57 views34 slides
Chapter 2 class power point by
Chapter 2 class power pointChapter 2 class power point
Chapter 2 class power pointcmurphysvhs
484 views30 slides

Similar to What I Talk About When I Talk About Composition(20)

jQuery Mobile Introduction ( demo on EZoapp ) by EZoApp
jQuery Mobile Introduction ( demo on EZoapp )jQuery Mobile Introduction ( demo on EZoapp )
jQuery Mobile Introduction ( demo on EZoapp )
EZoApp2.6K views
HTML 5 Simple Tutorial Part 4 by Sanjeev Kumar
HTML 5 Simple Tutorial Part 4HTML 5 Simple Tutorial Part 4
HTML 5 Simple Tutorial Part 4
Sanjeev Kumar128 views
A comprehensive guide on developing responsive and common react filter component by Katy Slemon
A comprehensive guide on developing responsive and common react filter componentA comprehensive guide on developing responsive and common react filter component
A comprehensive guide on developing responsive and common react filter component
Katy Slemon57 views
Chapter 2 class power point by cmurphysvhs
Chapter 2 class power pointChapter 2 class power point
Chapter 2 class power point
cmurphysvhs484 views
05.Blend Expression, Transformation & Animation by Nguyen Tuan
05.Blend Expression, Transformation & Animation05.Blend Expression, Transformation & Animation
05.Blend Expression, Transformation & Animation
Nguyen Tuan491 views
How to Create A Magento Adminhtml Controller in Magento Extension by Hendy Irawan
How to Create A Magento Adminhtml Controller in Magento ExtensionHow to Create A Magento Adminhtml Controller in Magento Extension
How to Create A Magento Adminhtml Controller in Magento Extension
Hendy Irawan25.1K views
Web topic 20 1 html forms by CK Yang
Web topic 20 1  html formsWeb topic 20 1  html forms
Web topic 20 1 html forms
CK Yang1.5K views
Web topic 20 2 html forms by CK Yang
Web topic 20 2  html formsWeb topic 20 2  html forms
Web topic 20 2 html forms
CK Yang884 views
Web components with Angular by Ana Cidre
Web components with AngularWeb components with Angular
Web components with Angular
Ana Cidre1K views
Un-Framework - Delivering Dynamic Experiences with HTML over the Wire by Andreas Nedbal
Un-Framework - Delivering Dynamic Experiences with HTML over the WireUn-Framework - Delivering Dynamic Experiences with HTML over the Wire
Un-Framework - Delivering Dynamic Experiences with HTML over the Wire
Andreas Nedbal94 views
Std 12 Computer Chapter 1 Creating Html Forms Using KompoZer by Nuzhat Memon
Std 12 Computer Chapter 1 Creating Html Forms Using KompoZerStd 12 Computer Chapter 1 Creating Html Forms Using KompoZer
Std 12 Computer Chapter 1 Creating Html Forms Using KompoZer
Nuzhat Memon1.3K views
Scope proposal-ecommerce-website by maxtra
Scope proposal-ecommerce-websiteScope proposal-ecommerce-website
Scope proposal-ecommerce-website
maxtra53.5K views
4.7.14&amp;17.7.14&amp;23.6.15&amp;10.9.15 by Rajes Wari
4.7.14&amp;17.7.14&amp;23.6.15&amp;10.9.154.7.14&amp;17.7.14&amp;23.6.15&amp;10.9.15
4.7.14&amp;17.7.14&amp;23.6.15&amp;10.9.15
Rajes Wari27 views

Recently uploaded

Proposal Presentation.pptx by
Proposal Presentation.pptxProposal Presentation.pptx
Proposal Presentation.pptxkeytonallamon
67 views36 slides
DESIGN OF SPRINGS-UNIT4.pptx by
DESIGN OF SPRINGS-UNIT4.pptxDESIGN OF SPRINGS-UNIT4.pptx
DESIGN OF SPRINGS-UNIT4.pptxgopinathcreddy
21 views47 slides
Robotics in construction enterprise by
Robotics in construction enterpriseRobotics in construction enterprise
Robotics in construction enterpriseKhalid Abdel Naser Abdel Rahim
5 views1 slide
MongoDB.pdf by
MongoDB.pdfMongoDB.pdf
MongoDB.pdfArthyR3
49 views6 slides
_MAKRIADI-FOTEINI_diploma thesis.pptx by
_MAKRIADI-FOTEINI_diploma thesis.pptx_MAKRIADI-FOTEINI_diploma thesis.pptx
_MAKRIADI-FOTEINI_diploma thesis.pptxfotinimakriadi
12 views32 slides
Global airborne satcom market report by
Global airborne satcom market reportGlobal airborne satcom market report
Global airborne satcom market reportdefencereport78
6 views13 slides

Recently uploaded(20)

MongoDB.pdf by ArthyR3
MongoDB.pdfMongoDB.pdf
MongoDB.pdf
ArthyR349 views
_MAKRIADI-FOTEINI_diploma thesis.pptx by fotinimakriadi
_MAKRIADI-FOTEINI_diploma thesis.pptx_MAKRIADI-FOTEINI_diploma thesis.pptx
_MAKRIADI-FOTEINI_diploma thesis.pptx
fotinimakriadi12 views
Design_Discover_Develop_Campaign.pptx by ShivanshSeth6
Design_Discover_Develop_Campaign.pptxDesign_Discover_Develop_Campaign.pptx
Design_Discover_Develop_Campaign.pptx
ShivanshSeth649 views
SUMIT SQL PROJECT SUPERSTORE 1.pptx by Sumit Jadhav
SUMIT SQL PROJECT SUPERSTORE 1.pptxSUMIT SQL PROJECT SUPERSTORE 1.pptx
SUMIT SQL PROJECT SUPERSTORE 1.pptx
Sumit Jadhav 22 views
ASSIGNMENTS ON FUZZY LOGIC IN TRAFFIC FLOW.pdf by AlhamduKure
ASSIGNMENTS ON FUZZY LOGIC IN TRAFFIC FLOW.pdfASSIGNMENTS ON FUZZY LOGIC IN TRAFFIC FLOW.pdf
ASSIGNMENTS ON FUZZY LOGIC IN TRAFFIC FLOW.pdf
AlhamduKure8 views
Créativité dans le design mécanique à l’aide de l’optimisation topologique by LIEGE CREATIVE
Créativité dans le design mécanique à l’aide de l’optimisation topologiqueCréativité dans le design mécanique à l’aide de l’optimisation topologique
Créativité dans le design mécanique à l’aide de l’optimisation topologique
LIEGE CREATIVE8 views
GDSC Mikroskil Members Onboarding 2023.pdf by gdscmikroskil
GDSC Mikroskil Members Onboarding 2023.pdfGDSC Mikroskil Members Onboarding 2023.pdf
GDSC Mikroskil Members Onboarding 2023.pdf
gdscmikroskil63 views
Design of machine elements-UNIT 3.pptx by gopinathcreddy
Design of machine elements-UNIT 3.pptxDesign of machine elements-UNIT 3.pptx
Design of machine elements-UNIT 3.pptx
gopinathcreddy37 views
Design of Structures and Foundations for Vibrating Machines, Arya-ONeill-Pinc... by csegroupvn
Design of Structures and Foundations for Vibrating Machines, Arya-ONeill-Pinc...Design of Structures and Foundations for Vibrating Machines, Arya-ONeill-Pinc...
Design of Structures and Foundations for Vibrating Machines, Arya-ONeill-Pinc...
csegroupvn8 views
Web Dev Session 1.pptx by VedVekhande
Web Dev Session 1.pptxWeb Dev Session 1.pptx
Web Dev Session 1.pptx
VedVekhande17 views
2023Dec ASU Wang NETR Group Research Focus and Facility Overview.pptx by lwang78
2023Dec ASU Wang NETR Group Research Focus and Facility Overview.pptx2023Dec ASU Wang NETR Group Research Focus and Facility Overview.pptx
2023Dec ASU Wang NETR Group Research Focus and Facility Overview.pptx
lwang78180 views
REACTJS.pdf by ArthyR3
REACTJS.pdfREACTJS.pdf
REACTJS.pdf
ArthyR337 views

What I Talk About When I Talk About Composition

  • 1. A simple <button /> It’s a composable UI component <button onClick={callMeOnClick}>Click Me!</button>
  • 2. Composition, Good old days <button class=”btn btn--tarmac btn--large”> Click Me! </button>
  • 3. <Button /> An enhanced <button /> component <Button text="Click Me!" color="tarmac" /> ◉ Uses the <button /> under the hood ◉ Enhances the <button /> via “color” field
  • 4. <Button /> with icon <Button /> version 1.1 <Button color="yellow" icon="edit" text="Edit" /> ◉ Uses the <Icon /> under the hood ◉ Configure the icon via “icon” field
  • 5. <Button /> with colored icon <Button /> version 1.2 <Button color="yellow" icon="edit" iconColor="black" text="Edit" /> ◉ Icon color via the “iconColor” field
  • 6. That’s Exactly What We Should Not Do !
  • 7. Why not to do? ◉ Lack of composition via consumer developer ◉ Lack of separation of concerns ◉ Code duplication ◉ Maintenance overhead ◉ Test overhead
  • 8. What I Talk About When I Talk About Composition
  • 9. I am Mehdi Software Engineer at Autopilot @mehdivk hi@mv.id.au Hello!
  • 10. “ Front-end development at Autopilot is the process of building sophisticated user interfaces consisting of thousands of small, focused, testable and composable components.
  • 11. <Button />, revised To compose <Icon /> <Button> <Icon size="small" color="black" symbol="edit" /> Edit </Button>
  • 12. What composition actually offers? ◉ Maximum flexibility ◉ Minimum coupling ◉ Maintainable components ◉ Testable components
  • 15. <Modal /> <Modal size={modalSize} type={modalType}> <ModalHeader></ModalHeader> <ModalContent></ModalContent> <ModalFooter></ModalFooter> <ModalClose></ModalClose> </Modal>
  • 16. <Modal /> Overlays the other elements on page
  • 17. <Modal /> <Position xAxis="center" yAxis="center"> <Overlay> <Modal> <ModalHeader /> <ModalContent /> <ModalFooter /> </Modal> </Overlay> </Position> Overlays the other elements on page
  • 21. <ContextMenu /> <Position anchor="someElement"> <DropDownMenu> <DropDownMenuOption icon="edit" onClick={onEditClick}>Edit</DropDownMenuOption> <DropDownMenuOption icon="trash" onClick={onTrash}>Trash</DropDownMenuOption> <DropDownMenuOption icon="folder" disabled>Move to folder</DropDownMenuOption> </DropDownMenu> </Position>
  • 23. Forms
  • 24. Forms <Form labelOn="top" size="large" ref={this.setFormReference}> <Element id="goalName"> <Label text="Goal name" /> <TextBox placeholder="Type what people become who complete the goal, e.g. customer" /> <Validator> <Required /> </Validator> </Element> <Elements> <Label text="Conversion target" /> <Element id="conversionTarget" className="goal-form__conversion-target"> <TextBox placeholder="10" /> <Validator> <Required /> { this.state.conversionType ? <ValidConversionTarget type={this.state.conversionType} /> : null } </Validator> </Element> <Element id="conversionTargetType"> <ComboBox placeholder="Please select" options={conversionTargetTypes} onChange={this.onConversionTypeChange} /> <Validator> <Required /> </Validator> </Element> </Elements> </Form>
  • 25. Forms <Form labelOn="top" size="large" ref={this.setFormReference}> <Element id="goalName"> <Label text="Goal name" /> <TextBox placeholder="Type what people become who complete the goal, e.g. customer" /> <Validator> <Required /> </Validator> </Element> <Elements> <Label text="Conversion target" /> <Element id="conversionTarget" className="goal-form__conversion-target"> <TextBox placeholder="10" /> <Validator> <Required /> { this.state.conversionType ? <ValidConversionTarget type={this.state.conversionType} /> : null } </Validator> </Element> <Element id="conversionTargetType"> <ComboBox placeholder="Please select" options={conversionTargetTypes} onChange={this.onConversionTypeChange} /> <Validator> <Required /> </Validator> </Element> </Elements> </Form>
  • 26. Forms <Form labelOn="top" size="large" ref={this.setFormReference}> <Element id="goalName"> <Label text="Goal name" /> <TextBox placeholder="Type what people become who complete the goal, e.g. customer" /> <Validator> <Required /> </Validator> </Element> <Elements> <Label text="Conversion target" /> <Element id="conversionTarget" className="goal-form__conversion-target"> <TextBox placeholder="10" /> <Validator> <Required /> { this.state.conversionType ? <ValidConversionTarget type={this.state.conversionType} /> : null } </Validator> </Element> <Element id="conversionTargetType"> <ComboBox placeholder="Please select" options={conversionTargetTypes} onChange={this.onConversionTypeChange} /> <Validator> <Required /> </Validator> </Element> </Elements> </Form>
  • 27. Forms <Form labelOn="top" size="large" ref={this.setFormReference}> <Element id="goalName"> <Label text="Goal name" /> <TextBox placeholder="Type what people become who complete the goal, e.g. customer" /> <Validator> <Required /> </Validator> </Element> <Elements> <Label text="Conversion target" /> <Element id="conversionTarget" className="goal-form__conversion-target"> <TextBox placeholder="10" /> <Validator> <Required /> { this.state.conversionType ? <ValidConversionTarget type={this.state.conversionType} /> : null } </Validator> </Element> <Element id="conversionTargetType"> <ComboBox placeholder="Please select" options={conversionTargetTypes} onChange={this.onConversionTypeChange} /> <Validator> <Required /> </Validator> </Element> </Elements> </Form>
  • 28. Forms <Form labelOn="top" size="large" ref={this.setFormReference}> <Element id="goalName"> <Label text="Goal name" /> <TextBox placeholder="Type what people become who complete the goal, e.g. customer" /> <Validator> <Required /> </Validator> </Element> <Elements> <Label text="Conversion target" /> <Element id="conversionTarget" className="goal-form__conversion-target"> <TextBox placeholder="10" /> <Validator> <Required /> { this.state.conversionType ? <ValidConversionTarget type={this.state.conversionType} /> : null } </Validator> </Element> <Element id="conversionTargetType"> <ComboBox placeholder="Please select" options={conversionTargetTypes} onChange={this.onConversionTypeChange} /> <Validator> <Required /> </Validator> </Element> </Elements> </Form>
  • 30. Forms
  • 32. <Table /> <Table dataSource={this.props.assets} className="asset-manager__table"> <TableCell header="Status"> <TableRowStatus field="status" valueToColorMap={valueToColorMap} /> </TableCell> <TableCell header="Name"> <TableCellValue field="name" /> </TableCell> <TableCell header="In Journeys"> <TableCellValue field="inJourneys" /> </TableCell> <TableCell header="Type"> <TableCellValue format="camel-case" field="type" /> </TableCell> <TableCell header="Created By"> <TableCellValue field="createdBy" /> </TableCell> <TableCell header="Edited"> <TableCellValue format="date" field="edited" /> </TableCell> <TableCell header="Published"> <TableCellValue format="date" field="published" /> </TableCell> </Table>
  • 33. Any questions ? You can find me at ◉ @mehdivk ◉ hi@mv.id.au Thanks!