Skip to content

Commit 3745996

Browse files
committed
feat(Figma): Added FigmaSource, FigmaReporitory, mappers, data models and entities
1 parent 502f848 commit 3745996

File tree

114 files changed

+5425
-169
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

114 files changed

+5425
-169
lines changed

lib/app/bloc/app_models.freezed.dart

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//ignore: one_member_abstracts
2+
abstract class Mapper<T, E> {
3+
E map(T from);
4+
}
5+
6+
abstract class MapperIterable<T, E> extends Mapper<T, E> {
7+
Iterable<E> mapIterable(Iterable<T> from) {
8+
return from.map(map);
9+
}
10+
}

lib/core/di/repository.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import 'package:get_it/get_it.dart';
2+
import 'package:onix_flutter_bricks/data/repository/figma_repository_impl.dart';
3+
import 'package:onix_flutter_bricks/data/source/remote/figma/figma_remote_data_source.dart';
24
import 'package:onix_flutter_bricks/domain/repository/data_component_repository.dart';
35
import 'package:onix_flutter_bricks/data/repository/data_component_repository_impl.dart';
6+
import 'package:onix_flutter_bricks/domain/repository/figma_repository.dart';
47
import 'package:onix_flutter_bricks/domain/repository/screen_repository.dart';
58
import 'package:onix_flutter_bricks/data/repository/screen_repository_impl.dart';
69
import 'package:onix_flutter_bricks/domain/repository/source_repository.dart';
@@ -18,6 +21,11 @@ void registerRepositories(GetIt getIt) {
1821
)
1922
..registerSingleton<SourceRepository>(
2023
SourceRepositoryImpl(),
24+
)
25+
..registerLazySingleton<FigmaRepository>(
26+
() => FigmaRepositoryImpl(
27+
figmaRemoteDataSource: GetIt.I.get<FigmaRemoteDataSource>(),
28+
),
2129
); //{repositories end}
2230
}
2331

lib/core/di/services.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:get_it/get_it.dart';
2+
import 'package:onix_flutter_bricks/domain/repository/figma_repository.dart';
23
import 'package:onix_flutter_bricks/domain/service/figma_service/figma_service.dart';
34
import 'package:onix_flutter_bricks/domain/service/file_generator_service/file_generator_service.dart';
45
import 'package:onix_flutter_bricks/domain/service/output_service/output_service.dart';
@@ -7,7 +8,11 @@ void registerServices(GetIt getIt) {
78
getIt
89
..registerSingleton<OutputService>(OutputService())
910
..registerSingleton<FileGeneratorService>(FileGeneratorService())
10-
..registerSingleton<FigmaService>(FigmaService());
11+
..registerLazySingleton<FigmaService>(
12+
() => FigmaService(
13+
figmaRepository: GetIt.I.get<FigmaRepository>(),
14+
),
15+
);
1116
}
1217

1318
OutputService get outputService => GetIt.I.get<OutputService>();

lib/core/di/source.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,18 @@ import 'package:get_it/get_it.dart';
22

33
import 'package:onix_flutter_bricks/data/source/local/config_source/config_source.dart';
44
import 'package:onix_flutter_bricks/data/source/local/config_source/config_source_impl.dart';
5+
import 'package:onix_flutter_bricks/data/source/remote/figma/figma_remote_data_source.dart';
6+
import 'package:onix_flutter_bricks/data/source/remote/figma/figma_remote_source_impl.dart';
57

68
//{imports end}
79

810
void registerSources(GetIt getIt) {
9-
getIt.registerSingleton<ConfigSource>(ConfigSourceImpl()); //{sources end}
11+
getIt
12+
..registerSingleton<ConfigSource>(ConfigSourceImpl())
13+
..registerLazySingleton<FigmaRemoteDataSource>(
14+
() => const FigmaRemoteDataSourceImpl(),
15+
);
16+
//{sources end}
1017
}
1118

1219
ConfigSource get configSource => GetIt.I.get<ConfigSource>();
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import 'package:json_annotation/json_annotation.dart';
2+
import 'package:onix_flutter_bricks/data/model/figma/nodes/connector/connector_node_data_model.dart';
3+
import 'package:onix_flutter_bricks/data/model/figma/nodes/document/document_node_data_model.dart';
4+
import 'package:onix_flutter_bricks/data/model/figma/nodes/frame/frame_node_data_model.dart';
5+
import 'package:onix_flutter_bricks/data/model/figma/nodes/node/node_data_model.dart';
6+
import 'package:onix_flutter_bricks/data/model/figma/nodes/section/section_node_data_model.dart';
7+
import 'package:onix_flutter_bricks/data/model/figma/nodes/shape_with_text/shape_with_text_node_data_model.dart';
8+
import 'package:onix_flutter_bricks/data/model/figma/nodes/sticky/sticky_node_data_model.dart';
9+
import 'package:onix_flutter_bricks/data/model/figma/nodes/table_cell/table_cell_node_data_model.dart';
10+
import 'package:onix_flutter_bricks/data/model/figma/nodes/text/text_node_data_model.dart';
11+
import 'package:onix_flutter_bricks/data/model/figma/nodes/vector/vector_node_data_model.dart';
12+
13+
class FigmaNodeTypeConverter
14+
extends JsonConverter<NodeDataModel, Map<String, dynamic>> {
15+
const FigmaNodeTypeConverter();
16+
17+
@override
18+
NodeDataModel fromJson(Map<String, dynamic> json) {
19+
final type = json['type'];
20+
21+
switch (type) {
22+
case 'DOCUMENT':
23+
return DocumentNodeDataModel.fromJson(json);
24+
case 'FRAME':
25+
case 'COMPONENT':
26+
case 'COMPONENT_SET':
27+
case 'INSTANCE':
28+
case 'GROUP':
29+
return FrameNodeDataModel.fromJson(json);
30+
case 'SECTION':
31+
return SectionNodeDataModel.fromJson(json);
32+
case 'VECTOR':
33+
case 'BOOLEAN_OPERATION':
34+
case 'STAR':
35+
case 'LINE':
36+
case 'ELLIPSE':
37+
case 'REGULAR_POLYGON':
38+
case 'WASHI_TAPE':
39+
case 'RECTANGLE':
40+
return VectorNodeDataModel.fromJson(json);
41+
case 'TEXT':
42+
return TextNodeDataModel.fromJson(json);
43+
case 'TABLE_CELL':
44+
return TableCellNodeDataModel.fromJson(json);
45+
case 'STICKY':
46+
return StickyNodeDataModel.fromJson(json);
47+
case 'SHAPE_WITH_TEXT':
48+
return ShapeWithTextNodeDataModel.fromJson(json);
49+
case 'CONNECTOR':
50+
return ConnectorNodeDataModel.fromJson(json);
51+
default:
52+
return NodeDataModel.fromJson(json);
53+
}
54+
}
55+
56+
@override
57+
Map<String, dynamic> toJson(NodeDataModel object) {
58+
return {};
59+
}
60+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import 'package:json_annotation/json_annotation.dart';
2+
import 'package:onix_flutter_bricks/data/mapper/converter/figma/figma_node_type_converter.dart';
3+
import 'package:onix_flutter_bricks/data/model/figma/nodes/node/node_data_model.dart';
4+
5+
class FigmaNodesConverter
6+
extends JsonConverter<List<NodeDataModel>, Map<String, dynamic>> {
7+
const FigmaNodesConverter();
8+
9+
@override
10+
List<NodeDataModel> fromJson(Map<String, dynamic> json) {
11+
final list = json.values
12+
.map(
13+
(e) => const FigmaNodeTypeConverter().fromJson(
14+
(e as Map<String, dynamic>)['document'],
15+
),
16+
)
17+
.toList();
18+
19+
return list;
20+
}
21+
22+
@override
23+
Map<String, dynamic> toJson(List<NodeDataModel> object) {
24+
throw UnimplementedError();
25+
}
26+
}

lib/data/mapper/figma/figma_file_mapper.dart

Whitespace-only changes.
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
import 'package:onix_flutter_bricks/core/arch/domain/common/converter/mapper.dart';
2+
import 'package:onix_flutter_bricks/data/mapper/figma/paint_property_mapper.dart';
3+
import 'package:onix_flutter_bricks/data/model/figma/nodes/connector/connector_node_data_model.dart';
4+
import 'package:onix_flutter_bricks/data/model/figma/nodes/document/document_node_data_model.dart';
5+
import 'package:onix_flutter_bricks/data/model/figma/nodes/frame/frame_node_data_model.dart';
6+
import 'package:onix_flutter_bricks/data/model/figma/nodes/node/node_data_model.dart';
7+
import 'package:onix_flutter_bricks/data/model/figma/nodes/section/section_node_data_model.dart';
8+
import 'package:onix_flutter_bricks/data/model/figma/nodes/shape_with_text/shape_with_text_node_data_model.dart';
9+
import 'package:onix_flutter_bricks/data/model/figma/nodes/sticky/sticky_node_data_model.dart';
10+
import 'package:onix_flutter_bricks/data/model/figma/nodes/table_cell/table_cell_node_data_model.dart';
11+
import 'package:onix_flutter_bricks/data/model/figma/nodes/text/text_node_data_model.dart';
12+
import 'package:onix_flutter_bricks/data/model/figma/nodes/vector/vector_node_data_model.dart';
13+
import 'package:onix_flutter_bricks/data/model/figma/properties/paint/paint_property_data_model.dart';
14+
import 'package:onix_flutter_bricks/domain/entity/figma/nodes/connector_node/connector_node_entity.dart';
15+
import 'package:onix_flutter_bricks/domain/entity/figma/nodes/document_node/document_node_entity.dart';
16+
import 'package:onix_flutter_bricks/domain/entity/figma/nodes/frame_node/frame_node_entity.dart';
17+
import 'package:onix_flutter_bricks/domain/entity/figma/nodes/node/base_node.dart';
18+
import 'package:onix_flutter_bricks/domain/entity/figma/nodes/node/base_node_entity.dart';
19+
import 'package:onix_flutter_bricks/domain/entity/figma/nodes/section_node/section_node_entity.dart';
20+
import 'package:onix_flutter_bricks/domain/entity/figma/nodes/shape_with_text_node/shape_with_text_node_entity.dart';
21+
import 'package:onix_flutter_bricks/domain/entity/figma/nodes/sticky_node/sticky_node_entity.dart';
22+
import 'package:onix_flutter_bricks/domain/entity/figma/nodes/table_cell_node/table_cell_node_entity.dart';
23+
import 'package:onix_flutter_bricks/domain/entity/figma/nodes/text_node/text_node_entity.dart';
24+
import 'package:onix_flutter_bricks/domain/entity/figma/nodes/vector_node/vector_node_entity.dart';
25+
import 'package:onix_flutter_bricks/domain/entity/figma/properties/paint_property/paint_property.dart';
26+
import 'package:onix_flutter_bricks/domain/entity/figma/properties/type_style/type_style_metadata.dart';
27+
28+
typedef A = ({int a, int b});
29+
30+
class FigmaNodesMapper {
31+
List<BaseNode> mapNodesDataModelToEntity(List<NodeDataModel> from) =>
32+
_MapNodeDataModelToEntity().mapIterable(from).toList();
33+
}
34+
35+
class _MapNodeDataModelToEntity
36+
extends MapperIterable<NodeDataModel, BaseNode> {
37+
@override
38+
BaseNode map(NodeDataModel from) {
39+
switch (from) {
40+
case (DocumentNodeDataModel _):
41+
return DocumentNodeEntity(
42+
id: from.id ?? '',
43+
key: from.key ?? '',
44+
name: from.name ?? '',
45+
type: from.type ?? '',
46+
children: from.children
47+
?.map(
48+
(e) => BaseNodeEntity(
49+
id: e?.id ?? '',
50+
key: e?.key ?? '',
51+
name: e?.name ?? '',
52+
type: e?.type ?? '',
53+
),
54+
)
55+
.toList() ??
56+
[],
57+
);
58+
case TextNodeDataModel _:
59+
return TextNodeEntity(
60+
id: from.id ?? '',
61+
key: from.key ?? '',
62+
name: from.name ?? '',
63+
type: from.type ?? '',
64+
fills: _mapPaintProperty(from.fills),
65+
style: TypeStyleMetadata(
66+
fontFamily: from.style?.fontFamily ?? '',
67+
fontWeight: from.style?.fontWeight ?? 0,
68+
fontSize: from.style?.fontSize ?? 0,
69+
letterSpacing: from.style?.letterSpacing ?? 0,
70+
),
71+
);
72+
case FrameNodeDataModel _:
73+
return FrameNodeEntity(
74+
id: from.id ?? '',
75+
key: from.key ?? '',
76+
name: from.name ?? '',
77+
type: from.type ?? '',
78+
fills: _mapPaintProperty(from.fills),
79+
);
80+
case SectionNodeDataModel _:
81+
return SectionNodeEntity(
82+
id: from.id ?? '',
83+
key: from.key ?? '',
84+
name: from.name ?? '',
85+
type: from.type ?? '',
86+
fills: _mapPaintProperty(from.fills),
87+
);
88+
case VectorNodeDataModel _:
89+
return VectorNodeEntity(
90+
id: from.id ?? '',
91+
key: from.key ?? '',
92+
name: from.name ?? '',
93+
type: from.type ?? '',
94+
fills: _mapPaintProperty(from.fills),
95+
);
96+
case TableCellNodeDataModel _:
97+
return TableCellNodeEntity(
98+
id: from.id ?? '',
99+
key: from.key ?? '',
100+
name: from.name ?? '',
101+
type: from.type ?? '',
102+
fills: _mapPaintProperty(from.fills),
103+
);
104+
105+
case StickyNodeDataModel _:
106+
return StickyNodeEntity(
107+
id: from.id ?? '',
108+
key: from.key ?? '',
109+
name: from.name ?? '',
110+
type: from.type ?? '',
111+
fills: _mapPaintProperty(from.fills),
112+
);
113+
114+
case ShapeWithTextNodeDataModel _:
115+
return ShapeWithTextNodeEntity(
116+
id: from.id ?? '',
117+
key: from.key ?? '',
118+
name: from.name ?? '',
119+
type: from.type ?? '',
120+
fills: _mapPaintProperty(from.fills),
121+
);
122+
case ConnectorNodeDataModel _:
123+
return ConnectorNodeEntity(
124+
id: from.id ?? '',
125+
key: from.key ?? '',
126+
name: from.name ?? '',
127+
type: from.type ?? '',
128+
fills: _mapPaintProperty(from.fills),
129+
);
130+
default:
131+
return BaseNodeEntity(
132+
id: from.id ?? '',
133+
key: from.key ?? '',
134+
name: from.name ?? '',
135+
type: from.type ?? '',
136+
);
137+
}
138+
}
139+
140+
List<PaintProperty> _mapPaintProperty(List<PaintPropertyDataModel>? from) =>
141+
PaintPropertyMapper()
142+
.mapPaintPropertyDataModelToEntity(from ?? [])
143+
.toList();
144+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import 'package:onix_flutter_bricks/core/arch/domain/common/converter/mapper.dart';
2+
import 'package:onix_flutter_bricks/data/model/figma/styles/figma_node_style.dart';
3+
import 'package:onix_flutter_bricks/domain/entity/figma/properties/node_style_property/node_style_property.dart';
4+
5+
class NodeStyleMapper {
6+
NodeStyleProperty mapNodeStyleDataModelToEntity(FigmaNodeStyle from) =>
7+
_MapNodeStyleDataModelToEntity().map(from);
8+
}
9+
10+
class _MapNodeStyleDataModelToEntity
11+
extends Mapper<FigmaNodeStyle, NodeStyleProperty> {
12+
@override
13+
NodeStyleProperty map(FigmaNodeStyle from) {
14+
return NodeStyleProperty(
15+
key: from.nodeId ?? '',
16+
name: from.name ?? '',
17+
description: '',
18+
style: NodeStyleType.fromRawString(
19+
from.styleType ?? '',
20+
),
21+
);
22+
}
23+
}

0 commit comments

Comments
 (0)